ansible 2.6.2: playbook работает при выполнении с помощью команды ansible-playbook, но не в AWX 1.0.7.2

Я видел много сообщений, в которых утверждалось, что плейбуки работают правильно, когда выполняются с помощью доступного интерфейса командной строки, но не в AWX. Однако я не нашел решения своей проблемы. Для простоты у меня есть следующая роль:

---
- name: Append Public key in authorized_keys file
  authorized_key:
    user: "{{ username }}"
    state: present
    key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"

Он называется следующим образом:

- name: copy root public key to nodes
  become: yes
  become_user: root
  hosts: jenkins-nodes
  roles:
    - role: copy-keys
      username: root

Запускаем его с помощью интерфейса командной строки, как показано ниже:

ansible-playbook -i inventory.ini -u root <my-playbook> ---vvv

работает должным образом и отображает следующее:

TASK [copy-keys : Append Public key in authorized_keys file 
***************************************************************
task path: /opt/jenkins-cluster/roles/copy-keys/tasks/main.yml:2
...
ok: [jenkins-agent-1] => {
"changed": false,
"comment": null,
"exclusive": false,
"invocation": {
    "module_args": {
        "comment": null,
        "exclusive": false,
        "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCuF9U2HvzUubuYYZxJaEu/1nls7RLAZO+qcJF37RIepTSLOgoPsluq7uVRhEnadqnB0yVWccZYHs6WEp5Fo2QIRDRho4+TuACB26EE4GTYGnozyMwOwVcTzRo0CiUXfo3IZKWwQ+v8WwBMae3EpYrbrEZy6lLS8K85uYseyjg1myRhEsltdSiNnHun7p09/v/HMq2KsZcmx6nTg66QvkbbnFvv9UpGQ1J6gvimp11r5r1hwXaB7ejTwrxMICvaE2Flq3WGeaB35I4dYFsrWNK1CalP7jPF+MRgqHUrjoOy5hxp3zSXunfGWeRJCaJY5hYDLp3hTGrt8BwcdD+8Gy7r root@inf-inone01-prd",
        "key_options": null,
        "keyfile": "/root/.ssh/authorized_keys",
        "manage_dir": true,
        "path": null,
        "state": "present",
        "unique": false,
        "user": "root",
        "validate_certs": true
    }
},
"key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCuF9U2HvzUubuYYZxJaEu/1nls7RLAZO+qcJF37RIepTSLOgoPsluq7uVRhEnadqnB0yVWccZYHs6WEp5Fo2QIRDRho4+TuACB26EE4GTYGnozyMwOwVcTzRo0CiUXfo3IZKWwQ+v8WwBMae3EpYrbrEZy6lLS8K85uYseyjg1myRhEsltdSiNnHun7p09/v/HMq2KsZcmx6nTg66QvkbbnFvv9UpGQ1J6gvimp11r5r1hwXaB7ejTwrxMICvaE2Flq3WGeaB35I4dYFsrWNK1CalP7jPF+MRgqHUrjoOy5hxp3zSXunfGWeRJCaJY5hYDLp3hTGrt8BwcdD+8Gy7r root@inf-inone01-prd",
"key_options": null,
"keyfile": "/root/.ssh/authorized_keys",
"manage_dir": true,
"path": null,
"state": "present",
"unique": false,
"user": "root",
"validate_certs": true
}
...
META: ran handlers
META: ran handlers

Когда я выполняю то же самое в AWX, я получаю:

TASK [copy-keys : Append Public key in authorized_keys file] 
*******************
task path: /var/lib/awx/projects/_39__jenkins_cluster/roles/copy-keys/tasks/main.yml:2
 [WARNING]: Unable to find '~/.ssh/id_rsa.pub' in expected paths (use -vvvvv to
see paths)
 [WARNING]: Unable to find '~/.ssh/id_rsa.pub' in expected paths (use -vvvvv to
see paths)
fatal: [jenkins-agent-1]: 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: ~/.ssh/id_rsa.pub"
}

Исключение составляет сообщение о том, что файл ~ / .ssh / id_rsa.pub, здесь /root/.ssh/id_rsa.pub для пользователя root, не может быть обнаружен, поскольку он не существует. Насколько я понимаю, модуль authorized_key добавит в файл authorized_keys на целевом хосте содержимое файла /root/.ssh/id_rsa.pub на доступном контроллере. И этот файл существует:

PROD root@inf-inone01-prd jenkins-cluster $ cat /root/.ssh/id_rsa.pub
ssh-rsa 
 AAAAB3NzaC1yc2EAAAADAQABAAABAQCuF9U2HvzUubuYYZxJaEu/1nls7RLAZO
