0

我已经用Ansible编写了两个角色。第一个角色(即规定)上具有所需的综合评估,以提供EC2实例的实例本地执行(见下文):在Ansible/AWS中本地和远程执行角色

- 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)设置在“坐”宿主如用户/组的目录的环境变量。我尝试按顺序运行中的作用(见下文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。

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

回答

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 
+0

啊!谢谢。我认为这是与内存相关的,因为我运行脚本两次,第一个安装实例使用我给他们的参数设置。但我不知道如何将主机添加到内存中。这就是说add_host不会更改磁盘上的我的清单。我仍然应该使用* lineinfile *中止我的主机文件? – SSF