Comment spécifier des pré-tâches possibles pour un rôle?

comment définir un pretask pour les dépendances de rôle. J'ai actuellement un apache rôle d'une variable utilisateur, donc dans mon propre rôle dans <role>/meta/main.yml je fais quelque chose comme:

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

Le problème maintenant est que je n'ai toujours pas l'utilisateur-je spécifier et quand le rôle essaie de démarrer apache serveur sous un utilisateur inexistant, je reçois une erreur.

j'ai essayé de créer une tâche dans <role>/tasks/main.yml comme:

---
- user: name=proxy

Mais l'utilisateur est créé uniquement après l'exécution de l' apache tâche dans les dépendances (ce qui est à prévoir). Donc, est-il possible de créer une tâche de créer un utilisateur avant d'exécuter les rôles dans les dépendances?

31
demandé sur Kęstutis 2015-03-25 17:39:54

6 réponses

j'utilise pre_tasks pour certaines tâches avant de rôles, merci pour l' 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 :
19
répondu Chu-Siang Lai 2017-05-23 12:17:14

brève réponse: Je ne pense pas que la langue permette de spécifier pre_tasks pour les rôles.

vous pourriez tricher / contourner en déplaçant la création de l'utilisateur à un playbook séparé et includeing le playbook au lieu de role. Quelque chose comme ceci:

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]

* le code n'a pas été testé.

HTH

9
répondu Kashyap 2015-03-25 19:22:58

vous pouvez simplement résoudre cela avec une autre dépendance soit dans votre unnamed <role> ou apache rôle.

Tout le contenu d'un nouveau proxy-rôle de l'utilisateur:

---
- user: name=proxy
...

Puis roles/apache/meta/main.yml ajouter une dépendance.

---
dependencies:
  - proxy-user
...

Ou le mettre dans roles/<role>/meta/main.yml:

---
dependencies:
  - proxy-user
  - { role: apache, user: proxy }
...
9
répondu udondan 2015-05-22 13:20:04

Juste eu à traiter le problème, le vrai problème est que la pré-tâche est très probablement un peu plus spécifique que la le rôle. Faire une post-tâche est facile, parce que vous feriez tout simplement un nouveau rôle dépendant, cela est connu comme un "wrapper"... ou du moins c'est ce qu'ils appellent l'idée dans chef, pour quand vous essayez de prolonger quelque chose.

pour une pré-tâche, vous devez modifier un peu la hiérarchie, en utilisant un "rôle d'enveloppeur" et ce que j'appelle un "rôle de frère". Donc la dépendance la logique apparaîtrait comme,

  • rôle d'emballage
    • rôle de la fratrie
    • rôle original

le wrapper a deux dépendances, mais assurez-vous d'ajouter le "rôle de frère" en premier dans la liste de dépendances. Puisque L'Ansible ira de haut en bas.

enfin, vous devriez placer vos vars dans le rôle de wrapper, de sorte que vous puissiez les écraser du playbook. Vous voulez que les variables suivent la hiérarchie, autant que possible, et ne pas sauter à travers les frères et sœurs.

6
répondu J. M. Becker 2015-11-05 02:07:16

à partir de Ansible 2.2, vous pouvez utiliser include_role. https://docs.ansible.com/ansible/include_role_module.html

- user: name=proxy

- include_role:
    name: apache
  vars:
    user: proxy
4
répondu kimamula 2017-03-08 07:37:37

j'ai un besoin similaire, et je l'ai résolu en définissant la variable dans le rôle de vars. Qui est, la création d'un <role>/vars/main.yml

---
user: proxy

qui devrait remplacer le user variable définie dans le module apache, en l'écrivant dans votre module defaults répertoire ne fonctionne pas.

j'utilise ansible 1.9, Je ne sais pas depuis combien de temps ce comportement est présent.

1
répondu Javier Palacios 2015-08-20 22:52:23