Переключение пользователя для делегирования на хост вне инвентаря с помощью Ansible / awx

Я пытаюсь сделать следующее, используя Ansible 2.8.4 и awx:

  • Прочтите некоторые факты из устройств Cisco IOS (работает)
  • Поместите результаты в локальный файл с помощью шаблона (работает)
  • Скопируйте / переместите полученный файл на другой сервер

Поскольку мне приходится использовать другого пользователя для доступа к устройствам и серверам IOS, а рассматриваемые серверы не являются частью инвентаря, используемого для playbook, я пытаюсь добиться этого с помощью begin_user и delegate_to. Первоначальному пользователю (определенному в шаблоне awx) разрешено подключаться к устройствам IOS, в то время как different_user может подключаться к серверам с помощью закрытого ключа ssh.

Пособие:

---
  - name: Read Switch Infos
    hosts: all
    gather_facts: no
    tasks:

      - name: Gather IOS Facts
        ios_facts:
      - debug: var=ansible_net_version
      - name: Set Facts IOS
        set_fact:
          ios_version: "{{ ansible_net_version }}"

      - name: Create Output file
        file: path=/tmp/test state=directory mode=0755
        delegate_to: 127.0.0.1
        run_once: true

      - name: Run Template
        template:
          src: ios_firmware_check.j2
          dest: /tmp/test/output.txt
        delegate_to: 127.0.0.1
        run_once: true

      - name: Set up keys
        become: yes
        become_method: su
        become_user: different_user
        authorized_key:
          user: different_user
          state: present
          key: "{{ lookup('file', '/home/different_user/.ssh/key_file') }}"
        delegate_to: 127.0.0.1
        run_once: true
      - name: Copy to remote server
        remote_user: different_user
        copy:
          src: /tmp/test/output.txt
          dest: /tmp/test/output.txt
        delegate_to: remote.server.fqdn
        run_once: true

При запуске playbook не удается выполнить задачу Set up keys, пытаясь получить доступ к домашнему каталогу с помощью ключа ssh:

TASK [Set up keys] *************************************************************
task path: /tmp/awx_2206_mz90qvh9/project/IOS/ios_version.yml:23
 [WARNING]: Unable to find '/home/different_user/.ssh/key_file' in expected paths
(use -vvvvv to see paths)
File lookup using None as file
fatal: [host]: FAILED! => {
    "msg": "An unhandled exception occurred while running the lookup plugin 'file'. Error was a <class 'ansible.errors.AnsibleError'>, original message: could not locate file in lookup: /home/different_user/.ssh/key_file"
}

Я предполагаю, что моя ошибка каким-то образом связана с тем, какой пользователь пытается получить доступ к каталогу / home / на каком устройстве. Есть ли лучший / более элегантный / рабочий способ подключения к другому серверу с помощью ключа ssh для перемещения файлов? Я знаю, что одной из возможностей было бы просто scp с использованием модуля оболочки, но это всегда кажется немного взломанным.


person Dominik S    schedule 17.07.2020    source источник


Ответы (1)


(вроде) решено с использованием зашифрованных переменных в hostvars с помощью хранилища Ansible. Как туда добраться:

Шифрование паролей:

Это нужно сделать из любой командной строки с установленным Ansible, по какой-то причине это невозможно сделать в tower / awx

ansible-vault encrypt_string "password"

Вам будет предложено ввести пароль для шифрования / дешифрования. Если вы делаете это для устройств Cisco, вам нужно зашифровать и ssh, и пароль включения, используя этот метод.

Добавить зашифрованные пароли в инвентарь

Для тестирования я поместил его в hostvars для одного коммутатора, должно быть хорошо, чтобы поместить его в groupvars и использовать его также на нескольких коммутаторах.

ansible_ssh_pass должен быть паролем для доступа к коммутатору, ansible_become_pass - это пароль включения.

---
all:
  children:
    Cisco:
      children:
        switches:
switches:
  hosts:
    HOSTNAME:
      ansible_host: ip-address
      ansible_user: username
      ansible_ssh_pass: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          [encrypted string]
      ansible_connection: network_cli
      ansible_network_os: ios
      ansible_become: yes
      ansible_become_method: enable
      ansible_become_pass: !vault |
          $ANSIBLE_VAULT;1.1;AES256
         [encrypted string]

Добавление пароля хранилища в tower / awx

Добавьте новые учетные данные с типом учетных данных Vault и паролем, который вы использовали ранее для шифрования строк. Теперь все, что вам нужно сделать, это добавить учетные данные в шаблон задания (шаблон может иметь одно обычное удостоверение (компьютер, сеть и т. Д.) И несколько хранилищ).

Затем playbook автоматически получает доступ к учетным данным хранилища, чтобы расшифровать строки в инвентаре.

Пособие по получению информации о коммутаторе и размещению файла шаблона на сервере

Плейбук теперь выглядит примерно так, как показано ниже, и выполняет следующие действия:

  • Соберите факты обо всех коммутаторах в инвентаре
  • Запишите все факты в .csv с помощью шаблона, сохраните файл на доступном хосте.
  • Скопируйте указанный файл на другой сервер, используя другого пользователя.

Шаблон настроен так, что пользователь может получить доступ к серверу, пользователь, используемый для доступа к коммутаторам с паролем, хранится в инвентаре, как показано выше.

---
  - name: Read Switch Infos
    hosts: all
    gather_facts: no
    tasks:
      - name: Create Output file
        file: path=/output/directory state=directory mode=0755
        delegate_to: 127.0.0.1
        run_once: true
      - debug:
          var: network
      
      - name: Gather IOS Facts
        remote_user: username
        ios_facts:
      - debug: var=ansible_net_version
      
      - name: Set Facts IOS
        set_fact:
          ios_version: "{{ ansible_net_version }}"

      - name: Run Template
        template:
          src: ios_firmware_check.csv.j2
          dest: /output/directory/filename.csv
        delegate_to: 127.0.0.1
        run_once: true
      
      - name: Create Destination folder on remote server outside inventory
        remote_user: different_username
        file: path=/destination/directory mode=0755
        delegate_to: remote.server.fqdn
        run_once: true
      
      - name: Copy to remote server outside inventory
        remote_user: different_username
        copy:
          src: /output/directory/filename.csv
          dest: /destination/directory/filename.csv
        delegate_to: remote.server.fqdn
        run_once: true
person Dominik S    schedule 22.07.2020