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?
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 :
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
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 }
...
À 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
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,
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.
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.