如何对清单组中的所有主机执行cyberarkpassword查找并将密钥写出到单个pem文件中?

时间:2019-06-15 00:07:26

标签: ansible ansible-2.x ansible-inventory

Ansible版本2.7.9

我正在写一个有趣的剧本,以将一个软件部署到linux环境中。 SSH对这些系统的访问受到CPM(Cyber​​ark)的保护,该CPM被用作SSH密钥管理器。

我已经弄清楚了大多数逻辑,只剩下一个。剧本需要遍历清单组中的主机,在Cyber​​ark中为每个主机查找ssh私钥,然后使用每个密钥将ssh放入清单组中的每个主机以安装软件。我正在努力使该功能无法使用。

我已经阅读了add_host和cyberarkpassword文档,以及大约4个小时的搜索stackoverflow和博客,而且找不到一个与我想做的事相近的例子。 / p>

根据我的想法,应该起作用:

  • 使用cyberarkpassword查找模块,循环访问{{ env }}指定的清单组中的主机。值将通过--extra-args传递。
  • 获取每个主机的ssh私钥。
  • 注册查询的输出,然后复制到磁盘,再次遍历每个主机,并使用{{ inventory_hostname }}。pem命名文件。
  • 最后,要在下一次播放中使用它,请设置变量ansible_ssh_common_args: "-o StrictHostKeyChecking=no -i {{ deploy_temp_dir}}/keys/{{ inventory_hostname }}.pem"

但是我不知道如何将loop-lookup-write写到磁盘上。

库存文件样本

[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: groups['{{ env }}']

1 个答案:

答案 0 :(得分:0)

尚不清楚如何“使用每个(专用)密钥ssh进入每个主机”。

  

要遍历清单组中的主机,请在Cyber​​ark中为每个主机查找ssh私钥,然后使用每个密钥ssh进入清单组中的每个主机。

假设 localhost (控制器)能够连接主机。

看看变量 sshkeys

的内容
- debug:
    var: sshkeys

在列表中,您可能会看到要查找的2个项目。 (使代码适合您所得到的。)

sshkeys.results[].item  ...... inventory_hostname
sshkeys.results[].password ... ssh private key

使用template将密钥存储在文件中。因为该播放是在 localhost delegate_to上进行的,所以该文件将被用于在主机上存储文件。

- template:
    src: hostname.pem.j2
    dest: "{{ deploy_temp_dir }}/keys/{{ item.item }}.pem"
  loop: "{{ sshkeys.results }}"
  delegate_to: "{{ item.item }}"

$ cat hostname.pem.j2
{{ item.password }}

(未经测试。我没有Cyber​​Ark。在磁盘文件中存储密码可能违反安全标准。)