我在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
主机上执行第二个角色?
答案 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
module和refresh_inventory
参数强制Ansible重新读取广告资源文件:
- meta: refresh_inventory