如何检测Ansible playbook在执行期间挂起的原因

dev*_*ev9 42 deployment ubuntu provisioning ansible ansible-playbook

我写的一些任务开始并且永远不会结束.Ansible不提供任何可以解释这一点的错误或日志,即使使用-vvvv选项也是如此.Playbook只是挂起,过了几个小时不会改变任何东西.

当我尝试手动运行我的任务时(通过SSH输入命令)一切都很好.

挂起的示例任务:

- name: apt upgrade
  shell: apt-get upgrade
Run Code Online (Sandbox Code Playgroud)

有没有办法看到stdout和stderr?我试过了:

- name: apt upgrade
  shell: apt-get upgrade
  register: hello
- debug: msg="{{ hello.stdout }}"
- debug: msg="{{ hello.stderr }}"
Run Code Online (Sandbox Code Playgroud)

但没有改变.

我确实有必要的权限,我传递了正确的sudo密码 - 其他需要sudo正确执行的任务.

Rub*_*dob 8

我在剧本中遇到了同样的问题.

它完美运行直到某个点然后停止,所以我添加了异步轮询参数以避免这种行为

- name: update packages full into each server
  apt: upgrade=full
  ignore_errors: True
  async: 60
  poll: 60
Run Code Online (Sandbox Code Playgroud)

它就像一个魅力!我真的不知道发生了什么,但现在似乎Ansible记住发生了什么,不要再冻结了!

希望能帮助到你

  • 正在发生的事情是,ansible 不会等待命令(并在 ssh 连接上超时),而是会检查命令 - 在这种情况下,每 60 秒到最多 60 秒(换句话说,一次)。这回避了 ssh 超时的问题。 (4认同)

Abh*_*jit 7

最可能的问题原因是SSH连接.当任务需要较长的执行时间SSH超时时.我曾经遇到过这样的问题,为了克服SSH超时问题,在运行Ansible的当前目录中创建一个ansible.cfg,添加以下内容:

[ssh_connection]

ssh_args = -o ServerAliveInterval=n
Run Code Online (Sandbox Code Playgroud)

n我们在通过SSH连接到服务器时使用的ServerAliveInterval(秒)在哪里.设置在1-255之间.这将导致ssh客户端每秒向服务器发送空数据包n以避免连接超时.

  • 以下修复了我的困境:[ssh_connection] \n ssh_args = -o ServerAliveInterval = 30 -o ControlMaster = auto -o ControlPersist = 60s (5认同)
  • 小记.ServerAliveInterval = 100本身会减慢执行ansible任务的速度.你必须将它与ControlMaster = auto -o ControlPersist = 10m结合起来 (2认同)

Pit*_*kos 7

我有同样的问题,经过一番摆弄后,我发现问题在于收集事实.以下是一些可以更好地解决任何类似问题的提示.

禁用剧本中的事实收集:

---
- hosts: myservers
  gather_facts: no
..
Run Code Online (Sandbox Code Playgroud)

重新播放剧本.如果它有效,则意味着罪魁祸首不在SSH本身,而是在收集事实的脚本中.我们可以很容易地调试这个问题.

  1. SSH到远程框
  2. setup文件.ansible夹中的某处找到该文件.
  3. ./setup或运行它python -B setup

如果它挂起,那么我们知道问题就在这里.要准确地找到使它挂起的原因,您只需使用编辑器打开文件并print主要在populate()方法中添加语句Facts.重新运行脚本,看看它有多长.

对我来说,问题似乎是尝试在线解析主机名,self.facts['fqdn'] = socket.getfqdn()并通过谷歌搜索结果证明是解决远程主机名的问题.

  • 如果我的 .ansible 目录没有安装文件,只有一个也是空的 ./tmp 目录怎么办? (2认同)

Ogr*_*m33 6

就我而言,ansible“永远挂起”,因为 apt-get 试图问我一个问题!我是怎么想到这一点的?我转到目标服务器并运行ps -aef | grep apt,然后执行kill适当的“卡住”apt-get命令。

在我这样做之后,我的 Ansible 剧本立即恢复并报告(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] ? "
Run Code Online (Sandbox Code Playgroud)

在阅读了有用的诊断输出后,我立即意识到我需要一些适当的 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 }}'
Run Code Online (Sandbox Code Playgroud)

另外,不要忘记在杀死 ansible 会话后用类似的东西进行清理,否则你的安装仍然可能会失败:

sudo dpkg --configure -a
Run Code Online (Sandbox Code Playgroud)