TL; DR:由于“ tag_Name_server1”是一个组,因此在组变量文件中指定密钥文件。

注意:我假设您正在使用EC2外部清单脚本。 如果您使用其他动态库存方法,则可能需要调整此解决方案。

这是我几个月来一直在努力奋斗的问题,并且由于Brian Coca的建议,我终于找到了解决方案。 诀窍是使用Ansible的组变量机制为您正在使用的计算机自动传递正确的SSH密钥文件。

EC2清单脚本会自动设置可用于引用主机的各种组。 您在剧本中使用它:在第一部剧本中,您告诉Ansible将'role1'应用于整个'tag_Name_server1'组。 我们要指示Ansible为“ tag_Name_server1”组中的任何主机使用特定的SSH密钥,这是组变量文件所在的位置。

假设您的剧本位于“ my-playbooks”目录中,请在“ group_vars”目录下为每个组创建文件:

my-playbooks
|-- test.yml
+-- group_vars
|-- tag_Name_server1.yml
+-- tag_Name_server2.yml

现在,每当您在剧本中引用这些组时,Ansible都会检查相应的文件,并加载在那里定义的所有变量。

在每个组var文件中,我们可以指定用于连接到该组主机的密钥文件:

# tag_Name_server1.yml
# --------------------
#
# Variables for EC2 instances named "server1"
---
ansible_ssh_private_key_file: /path/to/ssh/key/server1.pem

现在,当您运行剧本时,它应该会自动选择正确的键!

使用环境变量进行可移植性

我经常在许多不同的服务器(本地,远程构建服务器等)上运行剧本,因此我喜欢对事物进行参数化。 我没有使用固定路径,而是使用了一个名为SSH_KEYDIR的环境变量,该变量指向存储SSH密钥的目录。

在这种情况下,我的组vars文件看起来像这样:

# tag_Name_server1.yml
# --------------------
#
# Variables for EC2 instances named "server1"
---
ansible_ssh_private_key_file: "{{ lookup('env','SSH_KEYDIR') }}/server1.pem"

进一步改进

可能有很多整齐的方法可以对此进行改进。 一方面,您仍然需要手动指定每个组要使用的键。 由于EC2清单脚本包含有关每个服务器使用的密钥对的详细信息,因此可能存在一种直接从脚本本身获取密钥名称的方法。 在这种情况下,您可以提供密钥所在的目录(如上所述),并让它根据库存数据选择正确的密钥。