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