web-dev-qa-db-fra.com

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 que je souhaite utiliser un serveur git hébergé en interne (et non accessible en dehors du pare-feu de l'entreprise). Ensuite, je souhaite télécharger la commande (archivée) sur le serveur de production (hébergé en externe).

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

200
Ross

Oui, vous pouvez exécuter des commandes sur l'hôte Ansible. Vous pouvez spécifier que toutes les tâches d'un jeu sont exécutées sur l'hôte Ansible ou vous pouvez indiquer que des tâches individuelles doivent être exécutées sur l'hôte Ansible.

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

Si vous souhaitez uniquement exécuter une seule tâche sur votre hôte Ansible, vous pouvez utiliser local_action pour indiquer 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.

Éditer: Vous pouvez éviter de taper connection: local dans votre jeu en ajoutant ceci à votre inventaire:

localhost ansible_connection=local

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

Éditer: dans les nouvelles versions d’ansible, il n’est plus nécessaire d’ajouter la ligne ci-dessus à votre inventaire, ansible suppose qu’elle est déjà présente.

298
Lorin Hochstein

J'ai trouvé deux 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

OR

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

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 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écuter ansible playbook dans localhost

26
mxf

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

Supprimer 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
10
c_agrawal

En développant la réponse de @gordon, voici un exemple de syntaxe lisible et d'argument transmis avec le module Shell/command (ceux-ci diffèrent du module git en ce sens qu'il existe des arguments obligatoires mais de forme libre, comme noté par @ander

- nom: "l'archive de publication est générée" 
 action_locale: 
 module: Shell 
 _raw_params: git archive --format Zip --output release.Zip HEAD 
 chdir: "fichiers/clones/webhooks" 
4
mvr

De la Ansible documentation :

Délégation Ce n’est pas vraiment une mise à jour progressive, mais revient souvent dans ces cas-là.

Si vous souhaitez 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. Ceci est idéal pour placer ou supprimer des nœuds dans un pool à équilibrage de charge. 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. Le débogage, l'add_Host, l'inclusion, etc. sont toujours exécutés sur le contrôleur. L’utiliser avec le mot clé ‘serial’ pour contrôler le nombre d’hôtes s’exécutant simultanément 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, c'est-à-dire la machine sur laquelle Ansible est exécuté. Il existe également une syntaxe abrégée que vous pouvez utiliser tâche par tâche: ‘local_action’. Voici le même livre de jeu 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 de manière récursive 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 secrète ou un agent ssh configuré pour que cela fonctionne, sinon rsync devra demander une phrase secrète.

0
Android Control

vous pouvez essayer de cette façon

0
omi
ansible your_server_name -i custom_inventory_file_name -m -a "uptime"

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

Si vous devez émettre 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
0
Deepak kumar