web-dev-qa-db-fra.com

Ansible Handler notifier vs s'inscrire

Ainsi, après avoir lu la documentation Ansible, j'ai découvert que Handlers ne sont déclenchés que lorsque les tâches sont modifiées, par exemple:

some tasks ...
notify: nginx_restart

# our handler
- name: nginx_restart

contre

some tasks ...
register: nginx_restart

# do this after nginx_restart changes
when: nginx_restart|changed

Y a-t-il une différence entre ces 2 méthodes? Quand devrais-je utiliser chacun d'eux? Pour moi, register semble avoir plus de fonctionnalités ici, à moins que quelque chose ne me manque ...

51
huygn

Il y a quelques différences et ce qui est mieux dépend de la situation.

Les gestionnaires ne seront visibles dans la sortie que s'ils ont été réellement exécutés. Non notifié, il n'y aura aucune tâche ignorée dans la sortie Ansibles. Les tâches ont toujours une sortie, peu importe si sauté, exécuté avec changement ou sans. (sauf qu'ils sont exclus via tags/skip-tags)

Les gestionnaires peuvent être appelés depuis n'importe quel rôle. Cela devient pratique si vous avez des rôles plus complexes qui dépendent les uns des autres. Supposons que vous ayez un rôle dans la gestion d'iptables, mais que les règles que vous définissez dépendent en réalité d'autres rôles (par exemple, rôle de base de données, rôle redis, etc.). Chaque rôle peut ajouter ses règles à un fichier de configuration et à la fin, vous devez notifier les iptables. rôle de recharger iptables si modifié.

Les gestionnaires par défaut sont exécutés à la fin du livre de jeu. Les tâches seront exécutées immédiatement où elles sont définies. De cette façon, vous pouvez configurer toutes vos applications et à la fin, le redémarrage du service pour toutes les applications modifiées sera déclenché par gestionnaire. Cela peut être dangereux cependant. Si votre playbook échoue après la notification d'un gestionnaire, celui-ci ne sera pas appelé. Si vous réexécutez le livre de lecture, il se peut que l'état de la tâche qui déclenche ne soit plus modifié et que le gestionnaire ne soit pas informé. En conséquence, Ansible n'est en réalité pas idempotente. Depuis Ansible 1.9.1, vous pouvez appeler Ansible avec l'option --force-handler Ou définir force_handlers = True Dans votre ansible.cfg Pour même renvoyer tous les gestionnaires notifiés après l'échec du playbook. ( Voir la documentation )

Si vous souhaitez que vos gestionnaires soient déclenchés à un point spécifique (par exemple, vous avez configuré votre système pour utiliser un DNS interne et souhaitez maintenant résoudre un hôte via ce DNS), vous pouvez vider tous les gestionnaires en définissant une tâche telle que:

- meta: flush_handlers

Un gestionnaire ne serait appelé qu'une seule fois, peu importe le nombre de fois qu'il a été notifié. Imaginez que vous disposiez d'un service qui dépend de plusieurs fichiers de configuration (par exemple, bind/named: rev, zone, root.db, rndc.key, named.conf) et que vous souhaitez redémarrer nommé si l'un de ces fichiers était modifié. Avec les gestionnaires, vous notifiez simplement de chaque tâche qui gère ces fichiers. Sinon, vous devez enregistrer 5 vars inutiles, puis les vérifier tous dans votre tâche de redémarrage.

Personnellement je préfère les handlers. Cela semble beaucoup plus propre que de traiter avec register. Les tâches déclenchées par registre étaient plus sûres avant Ansible 1.9.1.

67
udondan

Sur la page variables variables , vous pouvez voir comment fonctionne register.

Une autre utilisation majeure des variables consiste à exécuter une commande et à utiliser le résultat de cette commande pour enregistrer le résultat dans une variable.

Les variables enregistrées sont comme des faits:

Les variables effectivement enregistrées sont comme des faits.

Ceci est très différent de notify, qui déclenche des gestionnaires. Il n'enregistre ni ne stocke les variables ou les faits.

4
Felipe Alvarez

avec ignore_errors: True vous pouvez empêcher le gestionnaire défaillant d’arrêter les autres gestionnaires définis après son exécution continue

1
Bruce Zu