Назад | Перейти на главную страницу

Как выполнить поиск пароля Cyberark для всех хостов в группе инвентаризации и записать ключи в отдельные файлы pem?

Ansible версии 2.7.9

Я пишу учебник для развертывания программного обеспечения в среде Linux. Доступ по SSH к этим системам защищен CPM (Cyberark), который используется в качестве диспетчера ключей ssh.

Я понял большую часть логики, за исключением одной части. Playbook должен пройти через хосты в группе инвентаризации, найти закрытый ключ ssh в Cyberark для каждого хоста, а затем использовать каждый ключ для ssh на каждом хосте в группе инвентаризации для установки программного обеспечения. Я борюсь с тем, как сделать это доступным.

Я прочитал add_host и кибераркпароль документации, а также около 4 часов поиска stackoverflow и блогов, и я не смог найти ни одного примера, даже близкого к тому, что я пытаюсь сделать.

Насколько я считать он должен работать:

Но я не могу понять, как собрать воедино цикл поиска и записи на диск.

Образец файла инвентаризации

[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, чтобы добавить ключи к вашему агенту.