使用 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
.
的形式
我正在尝试使用 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
.