问题描述
想要在Ansible中以其他用户的身份运行ping命令,使用他们的SSH密钥。用户的设置如下:
– master_user(我)
– ansible(sudo用户,无密码登录)
用户已经以ansible用户登录,并执行了以下操作:
– ssh-keygen(生成密钥)
– ssh-copy-id XXXX(将SSH密钥复制到相应的服务器)
测试结果良好(每个服务器都已经有ansible用户)。用户还更新了hosts文件以包含所有的主机。
现在,当用户远程登录为master_user时,希望以ansible用户的身份运行ansible命令,类似于以下命令:
ansible all --become-user=ansible -m ping
但是这个命令失败了,因为它尝试使用master_user的SSH密钥连接到服务器。
错误信息:Failed to connect to the host via ssh
当用户使用-vvvv标志运行时,可以看到它尝试使用master_user的SSH密钥。
Offending key for IP in /home/master_user/.ssh/
用户想知道如何配置,以便始终使用ansible用户和ansible用户的SSH密钥。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
become_user
指定在远程服务器上运行特定ansible模块时要成为的用户。
如果您想在控制机上以其他用户身份运行ansible命令,您需要在该机器上使用sudo或su,例如:
sudo -s -u ansible ansible all -m ping
-s
选项将加载用户的shell,并确保在运行命令之前正确设置homedir和所有其他环境。
另一种可能的解决方案是使用您的帐户为ansible用户创建的ssh密钥:
ansible all --private-key=/home/ansible/.ssh/id_rsa -m ping
这只有在当前用户对给定密钥具有读取权限时才能正常工作。
方案2
使用脚本或工具来管理容器的启动顺序可能会增加复杂性,并且需要确保容器A和容器B之间的依赖关系正确设置。
另一种方法是编写脚本或使用工具来控制容器的运行顺序。您可以使用docker run
命令来手动控制容器的启动顺序,或者使用一些第三方工具来管理容器的依赖关系。
示例:
以下是一个简单的bash脚本示例,可以在容器A启动后启动容器B:
#!/bin/bash
# 启动容器A
docker run -d --name container_a your_image_a
# 等待容器A完全启动
while ! docker exec container_a echo "Container A is ready"; do
sleep 1
done
# 启动容器B
docker run -d --name container_b your_image_b
在这个示例中,我们首先使用docker run
命令启动容器A,并将其命名为container_a
。然后,使用一个循环来等待容器A完全启动(这里是通过在容器内运行echo
命令来测试)。一旦容器A就绪,我们再使用docker run
命令启动容器B,并将其命名为container_b
。