1. Principe des commandes ad-hoc #
Une action, un module, un ensemble d'hôtes.
Quand les utiliser ? #
Une commande ad-hoc exécute un seul module sur un ou plusieurs hôtes, sans écrire de playbook. C'est l'outil idéal pour les actions ponctuelles : vérifier la connectivité, redémarrer un service, collecter une information, copier un fichier. Dès qu'une action doit être rejouable ou versionnée, elle devient une tâche de playbook.
Syntaxe générale #
ansible <pattern> -i <inventaire> -m <module> -a "<arguments>" [options]
# Options courantes
# -b devenir root (become) -K demander le mot de passe sudo
# -u deploy utilisateur SSH -k demander le mot de passe SSH
# -f 20 nombre de forks (parallélisme) -o sortie sur une ligne
# --check simulation (dry-run) --diff afficher les différences2. Les modules incontournables #
Des commandes prêtes à copier.
Connectivité et informations #
# Test de connexion + Python présent (ce n'est PAS un ping ICMP)
ansible all -m ping
# Faits collectés sur l'hôte (OS, IP, CPU, mémoire, disques...)
ansible web1.lab -m setup
ansible web1.lab -m setup -a "filter=ansible_distribution*"
ansible all -m setup -a "filter=ansible_default_ipv4" -oExécuter des commandes #
# Module command (par défaut) : pas de pipe, pas de variables shell
ansible all -a "uptime"
ansible all -a "df -h /"
ansible webservers -a "systemctl is-active nginx"
# Module shell : interprété par /bin/sh (pipes, redirections, variables)
ansible all -m shell -a "ps aux | grep -c nginx"
ansible all -m shell -a "echo $HOSTNAME > /tmp/who"
# Module raw : sans Python sur la cible (équipements réseau, bootstrap)
ansible newhost -m raw -a "apt-get install -y python3" -bBonne Pratique : Préférezcommandàshellchaque fois que possible : il est plus sûr (pas d'injection) et ses résultats plus prévisibles.
Gérer paquets, services, fichiers et utilisateurs #
# Paquets
ansible webservers -b -m apt -a "name=nginx state=present update_cache=yes"
ansible webservers -b -m dnf -a "name=httpd state=latest"
ansible all -b -m apt -a "upgrade=dist"
# Services
ansible webservers -b -m service -a "name=nginx state=restarted enabled=yes"
ansible webservers -b -m systemd -a "name=nginx state=reloaded daemon_reload=yes"
# Fichiers
ansible all -m copy -a "src=./motd dest=/etc/motd owner=root group=root mode=0644" -b
ansible all -m file -a "path=/opt/app state=directory mode=0755" -b
ansible all -m file -a "path=/tmp/old.log state=absent" -b
ansible all -m fetch -a "src=/var/log/syslog dest=./logs/ flat=no"
# Utilisateurs et groupes
ansible all -b -m user -a "name=deploy groups=sudo shell=/bin/bash append=yes"
ansible all -b -m group -a "name=ops state=present"
# Télécharger, archiver, tâches planifiées
ansible all -m get_url -a "url=https://example.org/app.tgz dest=/tmp/app.tgz checksum=sha256:<hash>"
ansible all -b -m cron -a "name='backup' minute=0 hour=2 job='/usr/local/bin/backup.sh'" Rendre une opération idempotente #
Les modules apt, service, file, copy... décrivent un état souhaité (state=present, started, absent) et ne changent rien si l'état est déjà atteint : la sortie indique "changed": false. Ce n'est pas le cas de command et shell qui s'exécutent systématiquement.
ansible web1.lab -b -m apt -a "name=nginx state=present"
# 1er passage : "changed": true 2e passage : "changed": false3. Contrôler l'exécution #
Parallélisme, privilèges, simulation et sorties.
Forks, serial et timeouts #
ansible all -m ping -f 50 # 50 hôtes en parallèle (défaut : 5)
ansible all -m shell -a "sleep 30" -B 60 -P 5 # tâche asynchrone : 60 s max, sondage toutes les 5 s
ansible all -m ping -T 10 # timeout de connexion 10 sÉlévation de privilèges et authentification #
ansible all -m ping -u deploy --private-key ~/.ssh/id_ed25519
ansible all -b -K -m apt -a "update_cache=yes" # -b become, -K demande le mot de passe sudo
ansible all -b --become-user postgres -m command -a "psql -c 'select 1'" Simulation et différences #
ansible webservers -b -m copy -a "src=nginx.conf dest=/etc/nginx/nginx.conf" --check --diffErreur Courante :--checkn'est pas supporté par tous les modules :commandetshellsont simplement ignorés en mode simulation.
Formats de sortie #
ansible all -m setup -a "filter=ansible_hostname" -o # une ligne par hôte
ANSIBLE_STDOUT_CALLBACK=yaml ansible all -m setup -a "filter=ansible_os_family"
ansible-doc -l | wc -l # nombre de modules disponibles
ansible-doc copy # documentation complète d'un module