1

我們使用ansible將多個節點配置爲一個集羣。這些機器是在定製的AWS類似基礎設施上創建的實例。 我們在不同的劇本上有大約100個任務,並且它們在每個節點上執行。Ansible **零星**失敗,無法訪問主機 - 無法通過ssh連接到主機

TASK [common : install basic packages] ************************* 
fatal: [fqdn.for.a.node]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh.", "unreachable": true} 

輸出與-vvv:

的問題是,我們得到了零星的主機不可達的錯誤和劇本的執行與以下故障停止

TASK [common : install basic packages] ******************************* 
task path: /jenkins/workspace/Cluster-Deployment/91/roles/common/tasks/install-basic-packages.yml:1 
<fqdn.for.a.node> ESTABLISH SSH CONNECTION FOR USER: root 
<fqdn.for.a.node> SSH: EXEC ssh -C -q -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o 'IdentityFile="id_rsa"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=root -o ConnectTimeout=600 -o ControlPath=/home/turkenh/.ansible/cp/ansible-ssh-%h-%p-%r fqdn.for.a.node '/bin/sh -c '"'"'(umask 77 && mkdir -p "` echo $HOME/.ansible/tmp/ansible-tmp-1466523588.96-210828884892875 `" && echo ansible-tmp-1466523588.96-210828884892875="` echo $HOME/.ansible/tmp/ansible-tmp-1466523588.96-210828884892875 `") && sleep 0'"'"'' 
failed: [fqdn.for.a.node] (item=[u'unzip']) => {"item": ["unzip"], "msg": "Failed to connect to the host via ssh.", "unreachable": true} 

這是我們ansible.cfg文件:

[defaults] 
forks = 50 
sudo_flags=-i 
nocows=1 

# do not check host key while doing ssh 
host_key_checking = False 
# use openssh not paramiko 
transport = ssh 
private_key_file = id_rsa 
remote_user = root 

請看我們下面的注意事項:

  • 當我們嘗試ping(與ansible平模塊,無法ping通shell命令),該主機與失敗後ansible正確的,它會引發同樣的錯誤,但是如果我們等待大約一分鐘左右,就可以ping它。

  • 我們可以說我們定製的基於AWS的基礎架構是,在某種程度上,可能會偶爾出現一些零星的連接問題,這不會比1-2分鐘更長的時間。

  • 嘗試設置超時參數爲ansible.cfg中的大數字(即600),但它沒有幫助。

  • 我們正在調配節點ubuntu,redhat和suse,但無論操作系統如何,我們都會以20%的概率獲得此錯誤。

  • 在我的劇本中,它並不是相同或相似的任務,它在失敗時只是隨機失敗。 (有時在設置模塊,有時在封裝模塊,...)

  • 我們ansible版本是2.1(PIP與安裝),工作站的操作系統是Ubuntu的14.04

那麼,我們需要什麼對某個人來說,如果你看到一個節點無法到達,請不要放棄失敗。在放棄無法訪問之前,請等待一段時間或重試n次。我們應該怎麼做?

+1

如果在啓動新服務器的過程中發生這種情況,請考慮使用'wait_for'。我們在啓動新的雲服務器之後使用它來等待ssh變得可用,然後繼續處理這些新服務器的任務。 –

+0

實際上,我已經有一個wait_for任務,它在創建AWS實例後立即運行,並等待ssh準備就緒。我在後面的步驟中遇到了這個問題,即在安裝了一些軟件包/啓動一些服務之後等等。正如我上面提到的,失敗的任務在不同的運行中不相同。但是,我可能會考慮向每個等待ssh的角色添加一個pre_任務,因爲問題似乎發生在角色轉換之間。謝謝! – turkenh

回答

2

正式回答您的問題:您可以使用ansible_ssh_common_args="-o ConnectionAttempts=20"增加庫存文件中的ssh嘗試次數。將其指定爲問題主機,主機組或all虛擬組(例如,在group_vars/all.yml文件中)。

還有ssh_args配置選項,但我不想修改它,因爲它會覆蓋有效的默認ssh參數。

+0

等待是兩次嘗試之間的超時時間?即如果它是1秒而不是越來越多的嘗試可能沒有意義。我們是否也可以用ansible_ssh_common_args增加它? – turkenh

+0

1秒鐘,根據手冊頁。 –

相關問題