在Ansible中使用其他用户的SSH密钥运行命令

109次阅读
没有评论

问题描述

想要在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

正文完