0

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

- 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' 主机上设置环境变量,例如用户/组目录。我尝试按顺序运行角色(参见下面的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。

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

4

1 回答 1

2

库存文件不会在播放之间自动重新获取资源。

不要修改清单文件,而是使用add_host模块和内存中的清单

- 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模块refresh_inventory来强制 Ansible 重新读取清单文件:

- meta: refresh_inventory
于 2017-02-20T04:40:52.640 回答