296 votes

Exécuter la commande sur l'hôte Ansible

Est-il possible d'exécuter des commandes sur l'hôte Ansible ?

Mon scénario est le suivant : je veux faire un checkout d'un serveur git hébergé en interne (et qui n'est pas accessible en dehors du pare-feu de l'entreprise). Ensuite, je veux télécharger le checkout (tarballed) vers le serveur de production (hébergé à l'extérieur).

Pour le moment, j'envisage d'exécuter un script qui effectue le checkout, le tarballs, puis exécute le script de déploiement - mais si je pouvais intégrer cela dans Ansible, ce serait préférable.

4voto

Android Control Points 317

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.

1voto

Deepak kumar Points 1
ansible your_server_name -i custom_inventory_file_name -m -a "uptime"

Le module par défaut est le module de commande, donc command n'est pas nécessaire.

Si vous avez besoin de lancer une commande avec des privilèges élevés, utilisez -b à la fin de la même commande.

ansible your_server_name -i custom_inventory_file_name -m -a "uptime" -b

-1voto

omi Points 1

Vous pouvez essayer de cette façon

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X