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'"
}
爲什麼寄存器變量(結果在我的情況),是不是有stdout
或rc
字典/變量時,文檔中說,那些存在,或者,如果我能在-vvv
詳細輸出上看到他們一個操作系統,但它不顯示在其他操作系統?
謝謝,但我的問題是有效的。感謝您的回覆。 –
我想我發現了這個問題。爲了縮小結果變量的範圍,我使用了'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'。這就是答案,但我需要更多的測試來證明這一點。 –
在Ubuntu中,result.stdout只有在動作成功時才會設置,對於失敗的動作,結果沒有.stdout dict設置,所以我需要尋找別的東西。在CentOS中,如果成功,我會獲取stdout和rc,但如果由於某種原因導致操作失敗,則只會將狀態1設置爲'rc'字典。 –