簡體   English   中英

如何檢測為什么 Ansible 劇本在執行期間掛起

[英]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秒向服務器發送一次空包以避免連接超時。

我在使用劇本時遇到了同樣的問題。

它運行得很完美,直到某個時候停止,所以我添加了asyncpoll參數來避免這種行為

- name: update packages full into each server
  apt: upgrade=full
  ignore_errors: True
  async: 60
  poll: 60

它就像一個魅力! 我真的不知道發生了什么,但現在 Ansible 記住發生了什么,不要再凍結了!

希望它有幫助

我遇到了同樣的問題,經過一番擺弄后,我發現問題出在收集事實的步驟中。 這里有一些技巧可以更好地解決任何類似的問題。

在你的劇本中禁用事實收集:

---
- hosts: myservers
  gather_facts: no
..

重新運行劇本。 如果它有效,那么這意味着罪魁禍首不在 SSH 本身,而是在收集事實的腳本中。 我們可以很容易地調試這個問題。

  1. SSH 到遠程盒子
  2. .ansible文件夾中的某處找到setup文件。
  3. 使用./setuppython -B setup運行它

如果它掛起,那么我們肯定知道問題出在這里。 要准確找到導致它掛起的原因,您只需使用編輯器打開文件並主要在Factspopulate()方法中添加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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM