[英]How to detect why Ansible playbook hangs during execution
我寫的一些任務有始有終。 Ansible 沒有提供任何可以解釋這一點的錯誤或日志,即使使用 -vvvv 選項也是如此。 劇本只是掛起,過去的時間不會改變任何東西。
當我嘗試手動運行我的任務(通過 SSH 輸入命令)時,一切都很好。
掛起的示例任務:
- name: apt upgrade
shell: apt-get upgrade
有什么辦法可以查看 stdout 和 stderr? 我試過了:
- name: apt upgrade
shell: apt-get upgrade
register: hello
- debug: msg="{{ hello.stdout }}"
- debug: msg="{{ hello.stderr }}"
但沒有任何改變。
我確實擁有所需的權限,並且我傳遞了正確的 sudo 密碼 - 其他需要 sudo 的任務才能正確執行。
問題的最可能原因是 SSH 連接。 當一個任務需要很長的執行時間時 SSH 超時。 我曾經遇到過這樣的問題,為了克服 SSH 超時的問題,在運行 Ansible 的當前目錄中創建一個ansible.cfg ,添加以下內容:
[ssh_connection]
ssh_args = -o ServerAliveInterval=n
其中n
是我們通過 SSH 連接到服務器時使用的 ServerAliveInterval(秒)。 將其設置在 1-255 之間。 這將導致 ssh 客戶端每n
秒向服務器發送一次空包以避免連接超時。
我在使用劇本時遇到了同樣的問題。
它運行得很完美,直到某個時候停止,所以我添加了async和poll參數來避免這種行為
- name: update packages full into each server
apt: upgrade=full
ignore_errors: True
async: 60
poll: 60
它就像一個魅力! 我真的不知道發生了什么,但現在 Ansible 記住發生了什么,不要再凍結了!
希望它有幫助
我遇到了同樣的問題,經過一番擺弄后,我發現問題出在收集事實的步驟中。 這里有一些技巧可以更好地解決任何類似的問題。
在你的劇本中禁用事實收集:
---
- hosts: myservers
gather_facts: no
..
重新運行劇本。 如果它有效,那么這意味着罪魁禍首不在 SSH 本身,而是在收集事實的腳本中。 我們可以很容易地調試這個問題。
.ansible
文件夾中的某處找到setup
文件。./setup
或python -B setup
運行它如果它掛起,那么我們肯定知道問題出在這里。 要准確找到導致它掛起的原因,您只需使用編輯器打開文件並主要在Facts
的populate()
方法中添加print
語句。 重新運行腳本,看看它運行了多長時間。
對我來說,問題似乎是試圖在self.facts['fqdn'] = socket.getfqdn()
行解析主機名,經過一些谷歌搜索,結果證明是解析遠程主機名的問題。
對我來說完全不同的解決方法。 我從 Debian Jessie ( Linux PwC-Deb64 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt25-2+deb8u3 (2016-07-02) x86_64 GNU/Linux
) 到另一個 Debian 映像我有這個嘗試在 AWS 中構建。
在此處的許多建議對我不起作用之后,我對 SSH“共享”連接產生了懷疑。 我去了我的ansible.cfg
並找到了ssh_args
行並設置ControlMaster=no
。 這現在可能執行緩慢,因為我已經失去了它應該提供的 SSH 性能提升,但似乎這和apt-get
之間存在一些導致問題的交互。
你ansible.cfg
可以在您運行目錄ansible
從,或/etc/ansible
。 如果是后者,您可能希望在開始更改之前將其復制到本地目錄中!
就我而言,ansible 是“永遠掛起”,因為 apt-get 試圖問我一個問題! 我是怎么想出來的? 我去了目標服務器並運行ps -aef | grep apt
ps -aef | grep apt
然后對適當的“卡住” apt-get
命令進行了kill
。
在我這樣做之后,我的 ansible playbook 立即恢復生機並報告(給出了ansible-playbook -vvv
選項):
" ==> Deleted (by you or by a script) since installation.",
" ==> Package distributor has shipped an updated version.",
" What would you like to do about it ? Your options are:",
" Y or I : install the package maintainer's version",
" N or O : keep your currently-installed version",
" D : show the differences between the versions",
" Z : start a shell to examine the situation",
" The default action is to keep your current version.",
"*** buildinfo.txt (Y/I/N/O/D/Z) [default=N] ? "
在閱讀了有用的診斷輸出后,我立即意識到我需要一些合適的 dpkg 選項(例如,參見這篇 devops 帖子)。 就我而言,我選擇了:
apt:
name: '{{ item }}'
state: latest
update_cache: yes
# Force apt to always update to the newer config files in the package:
dpkg_options: 'force-overwrite,force-confnew'
loop: '{{ my_packages }}'
另外,不要忘記在使用類似這樣的東西殺死 ansible 會話后進行清理,否則您的安裝仍然可能會失敗:
sudo dpkg --configure -a
刪除我的 SSH 密鑰的密碼為我修復了它,例如:
ssh-keygen -p
我正在使用 ansible 在 Ubuntu 20.4 虛擬機上安裝一個 OpenDayLight SDN 控制器集群。 搜集資料報了python版本警告掛了。 在我的 3 個 VM 工作節點上安裝 python 3.8 解決了這個問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.