2016-08-22 19 views
2

我正在通過Terraform供應新服務器,並將Ansible作爲本地系統上的供應商。Ansible wait_for似乎不起作用

Terraform爲EC2提供了一個系統,然後運行Ansible playbook,提供新建系統的IP作爲庫存。

我想使用Ansible等待系統完成引導,並阻止嘗試進一步的任務直到建立連接。直到這一點,我一直在使用不方便和不精確的手動暫停。

Ansible似乎沒有做文件說明它會(除非我錯了,一個非常可能的場景)。這裏是我的代碼:

- name: waiting for server to be alive 
    wait_for: 
     state: started 
     port: 22 
     host: "{{ ansible_ssh_host | default(inventory_hostname) }}" 
     delay: 10 
     timeout: 300 
     connect_timeout: 300 
     search_regex: OpenSSH 
    delegate_to: localhost 

在此步驟中會發生什麼事是連接不等待任何超過10秒進行連接,它失敗。如果服務器已啓動,並且我再次嘗試操作手冊,它可以正常工作並按預期執行。

我也試過do_until風格循環似乎從來沒有工作。文檔中給出的所有示例都使用shell輸出,我不認爲它可以用於非shell模塊。

我也似乎無法得到任何調試信息,如果我嘗試註冊一個結果並使用調試模塊打印出來。

任何人有什麼建議,我做錯了什麼?

回答

1

當您使用delegate_tolocal_action模塊,{{ ansible_ssh_host }}解析爲localhost,讓你的任務總是用下面的參數運行:

host: localhost 

它等待10秒,檢查SSH連接到本地主機和收益(因爲它很可能是開放的)。


如果使用gather_facts: false(我認爲你這樣做),你可以前添加set_fact任務,向目標主機名的值存儲在一個變量:

- set_fact: 
    host_to_wait_for: "{{ ansible_ssh_host | default(inventory_hostname) }}" 

並更改行:

host: "{{ host_to_wait_for }}" 

您可以用下面的劇本驗證試驗的變量:

--- 
- hosts: all 
    gather_facts: false 
    tasks: 
    - set_fact: 
     host_to_wait_for: "{{ ansible_ssh_host | default(inventory_hostname) }}" 
    - debug: msg="ansible_ssh_host={{ ansible_ssh_host }}, inventory_hostname={{ inventory_hostname }}, host_to_wait_for={{ host_to_wait_for }}" 
     delegate_to: localhost 

或者你可以嘗試找到一種方法來提供EC2實例的IP地址Ansible作爲變量,並把它作爲host:參數的值。例如,您從CLI運行Ansible,然後將${aws_instance.example.public_ip}傳遞給--extra-vars參數。

+0

對不起,我回滾到原來的版本。當然,我建議的作品,我之前測試過,並且在您的評論後感到困惑,因爲我重新運行了「gather_facts」功能,並且它甚至沒有關閉主機。 (同時請清理你的意見) – techraf

+0

'set_fact'然後在本地機器上運行嗎? – smiller171

+0

運行我附帶的劇本並親自體驗。爲什麼Ansible會在遠程機器上調用Python來爲變量設置一個值? – techraf

0

正如techraf指出的,您的庫存查找實際上是由於委派而抓取本地主機地址,因此它不會針對正確的機器運行。

我認爲你最好的解決方案可能是讓terraform將變量傳遞給包含實例IP地址的劇本。例如:

terraform通過-e "new_ec2_host=<IP_ADDR>"

Ansible任務:

- name: waiting for server to be alive 
    wait_for: 
     state: started 
     port: 22 
     host: "{{ new_ec2_host }}" 
     delay: 10 
     timeout: 300 
     connect_timeout: 300 
     search_regex: OpenSSH 
    delegate_to: localhost