我的 ansible 盒子(流浪者)有一些奇怪的问题。
昨天一切正常,我的剧本运行良好。
今天,ansible 靠的是“收集事实”?
这是详细的输出:
<5.xxx.xxx.xxx> ESTABLISH CONNECTION FOR USER: deploy
<5.xxx.xxx.xxx> REMOTE_MODULE setup
<5.xxx.xxx.xxx> EXEC ['ssh', '-C', '-tt', '-vvv', '-o', 'ControlMaster=auto', '-
o', 'ControlPersist=60s', '-o', 'ControlPath=/home/vagrant/.ansible/cp/ansible-s
sh-%h-%p-%r', '-o', 'Port=2221', '-o', 'KbdInteractiveAuthentication=no', '-o',
'PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey', '-o
', 'PasswordAuthentication=no', '-o', 'User=deploy', '-o', 'ConnectTimeout=10',
'5.xxx.xxx.xxx', "/bin/sh -c 'mkdir -p $HOME/.ansible/tmp/ansible-tmp-1411372677
.18-251130781588968 && chmod a+rx $HOME/.ansible/tmp/ansible-tmp-1411372677.18-2
51130781588968 && echo $HOME/.ansible/tmp/ansible-tmp-1411372677.18-251130781588
968'"]
Run Code Online (Sandbox Code Playgroud)
小智 55
我在 Vagrant 上使用 Ansible ping 时遇到了类似的问题,它突然无缘无故地卡住了,并且之前工作得非常好。与 ssh 或连接问题等任何其他问题不同,它永远不会超时。
我为解决此问题所做的一件事是清理~/.ansible目录,然后它又可以正常工作了。我不知道为什么,但它确实得到了解决。
如果您有更改以再次尝试~/.ansible在刷新 Vagrant 之前清理文件夹。
Jor*_*dan 28
Ansible 可能会因为多种原因而像这样挂起,通常是因为连接问题或因为设置模块挂起。以下是缩小问题范围以便您解决问题的方法。
Ansible 无法连接到目标主机
主机密钥 (known_hosts) 问题
1) 在旧版本的 Ansible(2.1 或更早版本)上,Ansible 不会总是告诉您目标的主机密钥是否在源上不存在,或者是否存在不匹配。
解决方案:尝试使用相同的参数打开到该目的地的 SSH 连接。您可能会发现需要解决的 SSH 错误,然后该命令将起作用。
2) 有时 Ansible 会在其他状态中向您显示 SSH 连接消息,导致 Ansible 在该任务上“冻结”:
Warning: the ECDSA host key for 'myhost' differs from the key for the IP address '10.10.1.10'
Offending key for IP in /etc/ssh/ssh_known_hosts:246
Matching host key in /etc/ssh/ssh_known_hosts:477
Are you sure you want to continue connecting (yes/no)?
Run Code Online (Sandbox Code Playgroud)
在这种情况下,只需对尽可能多的 SSH 问题输入“是”即可继续播放。之后,您可以修复 root known_hosts 问题。
私钥认证问题
如果使用基于密钥的身份验证与密码,其他问题包括:
解决方案:尝试ansible -m ping <destination> -k针对有问题的主机运行- 如果这不起作用,请尝试上面的主机密钥问题解决方案。
Ansible 无法快速收集事实
的setup(当在开始时自动运行模块ansible-playbook手动运行作为运行时,或者当ansible -m setup <host>收集硬件事实时(例如,如果正从主机具有高I磁盘/ O的信息,坏安装条目等))通常可以挂起。
解决方案:尝试运行ansible -m setup -a gather_subset=!all <destination>. 如果这有效,您应该考虑在您的 ansible.cfg 中设置这一行:
gather_subset=!hardware
Run Code Online (Sandbox Code Playgroud)
小智 26
对我来说,安装模块模块卡在一个死 NFS 安装上。
如果您在您的机器上执行“df”并且没有任何反应,您可能处于相同的情况。
PS:如果您无法卸载 NFS 共享/挂载点,请考虑使用错误的“umount -l”
小智 18
ansible 可能在事实收集时挂起的原因有很多,但在继续之前,这是您在任何此类情况下应该进行的第一个测试:
ansible -m ping <hostname>
Run Code Online (Sandbox Code Playgroud)
此测试仅连接到主机,并执行足够的代码以返回:
<hostname> | SUCCESS => {
"changed": false,
"ping": "pong"
}
Run Code Online (Sandbox Code Playgroud)
如果这可行,您几乎可以排除任何设置或连接问题,因为它证明您可以解析目标主机名、打开连接、进行身份验证并使用远程 python 解释器执行 ansible 模块。
现在,这里有一个(非详尽的)列表,列出了剧本开头可能出错的事情:
我记得这发生在较旧的 ansible 版本上,其中命令将等待永远不会出现的交互式输入,例如 sudo 密码(当您忘记-K开关时),或接受新的 ssh 主机指纹(对于新目标)主持人)。
ansible 的现代版本优雅地处理这两种情况并立即为正常用例引发错误,因此除非您自己执行诸如调用 ssh 或 sudo 之类的操作,否则您不应该遇到此类问题。即使你这样做了,也是事后收集。
在此处给出的调试日志中,有一些非常有趣的选项传递给了 ssh 客户端:
ControlMaster=autoControlPersist=60sControlPath=/home/vagrant/.ansible/cp/ansible-ssh-%h-%p-%r这些选项记录在man ssh_config 中。
默认情况下,ansible 将尝试在其 ssh 连接使用方面保持智能。对于给定的主机,它不会为游戏中的每个任务创建新连接,而是将其打开一次,并在整个剧本(甚至跨剧本)中保持打开状态。
这很好,因为与使用现有连接相比,建立新连接要慢得多且计算量大。
在实践中,每个 ssh 连接都会检查 上的套接字是否存在~/.ansible/cp/some-host-specific-path。第一个连接找不到,所以正常连接,然后创建。每个后续连接将只使用这个套接字来通过已经建立的连接。
即使建立的连接在没有使用足够长的时间后最终超时并关闭,套接字也会关闭,我们又回到了原点。
到现在为止还挺好。
然而,有时连接实际上已终止,但 ssh 客户端仍认为它已建立。这通常发生在您从笔记本电脑执行剧本时,并且您失去了 WiFi 连接(或从 WiFi 切换到以太网等……)
最后一个例子是一个糟糕的情况:你可以使用默认的 ssh 配置 ssh 到目标机器,但是只要你之前的连接仍然被认为是活动的,ansible 甚至不会尝试建立一个新的连接。
此时,我们只想摆脱这个旧套接字,最简单的方法是将其删除:
# Delete all the current sockets (may disrupt currently running playbooks)
rm -r ~/.ansible/cp
# Delete only the affected socket (requires to know which one it is)
rm ~/.ansible/cp/<replace-by-your-socket>
Run Code Online (Sandbox Code Playgroud)
这对于一次性修复来说是完美的,但如果它发生得太频繁,您可能需要寻找更长期的修复。以下是一些可能有助于实现这一目标的提示:
请注意,在撰写本文时,一些选项已更改(例如,我最近一次运行给了我ControlPath=/home/toadjaune/.ansible/cp/871b533295),但总体思路仍然有效。
每次播放开始时,ansible 都会收集大量有关目标系统的信息,并将其放入Facts 中。这些是您可以在剧本中使用的变量,通常非常方便,但有时,获取此信息可能会很长(错误的挂载点、高 i/o 的磁盘、高负载……)
话虽如此,您并不严格需要事实来运行剧本,而且几乎可以肯定不是全部,所以让我们尝试禁用我们不需要的东西。几个选项:
出于调试目的,直接从命令行调用 setup 模块非常方便:
ansible -m setup <hostname>
Run Code Online (Sandbox Code Playgroud)
最后一个命令应该和你的剧本一样挂起,并最终超时(或成功)。现在,让我们再次执行该模块,禁用我们所能做的一切:
ansible -m setup -a gather_subset='!all' <hostname>
Run Code Online (Sandbox Code Playgroud)
如果这仍然挂起,您可以随时尝试在您的游戏中完全禁用该模块,但很可能您的问题出在其他地方。
但是,如果它工作正常(并且很快),那么请查看模块文档。你有两个选择:
gather_subset)gather_timeout 还可以通过留出更多时间来帮助您解决问题(尽管这将是修复超时错误,而不是挂起)显然,其他事情可能会出错。一些有助于调试的提示:
-vvvv),因为它会显示执行的每个命令ping和setup模块ansible -m ping不起作用,请尝试手动 ssh小智 9
我在 Gathering Facts 上遇到了类似的 Ansible 问题。我将脚本缩减为没有任务或角色的提示,但它仍然挂起。
我在我的进程列表中发现了 12 个挂起的 ansible 进程,这些进程在一天内累积。
/usr/bin/python /tmp/ansible_Jfv4PA/ansible_module_setup.py
/usr/bin/python /tmp/ansible_M2T10L/ansible_module_setup.py
Run Code Online (Sandbox Code Playgroud)
一旦我杀死了那些,它又开始工作了。
我已经按照Why my ansible-playbookhangs in \xe2\x80\x9cGatheringfacts\xe2\x80\x9d? 的建议解决了此问题的原因。博客文章。
\n\n可以简化为:
\n\n设置DEFAULT_KEEP_REMOTE_FILES=yes保留命令并启用-vvvv
再次运行剧本。
当播放卡住时复制最后打印的 shell 命令(后面的部分/bin/sh -c)
通过 登录服务器ssh。
用于strace重放播放的最后一步。步骤命令是从-vvv输出中复制的。例如:strace -f /bin/sh -c "echo BECOME-SUCCESS-ltxvshvezrnmumzdprccoiekhjheuwxt; /usr/bin/python /home/user/.ansible/tmp/ansible-tmp-1527099315.31-224479822965785/setup.py"
检查哪个调用“straced”步骤被卡住并修复它:)
就我而言,这是一个无法访问的网络驱动器......
\n| 归档时间: |
|
| 查看次数: |
76800 次 |
| 最近记录: |