+qcJF37RIepTSLOgoPsluq7uVRhEnadqnB0yVWccZY
Hs6WEp5Fo2QIRDRho4+TuACB26EE4GTYGnozyMwOwVcTzRo0CiUXfo3IZKWwQ
+v8WwBMae3EpYrbrEZy6lLS8K85uYseyjg1myRhEsltd 
SiNnHun7p09/v/HMq2KsZcmx6nTg66QvkbbnFvv9UpGQ1J6gvimp11r5r1hwXaB7ejTwrxMIC
vaE2Flq3WGeaB35I4dYFsrWNK1CalP7jPF+MRgqHUrjoOy5hxp3zSXunfGWeRJCaJY5hYDLp3hTGrt8BwcdD+8Gy7r 
root@inf-inone01-prd
PROD root@inf-inone01-prd jenkins-cluster $

Очевидно, что модуль authorized_keys не может разрешить ~ / .ssh, но почему он это делает при запуске с CLI?

Любое предложение будет высоко оценено, поскольку после того, как я потратил время на тестирование всего материала, чтобы охватить все случаи с использованием CLI, я подумал, что размещение всего в AWX будет делом минут. К сожалению, это не так.

С уважением,

Николас


person Community    schedule 18.02.2020    source источник
comment
AWX установлен на том же хосте, где установлен интерфейс командной строки? На какой хост вы попадаете?   -  person bosari    schedule 18.02.2020
comment
~ - это bash вещь. AWX не работает в интерактивной оболочке, поэтому ~ не разыменовывается. Используйте полный путь.   -  person Jack    schedule 18.02.2020
comment
@Jack: имеет смысл, но как это работает при работе с CLI?   -  person    schedule 18.02.2020
comment
Поскольку при запуске из командной строки вы находитесь в интерактивной bash оболочке, которая разыменовывает ~ за вас.   -  person Jack    schedule 18.02.2020
comment
@Jack: понял, но я ожидал, что что-то вроде этого: shell: ssh-keygen -b 2048 -f /root/.ssh/id_rsa -t rsa -q -N работает, но не работает ни то, ни другое. В итоге: скрипты ansible нуждаются в серьезных модификациях и адаптациях для интеграции в AWX. Это в отличие от документации AWX, в которой говорится, что процесс очень тривиален.   -  person    schedule 19.02.2020
comment
Я не могу говорить от имени AWX, но я работал с Ansible Tower (Ansible - моя специальность как консультант Red Hat), и у меня никогда не было учебника, который работает с ansible-playbook, который мне пришлось изменить для работы в Ansible Tower.   -  person Jack    schedule 19.02.2020
comment
@Jack: насколько я знаю, AWX - это версия Ansible Tower для сообщества, так что я полагаю, что это более или менее то же самое. И да, интересно знать, что вам постоянно нужно было переносить свои скрипты с интерфейса командной строки для работы с интерфейсом командной строки на Tower / AWX. Этого не ожидается. В любом случае спасибо за информацию.   -  person    schedule 20.02.2020
comment
@Nicolas Вы неправильно поняли. Мне никогда не приходилось менять playbook, чтобы он работал в Ansible Tower.   -  person Jack    schedule 20.02.2020


Ответы (1)


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

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

В моем случае я создал настраиваемый тип учетных данных под названием «SSH Keypair Credential», как показано здесь.

Конфигурация входа:

fields:
  - id: my_ssh_private_key
    type: string
    label: ssh_private_key
    secret: true
    multiline: true
  - id: my_ssh_public_key
    type: string
    label: ssh_public_key
    secret: true

Введенная конфигурация:

extra_vars:
  ssh_private_key: '{{ tower.filename.my_ssh_private_key }}'
  ssh_public_key: '{{ tower.filename.my_ssh_public_key }}'
file:
  template.my_ssh_private_key: '{{ my_ssh_private_key  }}'
  template.my_ssh_public_key: '{{ my_ssh_public_key  }}'

После создания пользовательского типа учетных данных создайте пользовательские учетные данные, как показано здесь.

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

Были использованы следующие переменные playbook:

admin_username: "admin"
admin_public_sshkey: "{{ '~/.ssh/id_rsa.pub' | expanduser }}"
admin_private_sshkey: "{{ '~/.ssh/id_rsa' | expanduser }}"

admin_ssh_private_key: "{{ ssh_private_key | d(admin_private_sshkey) }}"
admin_ssh_public_key: "{{ ssh_public_key | d(admin_public_sshkey) }}"

Плейбук при установке authorized_key:

- name: Add admin user SSH authorized keys
  when: admin_ssh_public_key is defined
  authorized_key:
    user: "{{ admin_username }}"
    key: "{{ lookup('file', admin_ssh_public_key) }}"

person purplemouse    schedule 04.04.2020