在Ansible / AWS

时间:2017-02-20 03:59:52

标签: amazon-web-services amazon-ec2 ansible ansible-inventory

我在Ansible写了两个角色。第一个角色(即provision)在具有所需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 playbook):

- 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主机上执行第二个角色?

1 个答案:

答案 0 :(得分:1)

广告文件不会在播放之间自动重新提供。

使用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重新读取广告资源文件:

- meta: refresh_inventory