Maîtriser les commandes ad-hoc essentielles pour des tâches Ansible rapides

Utilisez les commandes ad-hoc Ansible pour des vérifications rapides, des correctifs ponctuels, des modifications de fichiers et la collecte de faits sans écrire de playbook.

Maîtrise des commandes ad-hoc essentielles pour des tâches Ansible rapides

Les commandes ad-hoc Ansible vous permettent d'exécuter une tâche rapide sur un hôte ou un groupe entier. Elles sont utiles lorsque vous devez tester l'accès, vérifier l'espace disque, copier un fichier, redémarrer un service ou inspecter des faits sans écrire de playbook au préalable.

Elles ne remplacent pas les playbooks. Utilisez-les pour un travail immédiat, puis déplacez les tâches répétées ou risquées dans une automatisation versionnée.

Structure de commande de base

Une commande ad-hoc suit cette forme :

ansible <motif> -m <nom_module> -a "<arguments_module>" [options]

Le motif d'hôte sélectionne les cibles de l'inventaire. Le module décide ce que fait Ansible. Les arguments transmettent des valeurs spécifiques au module.

Les options courantes incluent :

  • -i <inventaire> ou --inventory <inventaire> : utiliser un fichier d'inventaire ou une source d'inventaire spécifique.
  • -u <utilisateur> ou --user <utilisateur> : se connecter en tant qu'utilisateur distant spécifique.
  • -b ou --become : utiliser l'élévation de privilèges, généralement sudo.
  • -k ou --ask-pass : demander le mot de passe SSH.
  • -K ou --ask-become-pass : demander le mot de passe sudo.
  • --limit <sous-ensemble> : réduire davantage les hôtes sélectionnés.

Si vous ne passez pas -i, Ansible utilise son inventaire configuré. Sur de nombreux systèmes, il s'agit de /etc/ansible/hosts, mais votre ansible.cfg peut le modifier.

Tester l'accès avec ping

Le module ping n'envoie pas de paquets ICMP echo. Il se connecte via le transport normal d'Ansible, exécute un petit module sur la cible et attend pong en retour.

ansible all -m ping

Pour un groupe :

ansible serveursweb -m ping

Un résultat réussi ressemble à ceci :

web01.example.com | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Si cela échoue, corrigez l'inventaire, le DNS, les clés SSH, l'utilisateur distant, les paramètres sudo ou la disponibilité de Python avant de résoudre les tâches de niveau supérieur.

Exécuter des commandes simples avec command

Le module command exécute un programme directement sur l'hôte distant. Il n'invoque pas de shell, donc les pipes, redirections, expansions de glob et expansions de $VARIABLE ne fonctionnent pas comme dans votre terminal.

Vérifier l'uptime :

ansible serveursweb -m command -a "uptime"

Vérifier l'utilisation du disque :

ansible all -m command -a "df -h"

Lister un répertoire protégé avec sudo :

ansible serveursbd -m command -a "ls -l /var/log" --become

Utilisez command en premier lorsque vous n'avez pas besoin des fonctionnalités du shell. C'est plus facile à raisonner et évite une interprétation accidentelle du shell.

Utiliser shell uniquement lorsque vous avez besoin des fonctionnalités du shell

Le module shell exécute la commande via un shell sur l'hôte distant. Utilisez-le pour les pipes, redirections, expansions de variables et conditionnels shell.

Trouver les plus grands répertoires de logs :

ansible basesdedonnees -m shell -a "du -sh /var/log/* | sort -rh | head -n 5"

Vérifier une variable d'environnement distante :

ansible all -m shell -a "printf '%s\n' \"$PATH\""

Soyez prudent avec les entrées dynamiques. Si des valeurs fournies par l'utilisateur sont insérées dans une commande shell sans guillemets ni validation, vous pouvez créer un bug d'injection de commande.

Pour les modifications de fichiers, préférez un module dédié plutôt qu'une redirection shell. Par exemple, ajoutez une ligne gérée avec lineinfile :

ansible serveursweb -m lineinfile -a "path=/etc/app/app.conf line='feature_enabled=true' create=yes" --become

C'est plus sûr et plus reproductible que d'ajouter avec echo ... >> fichier.

Copier des fichiers avec copy

Le module copy transfère des fichiers de votre nœud de contrôle vers les hôtes gérés.

ansible serveursweb -m copy -a "src=./myscript.sh dest=/tmp/myscript.sh mode=0755"

Copier un fichier de configuration nécessitant la propriété root :

ansible all -m copy -a "src=./app.conf dest=/etc/app/app.conf owner=root group=root mode=0644" --become

Si la destination a déjà le même contenu et les mêmes métadonnées, Ansible signale aucun changement.

Gérer les chemins avec file

Utilisez le module file pour créer des répertoires, supprimer des chemins, définir la propriété, les permissions ou créer des liens symboliques.

Créer un répertoire :

ansible serveursapp -m file -a "path=/opt/my_app state=directory mode=0755 owner=app group=app" --become

Supprimer un ancien fichier :

ansible hote1 -m file -a "path=/tmp/old_file.txt state=absent"

Créer un lien symbolique :

ansible serveursapp -m file -a "src=/opt/my_app/releases/current dest=/opt/my_app/current state=link"

Collecter des faits avec setup

Le module setup collecte des faits sur un hôte, y compris le système d'exploitation, le réseau, le CPU, la mémoire et les détails des périphériques.

Collecter tous les faits d'un hôte :

ansible serveurweb1 -m setup

Filtrer les faits lorsque vous n'avez besoin que d'un petit sous-ensemble :

ansible all -m setup -a "filter=ansible_distribution*"

La sortie peut être volumineuse, donc le filtrage rend le dépannage lisible.

Choisir entre commandes ad-hoc et playbooks

Utilisez les commandes ad-hoc pour les vérifications rapides et les tâches ponctuelles :

  • Tester la connectivité avec ping.
  • Vérifier l'état avec command.
  • Copier un fichier connu avec copy.
  • Créer ou supprimer un chemin avec file.
  • Collecter des faits lors du dépannage.

Utilisez les playbooks lorsque la tâche est répétée, en plusieurs étapes, examinée par des collègues, ou suffisamment risquée pour nécessiter un contrôle de version et une structure prévisible.

Vérifications de sécurité avant d'exécuter

Vérifiez le motif d'hôte avant d'exécuter quoi que ce soit de destructeur :

ansible serveursweb --list-hosts

Utilisez --limit lorsque vous souhaitez un rayon d'impact plus restreint :

ansible all --limit web01.example.com -m ping

N'oubliez pas que command et shell ne sont pas automatiquement idempotents. Une commande comme useradd deploy peut échouer lors de la deuxième exécution à moins que vous ne l'écriviez de manière défensive. Les modules tels que user, file, copy et lineinfile vous offrent généralement un comportement de répétition plus sûr.

À retenir

Les commandes ad-hoc Ansible sont idéales pour des opérations rapides et ciblées. Commencez par ping, utilisez command pour les vérifications simples, réservez shell pour la syntaxe shell réelle, et préférez les modules comme copy, file, lineinfile et setup lorsqu'ils correspondent à la tâche.