在 Ansible/AWS 中本地和远程执行角色

Executing roles locally and remotely in Ansible/AWS

我用Ansible写过两个角色。第一个角色(即提供)在具有配置 EC2 实例所需的 IAM 的实例上本地执行(见下文):

- name: Provison "{{ count }}" ec2 instances in "{{ region }}"
  ec2:
     key_name: "{{ key_name }}"
     instance_type: "{{ instance_type }}"
     image: "{{ image }}"
 ...
     exact_count: "{{ count }}"
     count_tag: "{{ count_tag }}"
     instance_tags:
 ...
  register: ec2

然后我将私有 IP 地址添加到主机。

- name: Add the newly created EC2 instances to the local host file
  local_action: lineinfile
                dest="./hosts"
                regexp={{ item.private_ip }}
                insertafter="[sit]" line={{ item.private_ip }}
  with_items: "{{ ec2.instances }}"

我等待 SSH 可用。

- name: Wait for SSH process to be available on "{{ sit }}"
  wait_for:
    host: "{{ item.private_ip }}"
    port: 22
    delay: 60
    timeout: 320
    state: started
  with_items: "{{ ec2.instances }}"

第二个角色(即 setupEnv)在 'sit' 主机上设置环境变量,例如 users/group 目录。我尝试按顺序 运行 角色(见下文 main.yml 剧本):

- hosts: local
  roles:
  connection: local
  gather_facts: false
  user: svc_ansible_lab
  roles:
  - provision

- hosts: sit
  roles:
  connection: ssh
  gather_facts: true
  user: ec2-user
  roles:
  - setupEnv

但是,只有第一个角色在本地主机上执行。 Ansible 一直等到 SSH 在配置的实例上可用,然后该过程在没有尝试角色 setupEnv 的情况下完成。

有没有办法确保在 SSH 可用后在 sit 主机上执行第二个角色?

库存文件不会在播放之间自动re-sourced。

不修改库存文件,而是使用 add_host module and in-memory inventory

- name: Add the newly created EC2 instances to the in-memory inventory
  add_host:
    hostname: "{{ item.private_ip }}"
    groups: sit
  with_items: "{{ ec2.instances }}"

或者,您可以使用 meta modulerefresh_inventory 参数来强制 Ansible re-read 清单文件:

- meta: refresh_inventory