如何对库存组中的所有主机执行 cyberarkpassword 查找并将密钥写入单独的 pem 文件?

如何对库存组中的所有主机执行 cyberarkpassword 查找并将密钥写入单独的 pem 文件?

Ansible 版本 2.7.9

我正在编写一个 ansible playbook 来将一个软件部署到 Linux 环境。这些系统的 SSH 访问受 CPM(Cyber​​ark)保护,用作 ssh 密钥管理器。

我已经弄清楚了大部分逻辑,只剩下一点。剧本需要循环遍历库存组中的主机,在 Cyber​​ark 中查找每个主机的 ssh 私钥,然后使用每个密钥通过 ssh 进入库存组中的每个主机来安装软件。我正在努力想办法让它在 ansible 中工作。

我已经阅读了 add_host 和cyberark密码文档,以及大约 4 个小时的搜索 stackoverflow 和博客,却找不到一个接近我想要做的事情的例子。

至于我思考它应该起作用:

  • 使用 cyberarkpassword 查找模块,循环遍历由 指定的库存组中的主机{{ env }}。此值将通过 --extra-args 传递。
  • 检索每个主机的 ssh 私钥。
  • 注册查找的输出并复制到磁盘,再次循环遍历每个主机,并使用{{ inventory_hostname }}.pem命名文件
  • 最后,为了在下一个游戏中使用它,设置一个变量ansible_ssh_common_args: "-o StrictHostKeyChecking=no -i {{ deploy_temp_dir}}/keys/{{ inventory_hostname }}.pem"

但我不知道如何将循环查找写入磁盘部分放在一起。

样本库存文件

[local]
localhost

[local:vars]
ansible_connection=local

[corp:children]
corp-onprem-dev
corp-onprem-stage
corp-onprem-prod
corp-cloud-dev
corp-cloud-stage
corp-cloud-dev

[corp-onprem-dev]
host1
host2
host3

[corp-onprem-stage]
host1
host2
host3
[corp-onprem-prod]
host1
host2
host3
[corp-cloud-dev]

[corp-cloud-stage]

[corp-cloud-prod]

deploy.yml——此代码不起作用,只是我尝试弄清楚。

- name: retrieve ssh keys for hosts in the specified group, and write them to disk
  hosts: local
  gather_facts: no
  tasks:
    - name: lookup ssh private key for each host
      debug: msg={{ lookup("cyberarkpassword", cyquery)}}
      vars:
        cyquery:
          appid: 'myapp'
          query: 'Safe=mysafe;Folder=Root;Object={{ env[0] }}'
          output: 'Password'
      loop: groups['{{ env }}']
      register: sshkeys
    - name: Copy ssh key to disk
      copy:
        content: "{{ sshkeys }}"
        dest: "{{ deploy_temp_dir }}/keys/{{ env[0] }}.pem"
        mode: 0600
      loop: {{ env }}

答案1

注册一个调试任务来尝试获取输出是混乱的。我认为调试只是输出,而不是输入。

相反,删除调试任务。在复制任务中,循环遍历主机并对循环变量“item”执行 cyberarkpassword 查找。我假设“env”包含相关的 Ansible 主机组。

- name: Copy ssh key to disk
  copy:
    content: "{{  lookup("cyberarkpassword", cyquery) }}"
    dest: "{{ deploy_temp_dir }}/keys/{{ item }}.pem"
    mode: 0600
  vars:
    cyquery:
      appid: 'myapp'
      query: 'Safe=mysafe;Folder=Root;Object={{ item }}'
      output: 'Password'
  loop: groups['{{ env }}']

理想情况下,您的 ssh_config 配置为使用正确的密钥,例如使用 Host 或 Match 块中的 IdentityFile 指令。

使用 ssh-add 将密钥添加到您的代理。

答案2

感谢 John Mahowald 的贡献。在复制模块的内容字段中执行 cyberarkpassword 查找,循环遍历每个主机并复制到磁盘,一切顺利。对其他一些内容进行了调整,如下所示。

最终(工作)代码(省略了某些细节):


- name: retrieve ssh keys for hosts in the specified group, and write them to disk
  hosts: local
  gather_facts: no
  vars_files:
    - vars.yml
  tasks:
    - name: Lookup ssh key for each host and copy to disk
      copy:
        content: "{{  lookup('cyberarkpassword', cyquery)[0]['password']}}"
        dest: "{{ deploy_temp_dir }}/keys/{{ item }}.pem"
        mode: 0600
      vars:
        cyquery:
          appid: 'myapp'
          query: 'Safe=mysafe;Folder=Root;Object={{ item }}'
          output: 'Password'
      with_items: "{{ groups[env] }}"

知道您可以在为 with_items 指定的字典中使用 python 变量将它们全部联系在一起。

执行此操作时,我运行 ansible-playbook -i site.ini deploy.yml --extra-vars="env=corp-onprem-dev"。现在运行良好!

PLAY [prep execution environment] *********************************************************************************************************************************************************************************************************

TASK [create temp dir] ********************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [create dir for keys] ****************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [download agent binaries] ************************************************************************************************************************************************************************************************************
ok: [localhost]

PLAY [retrieve ssh keys for hosts in the specified group, and write them to disk] *********************************************************************************************************************************************************

TASK [Lookup ssh key for each host and copy to disk] **************************************************************************************************************************************************************************************
ok: [localhost] => (item=host1)
ok: [localhost] => (item=host2)
ok: [localhost] => (item=host3)

PLAY RECAP ********************************************************************************************************************************************************************************************************************************
localhost                  : ok=4    changed=0    unreachable=0    failed=0   

太感谢了!

相关内容