Как указать допустимые предварительные задания для роли?
Как следует определять определение pretask для зависимостей ролей.
В настоящее время у меня есть роль apache
, у которой есть пользовательская переменная, поэтому в моей собственной роли в <role>/meta/main.yml
я делаю что-то вроде:
---
dependencies:
- { role: apache, user: proxy }
Проблема на этом этапе заключается в том, что у меня все еще нет пользователя, которого я указываю, и когда роль пытается запустить apache
сервер под несуществующим пользователем, я получаю сообщение об ошибке.
Я попытался создать задачу в <role>/tasks/main.yml
, например:
---
- user: name=proxy
Но пользователь создается только после запуска задачи apache
в зависимостях (что и следовало ожидать). Итак, есть ли способ создать задачу, которая создавала бы пользователя перед запуском ролей в зависимостях?
Ответы
Ответ 1
Я использую pre_tasks для выполнения некоторых задач перед ролями, спасибо за Kashyap.
#!/usr/bin/env ansible-playbook
---
- hosts: all
become: true
pre_tasks:
- name: start tasks and sent notifiaction to HipChat
hipchat:
color: purple
token: "{{ hipchat_token }}"
room: "{{ hipchat_room }}"
msg: "[Start] Run 'foo/setup.yml' playbook on {{ ansible_nodename }}."
roles:
- chusiang.vim-and-vi-mode
vars:
...
tasks:
- name: include main task
include: tasks/main.yml
post_tasks:
- name: finish tasks and sent notifiaction to HipChat
hipchat:
color: green
token: "{{ hipchat_token }}"
room: "{{ hipchat_room }}"
msg: "[Finish] Run 'foo/setup.yml' playbook on {{ ansible_nodename }}."
# vim:ft=ansible :
Ответ 2
Короткий ответ: я не думаю, что язык позволяет указать pre_tasks
для ролей.
Вы можете обманывать/обходить работу, перемещая создание пользователя в отдельную пьесу и include
в playbook вместо role
. Что-то вроде этого:
my_fake_role_playbooks/user_and_apache.yml:
- hosts: "{{p_hosts}}"
pre_tasks:
user: name=proxy
roles: [ apache ]
actual_playbook.yml:
- include: my_fake_role_playbooks/user_and_apache.yml p_hosts=[host1, host2]
* код не проверен.
НТН
Ответ 3
Вы можете просто решить эту проблему с помощью другой зависимости либо в вашей неназванной <role>
, либо в роли apache
.
Весь контент новой роли прокси-пользователя:
---
- user: name=proxy
...
Затем в roles/apache/meta/main.yml
добавьте к нему зависимость.
---
dependencies:
- proxy-user
...
Или установите его в roles/<role>/meta/main.yml
:
---
dependencies:
- proxy-user
- { role: apache, user: proxy }
...
Ответ 4
Просто нужно было решить проблему, реальная проблема заключается в том, что предварительная задача, скорее всего, несколько более конкретна, чем роль. Выполнение пост-задачи легко, потому что вы просто создадите новую зависимую роль, это называется
"роль обертки"... или, по крайней мере, то, что они называют этой идеей в шеф-поваре, когда вы пытаетесь что-то расширить.
Для предварительной задачи вам нужно немного изменить иерархию, используя "роль обертки" и то, что я называю "ролью сестры". Таким образом, логика зависимости будет выглядеть как
- роль обертки
- Роль сестры
- оригинальная роль
Оболочка имеет две зависимости, но обязательно добавьте роль "sibling" сначала в список зависимостей. Поскольку Ansible будет идти сверху вниз.
Наконец, вы должны поместить свои vars в роль обертки, чтобы вы могли перезаписать их из учебника. Вы хотите, чтобы переменные следовали за иерархией, насколько это возможно, и не перепрыгивайте через братьев и сестер.
Ответ 5
У меня есть аналогичная потребность, и я решил ее, указав переменную в роли vars. То есть, создавая <role>/vars/main.yml
с
---
user: proxy
который должен переопределить переменную user
, определенную в модуле apache, при написании ее в вашем каталоге defaults
нет.
Я использую unsible 1.9, не уверен, как долго это поведение присутствует.
Ответ 6
Как и в случае с Ansible 2.2, вы можете использовать include_role
.
https://docs.ansible.com/ansible/include_role_module.html
- user: name=proxy
- include_role:
name: apache
vars:
user: proxy