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

  发布于 2023-02-07 20:28

我写的一些任务开始并且永远不会结束.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正确执行的任务.

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

    禁用剧本中的事实收集:

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

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

      SSH到远程框

      setup文件.ansible夹中的某处找到该文件.

      ./setup或运行它python -B setup

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

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

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

    [ssh_connection]
    
    ssh_args = -o ServerAliveInterval=n
    

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

    2023-02-07 20:33 回答
  • 我在剧本中遇到了同样的问题.

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

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

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

    希望能帮助到你

    2023-02-07 20:33 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有