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

Ubuntu 如何检测Ansible playbook在执行期间挂起的原因,ubuntu,deployment,ansible,ansible-playbook,provisioning,Ubuntu,Deployment,Ansible,Ansible Playbook,Provisioning,我写的一些任务从开始到结束。Ansible不提供任何错误或日志来解释这一点,即使使用-vv选项也是如此。剧本挂了,时间的流逝不会改变任何事情 当我尝试手动运行任务时(通过SSH输入命令),一切都很好 挂起的任务示例: - name: apt upgrade shell: apt-get upgrade 有没有办法看到stdout和stderr?我试过: - name: apt upgrade shell: apt-get upgrade register: hello - debu

我写的一些任务从开始到结束。Ansible不提供任何错误或日志来解释这一点,即使使用-vv选项也是如此。剧本挂了,时间的流逝不会改变任何事情

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

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

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

- name: update packages full into each server
  apt: upgrade=full
  ignore_errors: True
  async: 60
  poll: 60
它就像一个符咒!我真的不知道发生了什么,但现在似乎应该记住发生了什么,不要再僵硬了


希望它有帮助

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

[ssh_connection]

ssh_args = -o ServerAliveInterval=n

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

我也遇到了同样的问题,经过一番努力后,我发现问题出在收集事实的步骤中。下面是一些更好地解决类似问题的技巧

在剧本中禁用事实收集:

---
- hosts: myservers
  gather_facts: no
..
重新运行剧本。如果它起作用,那么就意味着罪魁祸首不在SSH本身,而是在收集事实的脚本中。我们可以很容易地调试这个问题

  • SSH连接到远程框
  • .ansible
    文件夹中的某个位置找到
    设置
    文件
  • 使用
    /setup
    python-B setup
  • 如果它挂起,那么我们肯定知道问题就在这里。要想找到真正使它挂起的原因,只需用编辑器打开文件,然后添加
    print
    语句,主要是
    populate()
    方法
    Facts
    。重新运行脚本并查看它运行了多长时间


    对我来说,问题似乎是试图在第
    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
    )到我试图在AWS中构建的另一个Debian映像

    在这里的许多建议对我不起作用之后,我对SSH“共享”连接产生了怀疑。我转到我的
    ansible.cfg
    找到
    ssh_args
    行并设置
    ControlMaster=no
    。这可能会执行得很慢,因为我已经失去了应该提供的SSH性能提升,但这似乎与导致问题的
    apt get
    之间存在一些交互作用


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

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

    ssh-keygen -p
    
    在我的例子中,ansible被“永远绞死”,因为apt get试图问我一个问题!我怎么知道的?我去了目标服务器并运行了
    ps-aef | grep apt
    ,然后对相应的“卡住的”
    apt get
    命令执行了
    kill

    在我这样做之后,我的ansible playbook立即恢复了活力,并报告(给出了
    ansible playbook-vvv
    选项):

    在阅读了有用的诊断输出后,我立即意识到我需要一些合适的dpkg选项(例如,请参阅)。就我而言,我选择了:

    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
    

    你通过了-K选项吗?是的。但是我的问题在这里解决了,好的,酷。仅供参考,您应该添加解决方案作为答案并自己接受..这将有助于其他人查看此问题。以下修复了我的问题:[ssh\u连接]\n ssh\u args=-o ServerAliveInterval=30-o ControlMaster=auto-o ControlPersist=60sA小注释。ServerAliveInterval=100本身会降低ansible任务的执行速度。您必须将它与ControlMaster=auto-o ControlPersist=10M结合使用,如果my.ansible目录没有安装文件,只有一个也为空的./tmp目录,该怎么办?现在的情况是,不要坐在那里等待命令(并在ssh连接上超时),ansible将检查该命令—在本例中,每60秒检查一次,最多检查60秒(换句话说,一次)。这回避了ssh超时的问题?打得好,先生。
    sudo dpkg --configure -a