Ubuntu 如何检测Ansible playbook在执行期间挂起的原因
我写的一些任务从开始到结束。Ansible不提供任何错误或日志来解释这一点,即使使用-vv选项也是如此。剧本挂了,时间的流逝不会改变任何事情 当我尝试手动运行任务时(通过SSH输入命令),一切都很好 挂起的任务示例: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
- 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本身,而是在收集事实的脚本中。我们可以很容易地调试这个问题
.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