Подтвердить что ты не робот

Как указать допустимые предварительные задания для роли?

Как следует определять определение pretask для зависимостей ролей. В настоящее время у меня есть роль apache, у которой есть пользовательская переменная, поэтому в моей собственной роли в <role>/meta/main.yml я делаю что-то вроде:

---
dependencies:
  - { role: apache, user: proxy }

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

Я попытался создать задачу в <role>/tasks/main.yml, например:

---
- user: name=proxy

Но пользователь создается только после запуска задачи apache в зависимостях (что и следовало ожидать). Итак, есть ли способ создать задачу, которая создавала бы пользователя перед запуском ролей в зависимостях?

4b9b3361

Ответ 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, не уверен, как долго это поведение присутствует.