Ansible 版本 2.7.9
我正在编写一个 ansible playbook 来将一个软件部署到 Linux 环境。这些系统的 SSH 访问受 CPM(Cyberark)保护,用作 ssh 密钥管理器。
我已经弄清楚了大部分逻辑,只剩下一点。剧本需要循环遍历库存组中的主机,在 Cyberark 中查找每个主机的 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
太感谢了!