web-dev-qa-db-fra.com

Comment spécifier des prétasks ansibles pour un rôle?

Comment devrait-on s'y prendre pour définir un prétraitement pour les dépendances de rôle. J'ai actuellement un rôle Apache avec 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 à ce stade est que je n'ai toujours pas l'utilisateur que je spécifie et lorsque le rôle essaie de démarrer Apache serveur sous un utilisateur inexistant, un message d'erreur s'affiche.

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

---
- user: name=proxy

Mais l'utilisateur n'est créé qu'après avoir exécuté la tâche Apache dans des dépendances (ce qui est normal). Alors, y a-t-il un moyen de créer une tâche qui créerait un utilisateur avant d'exécuter des rôles dans des dépendances?

42
Kęstutis

J'utilise les pré-tâches pour effectuer certaines tâches avant les rôles, grâce à 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 :
27
Chu-Siang Lai

Réponse courte: Je ne pense pas que le langage permette de spécifier pre_tasks pour les rôles.

Vous pouvez tricher/contourner le problème en déplaçant la création de l'utilisateur vers un livre de lecture séparé et en remplaçant include le livre de lecture au lieu de role. Quelque chose comme ça:

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'est pas testé.

HTH

10
Kashyap

Vous pouvez simplement résoudre ceci avec une autre dépendance, soit dans votre nom non nommé <role> ou dans le rôle Apache.

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

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

Puis dans roles/Apache/meta/main.yml ajoutez-lui une dépendance.

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

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

---
dependencies:
  - proxy-user
  - { role: Apache, user: proxy }
...
10
udondan

À 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
8
kimamula

Le problème, c’est que la tâche préliminaire est très probablement un peu plus spécifique que le rôle. Effectuer une tâche ultérieure est facile, car vous associez simplement un nouveau rôle à un rôle, ce que l'on appelle un "rôle wrapper" ... ou du moins c'est ce qu'ils appellent l'idée du chef, lorsque vous essayez d'étendre quelque chose.

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

  • rôle d'emballage
    • rôle fraternel
    • rôle original

Le wrapper a deux dépendances, mais veillez à ajouter le "rôle frère" en premier dans la liste des dépendances. Depuis Ansible ira de haut en bas.

Enfin, vous devez placer vos vars dans le rôle wrapper, afin de pouvoir les écraser à partir du livre de lecture. Vous voulez que les variables suivent la hiérarchie, autant que possible, et ne sautent pas entre les frères et sœurs.

6
J. M. Becker

J'ai un besoin similaire et je l'ai résolu en définissant la variable dans le rôle vars. C'est-à-dire créer un <role>/vars/main.yml avec

---
user: proxy

cela devrait remplacer la variable user définie dans le module Apache, alors que l'écrire dans le répertoire de votre module defaults ne le fait pas.

J'utilise ansible 1.9, je ne sais pas depuis combien de temps ce problème est présent.

1
Javier Palacios