首页 文章

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

提问于
浏览
38

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

当我尝试手动运行我的任务时(通过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正确执行的任务 .

5 回答

  • 8

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

    [ssh_connection]
    
    ssh_args = -o ServerAliveInterval=n
    

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

  • 3

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

    禁用剧本中的事实收集:

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

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

    • SSH到远程控制台

    • .ansible 文件夹中找到 setup 文件 .

    • 使用 ./setuppython -B setup 运行它

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

    对我来说,问题似乎是试图在 self.facts['fqdn'] = socket.getfqdn() 行解决主机名,并通过谷歌搜索,结果证明是resolving the remote hostname的问题 .

  • 1

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

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

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

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

    希望能帮助到你

  • 8

    对我来说完全不同的解决方法 . 我从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 )到我试图在AWS中构建的另一个Debian图像 .

    在这里的许多建议对我不起作用之后,我对SSH "shared"连接产生了怀疑 . 我去了 ansible.cfg 并找到了 ssh_args 行并设置了 ControlMaster=no . 这可能现在执行缓慢,因为我已经失去了应该给出的SSH性能提升,但似乎这和 apt-get 之间存在一些导致问题的交互 .

    您的 ansible.cfg 可能位于您运行的目录 ansible/etc/ansible 中 . 如果是后者,您可能希望在开始更改之前将其复制到本地目录中!

  • 8

    删除我的SSH密码的密码为我修复了它,例如:

    ssh-keygen -p
    

相关问题