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.

409voto

Lorin Hochstein Points 11816

Oui, vous pouvez exécuter des commandes sur l'hôte Ansible. Vous pouvez spécifier que toutes les tâches d'une lecture s'exécutent sur l'hôte Ansible, ou vous pouvez marquer des tâches individuelles à exécuter sur l'hôte Ansible.

Si vous voulez exécuter une pièce entière sur l'hôte Ansible, alors spécifiez hosts: 127.0.0.1 y connection:local dans la pièce, par exemple :

- name: a play that runs entirely on the ansible host
  hosts: 127.0.0.1
  connection: local
  tasks:
  - name: check out a git repository
    git: repo=git://foosball.example.org/path/to/repo.git dest=/local/path

Voir Livres de jeu locaux dans la documentation Ansible pour plus de détails.

Si vous voulez juste exécuter une seule tâche sur votre hôte Ansible, vous pouvez utiliser local_action pour spécifier qu'une tâche doit être exécutée localement. Par exemple :

- name: an example playbook
  hosts: webservers
  tasks:
  - ...

  - name: check out a git repository
    local_action: git repo=git://foosball.example.org/path/to/repo.git dest=/local/path

Voir Contrôler le lieu d'exécution des tâches : délégation et actions locales dans la documentation Ansible pour plus de détails.

Edit : Vous pouvez éviter d'avoir à taper connection: local dans votre jeu en l'ajoutant à votre inventaire :

localhost ansible_connection=local

(Ici, vous utiliserez "localhost" au lieu de "127.0.0.1" pour faire référence à la pièce).

Edit : Dans les nouvelles versions d'ansible, vous n'avez plus besoin d'ajouter la ligne ci-dessus à votre inventaire, ansible suppose qu'elle est déjà là.

8 votes

J'avais aussi besoin sudo: no dans le scénario de délégation

0 votes

Comment exécuter une connexion locale en tant qu'utilisateur Root ?

2 votes

@BilalUsean ansible-playbook -K playbook.yml où -K pour Racine

99voto

Gordon Dickens Points 319

J'ai trouvé d'autres façons de les écrire qui sont un peu plus lisibles, à mon avis.

- name: check out a git repository
  local_action: 
    module: git
    repo: git://foosball.example.org/path/to/repo.git
    dest: /local/path

OU

- name: check out a git repository
  local_action: git
  args:
    repo: git://foosball.example.org/path/to/repo.git
    dest: /local/path

67voto

mxf Points 510

Je voudrais partager qu'Ansible peut être exécuté sur localhost via shell :

ansible all -i "localhost," -c local -m shell -a 'echo hello world'

Cela peut être utile pour des tâches simples ou pour un apprentissage pratique d'Ansible.

L'exemple de code est tiré de ce bon article :

Exécution du playbook ansible en localhost

28voto

c_agrawal Points 321

Vous pouvez utiliser delegate_to pour exécuter des commandes sur votre hôte Ansible (hôte admin), à partir duquel vous exécutez votre jeu Ansible. Par exemple :

Supprime un fichier s'il existe déjà sur l'hôte Ansible :

 - name: Remove file if already exists
   file:
    path: /tmp/logfile.log
    state: absent
    mode: "u+rw,g-wx,o-rwx"
   delegate_to: 127.0.0.1

Créer un nouveau fichier sur l'hôte Ansible :

 - name: Create log file
   file:
    path: /tmp/logfile.log
    state: touch
    mode: "u+rw,g-wx,o-rwx"
   delegate_to: 127.0.0.1

5voto

mvr Points 356

En développant la réponse de @gordon, voici un exemple de syntaxe lisible et de passage d'arguments avec le module shell/commande (ceux-ci diffèrent du module git en ce qu'il y a des arguments obligatoires mais de forme libre, comme indiqué par @ander)

\- name: "release tarball is generated"
  local\_action:
    module: shell
    \_raw\_params: git archive --format zip --output release.zip HEAD
    chdir: "files/clones/webhooks"

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