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

247

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

Mon scénario est que je souhaite retirer une commande 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 la caisse (tarballée) sur le serveur de production (hébergé en externe).

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

Ross
la source

Réponses:

347

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 souhaitez exécuter une lecture entière sur l'hôte Ansible, spécifiez hosts: 127.0.0.1et connection:localdans la lecture, 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 Local Playbooks dans la documentation Ansible pour plus de détails.

Si vous souhaitez simplement exécuter une seule tâche sur votre hôte Ansible, vous pouvez utiliser local_actionpour 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 Délégation dans la documentation Ansible pour plus de détails.

Modifier: Vous pouvez éviter d'avoir à taper connection: localvotre jeu en l'ajoutant à votre inventaire:

localhost ansible_connection=local

(Ici, vous utiliseriez "localhost" au lieu de "127.0.0.1" pour faire référence à la lecture).

Modifier: 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à.

Lorin Hochstein
la source
8
J'avais aussi besoin sudo: nodans le scénario de délégation
Danimal
comment exécuter une connexion locale en tant qu'utilisateur root?
Bilal Usean
@BilalUsean ansible-playbook -K playbook.ymloù -K pour root
Kush
74

J'ai trouvé quelques autres façons d'écrire celles-ci qui sont un peu plus lisibles à mon humble 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
Gordon Dickens
la source
3
Intéressant, comment cela fonctionnerait-il avec la commande ? Parce que pour autant que je sache, nous ne pouvons pas utiliser le param free_form pour définir la commande qui sera exécutée
Ander
@Ander La même chose s'applique au shellmodule.
ceving
6
pour une utilisation avec la commande / shell, ce que vous voulez est le "_raw_params"
mvr
41

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

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

Cela pourrait ê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écuter un playbook ansible dans localhost

mxf
la source
2
Quelle est la signification de la virgule (,) après localhost. J'ai remarqué qu'il est vital que la commande fonctionne
Tuomas Toivonen
2
la virgule de fin consiste à définir un inventaire simple en pointant vers un fichier. C'est une sorte de piratage non documenté, et pourrait disparaître (iirc).
senorsmile
19

Vous pouvez utiliser delegate_topour exécuter des commandes sur votre hôte Ansible (hôte admin), à partir d'où vous exécutez votre jeu Ansible. Par exemple:

Supprimez 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éez 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
c_agrawal
la source
1
Jusqu'à présent, cela semble être la solution la plus propre à toute réponse.
poussins
1
Se mettre d'accord. Moins nouvelle syntaxe, plus flexible (déléguer ailleurs aussi). Un élément à noter - si becomec'est vrai pour la tâche, il se plaindra de sudo et autres. Cela pourrait se produire directement sur la tâche ou être hérité pour ailleurs.
JL Peyret
4

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

- nom: "l'archive de version est générée"
  action_locale:
    module: shell
    _raw_params: archive git --format zip --output release.zip HEAD
    chdir: "fichiers / clones / webhooks"
mvr
la source
2

De la documentation Ansible :

Délégation Ce n'est pas réellement une mise à jour continue, mais revient fréquemment dans ces cas.

Si vous souhaitez effectuer une tâche sur un hôte en 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 qu'il n'est pas logique de déléguer toutes les tâches, déboguer, ajouter_hôte, inclure, etc. toujours s'exécuter 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 s'exécuteront 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: «action_locale». Voici le même playbook que ci-dessus, mais en utilisant la syntaxe abrégée pour la délégation à 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.

Contrôle Android
la source
0
ansible your_server_name -i custom_inventory_file_name -m -a "uptime"

Le module par défaut est le module de commande, donc le commandmot-clé n'est pas requis.

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

ansible your_server_name -i custom_inventory_file_name -m -a "uptime" -b
Deepak kumar
la source
-1

vous pouvez essayer de cette façon

omi
la source