2016-12-28 66 views
0

ansible/ansible-劇本版本:2.1.2.0/2.2.0.0Ansible寄存器結果result.stdout result.rc等字典變量未找到,如何使用,直到循環

我嘗試使用安裝包yum/apt,但由於安裝軟件包的倉庫位於packagecloud.io中,有時我收到一條錯誤消息(當我在運行我的ansible-playbook時通過-vvv)。

[Errno 14] curl#56 - \"TCP connection reset by peer\"\nTrying other mirror. ...some ansible verbose text here.. [Errno 256] No more mirrors to try. 

這不會一直髮生。如果我再次重新運行相同的劇本,它會正常工作,所以失敗(連接重置)隨機出現。

爲了解決這個問題,我想使用Ansible的until循環,我們必須使用這個循環的register變量。

所以,我參照Ansible文檔如何使用until循環here,但使用的是語法,我得到一個「字典」的錯誤說法導致變量來創建這個劇本的行動(註冊)字典沒有任何按鍵命名爲stdout。然後我試圖使用result.rc(鍵字段)和它的工作CentOS的機器上,但沒有一個Ubuntu 14.x值得信賴的流浪漢機上,使用下列result.rc字典中不存在錯誤:

- name: Install telegraf agent/collector (RedHat) 
    yum: 
    name: "{{ agent_collector }}" 
    state: "installed" 
    when: (ansible_os_family == 'RedHat' and company_install_collector == true) 
    register: result 
    until: result.stdout.find("Installed:") != -1 
    #The following works in CentOS/RedHat 
    #until: result.rc == 0 

- debug: msg="result (redhat) = {{ result }}" 

OR(更新我的問題這是顯而易見的)

- name: Install Company Proxy (Ubuntu) 
    apt: 
    name: "{{ company_proxy_pkg }}" 
    state: "installed" 
    when: (ansible_distribution == 'Ubuntu' and company_install_proxy == true) 
    register: result 
    until: result.rc == 0 

- debug: msg="result (ubuntu) = {{ result }}" 

收到以下錯誤消息(result.stdout - 字典對象有沒有屬性'兩個紅帽/ CentOS的和Ubuntu,但得到的dict對象有沒有屬性'RC標準輸出'only only in Ubuntu server):

fatal: [localhost]: FAILED! => {"failed": true, "msg": "The conditional check '(result.stdout.find(\"Installed:\") != -1)' failed. The error was: error while evaluating conditional ((result.stdout.find(\"Installed:\") != -1)): 'dict object' has no attribute 'stdout'"} 

fatal: [localhost]: FAILED! => { 
    "failed": true, 
    "msg": "The conditional check 'result.rc == 0' failed. The error was: error while evaluating conditional (result.rc == 0): 'dict object' has no attribute 'rc'" 
} 

爲什麼寄存器變量(結果在我的情況),是不是有stdoutrc字典/變量時,文檔中說,那些存在,或者,如果我能在-vvv詳細輸出上看到他們一個操作系統,但它不顯示在其他操作系統?

+0

謝謝,但我的問題是有效的。感謝您的回覆。 –

+0

我想我發現了這個問題。爲了縮小結果變量的範圍,我使用了'ignore_errors:yes',在下一個'debug'語句中,我得到了結果變量的所有輸出。問題是這個。在Ubuntu中,沒有result.rc但是result.stdout在那裏,所以我可以使用'until'和result.stdout.find(「... text to search」)== 0或者像這樣。在RedHat中,至少在我使用的ansible版本中,沒有result.stdout,所以我不能使用上面的語句,所以我必須使用'until:result.rc == 0'。這就是答案,但我需要更多的測試來證明這一點。 –

+0

在Ubuntu中,result.stdout只有在動作成功時才​​會設置,對於失敗的動作,結果沒有.stdout dict設置,所以我需要尋找別的東西。在CentOS中,如果成功,我會獲取stdout和rc,但如果由於某種原因導致操作失敗,則只會將狀態1設置爲'rc'字典。 –

回答

1

正確答案和結論:

  1. 在CentOS的,如果操作成功,如果註冊的變量結果設置,則用戶可以看到前這些字典變量:結果。 rc爲0,result.stdout =「something \ nsomethingEsle \ netc etc etc」和/或result.stdout_lines =「...與上面相同...」和result.results在某些情況下。如果操作失敗,那麼我看不到result.stdout會因爲使用yum模塊而導致設置失敗,原因是connection reset或其他原因。在這種情況下,唯一可用於失敗操作的字典變量爲result.rc!= 0.因此,在until循環中,until: result.rc == 0條件適用於CentOS的成功/失敗情況。

  2. 在Ubuntu中,如果apt模塊行動是成功的,我設置result.stdout和result.stdout_lines變量,但沒有result.rc字典變量集。對於失敗的操作,沒有result.stdout或result.stdout_lines或結果。rc字典變量集。所以,在Ubuntu的情況下,我無法使用until循環使用這些字典變量之一。

唯一的解決辦法我能想到的是,包裹在腳本中apt-get install <pacakge>和使用,直到BASH等循環做什麼Ansible在做什麼。至少,這將更容易編碼,如果退出代碼不是0,那麼我可以使用until

但是,我終於找到了解決辦法,這在Ubuntu的兩個成功的作品和失敗的案例:

Jinja2的過濾器可以幫助即when: result|failed因此,如果我要使用已註冊的變量result對於失敗的條件,然後用until使用,我將使用它(的失敗狀態相反),即是:

until: result|succeeded 

的好處是,上述聲明之前將兩者的CentOS和Ubuntu和兩個更迭工作有罪/失敗的國家。

相關問題