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.
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.
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
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:
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
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"
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.
vous pouvez essayer de cette façon
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