使用 Ansible EC2 Inventory Plugin 为不同主机使用多个 SSH 密钥

Using multiple SSH keys for different hosts with Ansible EC2 Inventory Plugin

我正在尝试使用 Ansible 在许多现有的 AWS EC2 实例上安装应用程序,这些实例在不同的 Linux 操作系统上使用许多不同的 SSH 密钥和用户名。由于现有实例的状态不断变化,我正尝试按照建议通过 aws_ec2 清单插件使用 Ansible 的动态清单。

我可以按 key_name 对主机进行分组,但现在需要根据组使用相关的 SSH 密钥和用户名 运行 针对此清单的 Ansible 剧本,结构如下例来自 ansible-inventory -i inventory.aws_ec2.yml --graph 的输出:

@all:
  |--@_SSHkey1:
  |  |--hostnameA
  |  |--hostnameB
  |--@_SSHkey2:
  |  |--hostnameC
  |--@_SSHkey3:
  |  |--hostnameD
  |  |--hostnameE
  |  |--hostnameF
  |--@aws_ec2:
  |  |--hostnameA
  |  |--hostnameB
  |  |--hostnameC
  |  |--hostnameD
  |  |--hostnameE
  |  |--hostnameF
  |--@ungrouped:

我已经尝试使用上面列出的组创建一个单独的主机文件(如下所示),提供相关 SSH 密钥的路径,但我不确定您将如何将其与动态清单一起使用。

[SSHkey1]
ansible_user=ec2-user
ansible_ssh_private_key_file=/path/to/SSHkey1

[SSHkey2]
ansible_user=ubuntu
ansible_ssh_private_key_file=/path/to/SSHkey2

[SSHkey3]
ansible_user=ec2-user
ansible_ssh_private_key_file=/path/to/SSHkey3

这在 Ansible 官方文档中没有解释 here and here but should be a common use case. A lot of the documentation I have found refers to an older method of using Dynamic Inventory using a python script (ec2.py) which is deprecated and so is no longer relevant (for instance this AWS post)。 我发现了一个类似的悬而未决的问题 here (Part 3)

任何示例、文档或解释的链接都将不胜感激,因为这似乎是创建动态清单的一种相对较新的方法,我发现很难找到清晰、详细的文档。


编辑

按照@larsks 在评论中的建议使用group variables。最初被库存插件返回的 SSH 密钥名称预先添加下划线这一事实所困扰,因此组名需要采用 _SSHkey.

的形式

您是否考虑过使用 ssh 配置文件? ~/.ssh/config.您可以将特定的主机连接信息放在那里。 Host, hostname,user,Identityfile 是你需要的四个选项

主机 ec1 主机名 10.10.10.10 用户 ubuntu IdentityFile ~/.ssh/ec1-ubuntu.rsa

然后当您 ssh 到 'ec1' 时,ssh 将作为用户 ubuntu 使用指定的 rsa 密钥连接到主机 10.10.10.10。 'Ec1' 可以是您喜欢的任何名称,不必是实际的主机名或 ip 或 FQDN。使其与您的库存名称相匹配。

警告:: 为目录 ~/.ssh 设置特定的文件权限,其中的文件都是 0600 (chmod -R 0600 ~/.ssh) 并且所有者是正确的,否则 ssh 会给你合适的。在 ubuntu 上,/var/log/auth.log 将有助于进行故障排除。

答案是按照评论中的建议使用 group variables。从 inventory 插件返回的 SSH 密钥名称前面加上一个下划线,因此组名需要采用 _SSHkey.

的形式