在为ssh私钥文件编码ansible剧本时遇到一个配置问题。
众所周知,我们可以在ansible hosts文件中为静态 list 服务器定义与主机服务器,ip和相关ssh私钥的组合。
但是我不知道如何用动态 list 服务器定义它。
例如:
---
- hosts: tag_Name_server1
gather_facts: no
roles:
- role1
- hosts: tag_Name_server2
gather_facts: no
roles:
- roles2
以下命令用于调用该剧本:
ansible-playbook test.yml -i ec2.py --private-key ~/.ssh/SSHKEY.pem
我的问题是:
谢谢您的意见
最佳答案
TL; DR:由于“tag_Name_server1”是一个组,因此在组变量文件中指定密钥文件。
注意:我假设您正在使用EC2 external inventory script。如果您使用其他动态库存方法,则可能需要调整此解决方案。
这是我几个月来一直在努力奋斗的问题,由于Brian Coca的建议here,我终于找到了解决方案。诀窍是使用Ansible的组变量机制为您正在使用的计算机自动传递正确的SSH密钥文件。
EC2 list 脚本会自动设置各种组,您可以使用这些组来引用主机。您在剧本中使用它:在第一部剧本中,您告诉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 list 脚本包含有关每个服务器使用的密钥对的详细信息,因此可能存在一种直接从脚本本身获取密钥名称的方法。在这种情况下,您可以提供密钥所在的目录(如上所述),并让它根据库存数据选择正确的密钥。