我有3台虚拟机:
- ansible主机:192.168.0.103
- 应用程序1:192.168.0.105
- 应用程序2:192.168.0.106
现在我已验证该操作对 app1 有效,对 app2 也同样有效。ssh -i ansible_id_rsa [email protected]
我定义了一个 inventory.yml 文件,内容如下:
app:
hosts:
vm01:
ansible_host: 192.168.0.105
ansible_ssh_private_key_file: ~/.ssh/ansible_id_rsa
vm02:
ansible_host: 192.168.0.106
ansible_ssh_private_key_file: ~/.ssh/ansible_id_rsa
在此之后,我尝试运行ansible app -i inventory.yml -m ping
但它在返回第一台机器的成功消息后挂起,按下回车键会出现如下所示的红色错误文本。
当我用 运行它时-vvvv
,我注意到其中有一行read header failed: Broken pipe
。目前它似乎对 app2 失败了,但如果我从库存文件中删除 app1,我也会收到 app2 的成功消息。
这里可能出了什么问题?
更新:
在内部,它运行以下命令,这就是引发管道破裂错误的原因,但并不确定该怎么办。
ssh -vvv -C -o ControlMaster=auto -o ControlPersist=60s -o 'IdentityFile="/home/vagrant/.ssh/ansible_id_rsa"' -o KbdInteractiveAuthentication=no -o Prefe
rredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o 'ControlPath="/home/vagrant/.ansible/cp/3605020054"' 192.168.0
.105 '/bin/sh -c '"'"'rm -f -r /home/vagrant/.ansible/tmp/ansible-tmp-1661084339.4252737-8700-269402406490478/ > /dev/null 2>&1 && sleep 0'"'"''
更新 2:
因此建议我在 ansible.cfg 文件中添加一些属性,现在如下所示:
[ssh_connection]
host_key_checking=no
pipelining=yes
ssh_args=-o ControlMaster=auto -o ControlPersist=10m -o StrictHostKeyChecking=no
有了这个:
- 启动后第一次,第一台机器通过,第二台机器失败,原因是 python 解释器存在问题
- 此后每次都适用,
但是,在任何地方指定 python 解释器(anisble.cfg 或 inventory.yml)都会导致它每次在除第一台机器之外的所有机器上失败。
不太清楚为什么会发生这种情况!
答案1
感谢@Zeitounator,解决方案是:
使用无密码的 ssh 密钥或将密码添加到 ssh-agent
使用
-K
并添加密码到保险库中的库存文件或使用-b
无需密码即可提升权限
这样做可以使其一次性运行,而无需停止或提示输入。