web-dev-qa-db-fra.com

Comment écrire un gestionnaire Ansible avec plusieurs tâches?

En réponse à un changement, plusieurs tâches connexes doivent être exécutées. Comment écrire un gestionnaire Ansible avec plusieurs tâches?

Par exemple, je voudrais un gestionnaire qui redémarre un service uniquement s'il est déjà démarré:

- name: Restart conditionally
  Shell: check_is_started.sh
  register: result

- name: Restart conditionally step 2
  service: name=service state=restarted
  when: result
61
timdiels

Il existe une solution appropriée à ce problème à partir de Ansible 2.2.

les gestionnaires peuvent également "écouter" les sujets génériques et les tâches peuvent les notifier comme suit:

handlers:
    - name: restart memcached
      service: name=memcached state=restarted
      listen: "restart web services"
    - name: restart Apache
      service: name=Apache state=restarted
      listen: "restart web services"

tasks:
    - name: restart everything
      command: echo "this task will restart the web services"
      notify: "restart web services"

Cette utilisation facilite beaucoup le déclenchement de plusieurs gestionnaires. Il sépare également les gestionnaires de leurs noms, ce qui facilite le partage des gestionnaires entre les playbooks et les rôles.

En particulier à la question, cela devrait fonctionner:

- name: Check if restarted
  Shell: check_is_started.sh
  register: result
  listen: Restart processes

- name: Restart conditionally step 2
  service: name=service state=restarted
  when: result
  listen: Restart processes

et dans la tâche, notifier les gestionnaires via 'Redémarrer les processus'

http://docs.ansible.com/ansible/playbooks_intro.html#handlers-running-operations-on-change

66
mkadan

Dans votre fichier de gestionnaire, enchaînez les différentes étapes à l’aide de notify.

- name: Restart conditionally
  debug: msg=Step1
  changed_when: True
  notify: Restart conditionally step 2

- name: Restart conditionally step 2
  debug: msg=Step2
  changed_when: True
  notify: Restart conditionally step 3

- name: Restart conditionally step 3
  debug: msg=Step3

Puis faites-le à partir d'une tâche avec notify: Restart conditionally.

Notez que vous ne pouvez informer que les gestionnaires situés en dessous du gestionnaire actuel. Ainsi, par exemple, Restart conditionally step 2 ne peut pas notifier Restart conditionally.

Source: #ansible sur irc.freenode.net. Je ne sais pas si cela continuera à fonctionner à l'avenir car ce n'est pas mentionné dans les documents officiels.

50
timdiels

À partir de Ansible 2.0, vous pouvez utiliser une action include dans votre gestionnaire pour exécuter plusieurs tâches.

Par exemple, placez vos tâches dans un fichier séparé restart_tasks.yml (si vous utilisez des rôles, cela ira dans le sous-répertoire tâches, et non dans le sous-répertoire des gestionnaires):

- name: Restart conditionally step 1
  Shell: check_is_started.sh
  register: result

- name: Restart conditionally step 2
  service: name=service state=restarted
  when: result

Votre gestionnaire serait alors simplement:

- name: Restart conditionally
  include: restart_tasks.yml

Source: fils de discussion sur github: https://github.com/ansible/ansible/issues/1427

27
Alexander Klauer