Depuis l'Ansible documentation :
Délégation Cette question n'est pas vraiment spécifique à la mise à jour continue, mais elle se pose fréquemment dans ces cas-là.
Si vous voulez exécuter une tâche sur un hôte en faisant référence à d'autres hôtes, utilisez le mot clé 'delegate_to' sur une tâche. C'est idéal pour placer des nœuds dans un pool à charge équilibrée, ou pour les supprimer. Il est également très utile pour contrôler les fenêtres d'interruption. Sachez que cela n'a pas de sens de déléguer toutes les tâches, debug, add_host, include, etc. sont toujours exécutées sur le contrôleur. L'utiliser avec le mot-clé 'serial' pour contrôler le nombre d'hôtes s'exécutant en même temps est également une bonne idée :
---
- hosts: webservers
serial: 5
tasks:
- name: take out of load balancer pool
command: /usr/bin/take_out_of_pool {{ inventory_hostname }}
delegate_to: 127.0.0.1
- name: actual steps would go here
yum:
name: acme-web-stack
state: latest
- name: add back to load balancer pool
command: /usr/bin/add_back_to_pool {{ inventory_hostname }}
delegate_to: 127.0.0.1
Ces commandes seront exécutées sur 127.0.0.1, qui est la machine exécutant Ansible. Il existe également une syntaxe abrégée que vous pouvez utiliser pour chaque tâche : local_action'. Voici le même playbook que ci-dessus, mais en utilisant la syntaxe abrégée pour déléguer à 127.0.0.1 :
---
# ...
tasks:
- name: take out of load balancer pool
local_action: command /usr/bin/take_out_of_pool {{ inventory_hostname }}
# ...
- name: add back to load balancer pool
local_action: command /usr/bin/add_back_to_pool {{ inventory_hostname }}
Un modèle courant consiste à utiliser une action locale pour appeler 'rsync' afin de copier récursivement des fichiers sur les serveurs gérés. Voici un exemple :
---
# ...
tasks:
- name: recursively copy files from management server to target
local_action: command rsync -a /path/to/files {{ inventory_hostname }}:/path/to/target/
Notez que vous devez avoir des clés SSH sans phrase de passe ou un agent ssh configuré pour que cela fonctionne, sinon rsync devra demander une phrase de passe.