Ansible任务为什么会长时间停滞?

47次阅读
没有评论

问题描述

一个新接触 Ansible 的用户在编写了一个包含两个任务的 playbook 后遇到了问题。虽然远程主机可以正常连接,但其中一个任务在执行时会长时间停滞,日志中没有异常信息。以下是他的 playbook 部分内容:

- name: 安装主节点的 Kubernetes
  connection: ssh
  hosts: x.x.x.x
  become_method: su
  tasks:
    - name: 安装 curl
      ansible.builtin.shell:
        cmd: sudo apt install --yes apt-transport-https curl
      vars:
        ansible_persistent_log_messages: True
      register: update_curl_install_output
    - name: 更新输出
      ansible.builtin.debug:
        var: update_curl_install_output.stdout_lines

他在运行 playbook 时使用了如下命令:

ANSIBLE_ENABLE_TASK_DEBUGGER=True ansible-playbook -vvv master-node.yaml -i inventory --extra-vars "ansible_sudo_pass=managed_host_pass"

虽然主机连接正常,但某个任务在执行时却长时间停滞,而日志中没有异常信息。

解决方案

以下解决方案基于提供的问答数据和知识库信息,针对问题进行分析并提供可能的解决方法。在实际操作中,请确保备份数据以避免意外情况。

方案1

根据你提供的信息,问题可能出在 become_method: su 这行代码上。这行代码指定了权限升级的方法为 su,但可能存在一些问题,导致任务长时间停滞。正确的权限升级方式应该是使用 become: true,可以将该行代码修改为以下形式:

- name: 安装主节点的 Kubernetes
  connection: ssh
  hosts: x.x.x.x
  become: true
  tasks:
    # 之后的任务内容...

通过使用正确的 become 参数,你可以避免潜在的权限升级问题,可能会解决任务长时间停滞的情况。

方案2

如果在更改权限升级方式后问题仍然存在,你可以尝试增加一些额外的调试信息,以便更好地定位问题所在。可以在 playbook 中使用 debug 任务来输出一些中间信息,帮助你判断任务的执行进度。以下是示例代码,你可以将其插入到 playbook 的适当位置进行测试:

- name: 调试信息
  debug:
    var: ansible_facts

这个任务将输出 Ansible 执行任务时收集的 facts 信息,包括主机的状态和属性等。通过查看这些信息,你可能能够更好地理解任务的执行情况,从而找到问题所在。

方案3

如果以上两种方案都没有解决问题,你还可以尝试使用更详细的日志来进行排查。可以在执行 playbook 时,使用 -vvvv 参数来获取更详细的调试信息。这将输出更多的信息,帮助你更准确地分析任务执行的情况。

ANSIBLE_ENABLE_TASK_DEBUGGER=True ansible-playbook -vvvv master-node.yaml -i inventory --extra-vars "ansible_sudo_pass=managed_host_pass"

通过查看更详细的日志信息,你可能会发现一些异常或问题,从而更好地解决任务长时间停滞的情况。

请注意,以上提供的解决方案仅供参考,具体的问题排查和解决可能需要根据实际情况进行调试和尝试。在执行任何操作之前,请务必确保备份数据,以免发生意外情况。如果问题仍然无法解决,建议在 Ansible 社区或相关论坛寻求帮助,以获取更多的技术支持和建议。

正文完