Ansible версии 2.7.9
Я пишу учебник для развертывания программного обеспечения в среде Linux. Доступ по SSH к этим системам защищен CPM (Cyberark), который используется в качестве диспетчера ключей ssh.
Я понял большую часть логики, за исключением одной части. Playbook должен пройти через хосты в группе инвентаризации, найти закрытый ключ ssh в Cyberark для каждого хоста, а затем использовать каждый ключ для ssh на каждом хосте в группе инвентаризации для установки программного обеспечения. Я борюсь с тем, как сделать это доступным.
Я прочитал add_host и кибераркпароль документации, а также около 4 часов поиска stackoverflow и блогов, и я не смог найти ни одного примера, даже близкого к тому, что я пытаюсь сделать.
Насколько я считать он должен работать:
{{ env }}
. Значение для этого будет передано через --extra-args.{{ inventory_hostname }}
.pemansible_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 }}
Спасибо Джону Маховальду за это. Выполнение поиска 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] }}"
Знание, что вы можете использовать переменные Python внутри dict, указанного для with_items, связывало все это вместе.
Выполняя это, я запускаю 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
Спасибо вам большое!
зарегистрировать задачу отладки, чтобы попытаться получить вывод беспорядочно. Я считаю отладку только выходом, а не входом.
Скорее удалите задачу отладки. В задаче копирования переберите свои хосты и выполните поиск cyberarkpassword по переменной цикла "item". Я предполагаю, что "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 настроен на использование правильного ключа, например, с директивой IdentityFile в блоке Host или Match.
Используйте ssh-add, чтобы добавить ключи к вашему агенту.