在为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

我的问题是:
  • 如何在ansible文件中而不是在命令行
  • 中定义〜/ .ssh / SSHKEY.pem
  • 我猜剧本中可能有一个参数,例如“gather_facts”,用于定义上述主机应使用哪个私钥,但似乎没有这样的参数?
  • 如果无法在文件中定义私钥,则对于一个剧本,如果将不同的密钥文件用于不同的动态提取服务器,则应在命令行中定义什么?

  • 谢谢您的意见

    最佳答案

    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 脚本包含有关每个服务器使用的密钥对的详细信息,因此可能存在一种直接从脚本本身获取密钥名称的方法。在这种情况下,您可以提供密钥所在的目录(如上所述),并让它根据库存数据选择正确的密钥。

    09-25 19:16
    查看更多