RousselTMLEARNING

Automatisation

Ansible : les commandes Ad-Hoc

Exécuter des actions immédiates sur un parc de serveurs avec ansible : modules ping, command, shell, copy, apt, service, setup, parallélisme, privilèges et bonnes pratiques.

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.

Étapes d'exécution d'une commande ad-hoc
Ansible n'installe aucun agent : il pousse le module par SSH.

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érences

2. 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" -o
Sortie de ansible -m ping
Un hôte injoignable n'interrompt pas l'exécution sur les autres.

Exé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" -b
Bonne Pratique : Préférez command à shell chaque 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": false

3. 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 --diff
Erreur Courante : --check n'est pas supporté par tous les modules : command et shell sont 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

Pour aller plus loin