Commandes ad-hoc
Objectifs du chapitre
- Comprendre les commandes ad-hoc
- Utiliser les modules courants
- Exécuter des tâches rapides
- Diagnostiquer les systèmes
1 - Qu'est-ce qu'une commande ad-hoc ?
Définition
Une commande ad-hoc est une commande Ansible exécutée directement en ligne de commande, sans playbook.
Syntaxe
ansible <pattern> -m <module> -a "<arguments>" [options]
| Élément | Description | Exemple |
|---|---|---|
pattern | Hôtes cibles | all, webservers, web-01 |
-m | Module à utiliser | ping, shell, apt |
-a | Arguments du module | "name=nginx state=present" |
Quand utiliser ?
2 - Modules essentiels
ping - Test de connectivité
# Tester tous les hôtes
ansible all -m ping
# Tester un groupe
ansible webservers -m ping
# Résultat
web-01 | SUCCESS => {
"changed": false,
"ping": "pong"
}
info
Le module ping ne fait pas un ping ICMP ! Il vérifie que :
- SSH fonctionne
- Python est disponible
- Ansible peut s'exécuter
command - Exécuter une commande
# Exécuter une commande simple
ansible all -m command -a "uptime"
# Equivalent (command est le module par défaut)
ansible all -a "uptime"
# Voir l'espace disque
ansible all -a "df -h"
# Vérifier un service
ansible all -a "systemctl status nginx"
shell - Commandes shell avancées
# Utiliser des pipes et redirections
ansible all -m shell -a "ps aux | grep nginx"
# Variables d'environnement
ansible all -m shell -a "echo $HOME"
# Redirection
ansible all -m shell -a "cat /var/log/syslog | tail -20"
3 - Gestion des fichiers
copy - Copier des fichiers
# Copier un fichier
ansible webservers -m copy -a "src=/local/file.txt dest=/remote/file.txt"
# Avec permissions
ansible webservers -m copy -a "src=nginx.conf dest=/etc/nginx/nginx.conf owner=root group=root mode=0644"
# Créer un fichier avec contenu
ansible all -m copy -a "content='Hello World' dest=/tmp/hello.txt"
file - Gérer fichiers et répertoires
# Créer un répertoire
ansible all -m file -a "path=/opt/myapp state=directory mode=0755"
# Créer un lien symbolique
ansible all -m file -a "src=/opt/myapp/current dest=/opt/myapp/latest state=link"
# Supprimer un fichier
ansible all -m file -a "path=/tmp/old_file.txt state=absent"
# Changer les permissions
ansible all -m file -a "path=/var/log/app.log owner=app group=app mode=0640"
fetch - Récupérer des fichiers
# Récupérer un fichier depuis les serveurs
ansible webservers -m fetch -a "src=/var/log/nginx/error.log dest=./logs/ flat=yes"
# Récupérer avec structure
ansible all -m fetch -a "src=/etc/hostname dest=./backup/"
4 - Gestion des packages
apt (Debian/Ubuntu)
# Mettre à jour le cache
ansible webservers -m apt -a "update_cache=yes" --become
# Installer un package
ansible webservers -m apt -a "name=nginx state=present" --become
# Installer plusieurs packages
ansible webservers -m apt -a "name=nginx,vim,htop state=present" --become
# Supprimer un package
ansible webservers -m apt -a "name=apache2 state=absent" --become
# Mettre à jour tous les packages
ansible webservers -m apt -a "upgrade=dist" --become
yum/dnf (RHEL/CentOS)
# Installer
ansible databases -m yum -a "name=postgresql15-server state=present" --become
# Avec dnf
ansible databases -m dnf -a "name=postgresql15-server state=present" --become
package (générique)
# Fonctionne sur tous les systèmes
ansible all -m package -a "name=git state=present" --become
5 - Gestion des services
service/systemd
# Démarrer un service
ansible webservers -m service -a "name=nginx state=started" --become
# Arrêter un service
ansible webservers -m service -a "name=nginx state=stopped" --become
# Redémarrer
ansible webservers -m service -a "name=nginx state=restarted" --become
# Activer au démarrage
ansible webservers -m service -a "name=nginx enabled=yes" --become
# Recharger la configuration
ansible webservers -m service -a "name=nginx state=reloaded" --become
6 - Gestion des utilisateurs
user - Gérer les utilisateurs
# Créer un utilisateur
ansible all -m user -a "name=deploy state=present" --become
# Avec options
ansible all -m user -a "name=deploy shell=/bin/bash groups=sudo append=yes" --become
# Avec clé SSH
ansible all -m user -a "name=deploy generate_ssh_key=yes ssh_key_bits=4096" --become
# Supprimer un utilisateur
ansible all -m user -a "name=olduser state=absent remove=yes" --become
group - Gérer les groupes
# Créer un groupe
ansible all -m group -a "name=developers state=present" --become
# Supprimer un groupe
ansible all -m group -a "name=oldgroup state=absent" --become
authorized_key - Clés SSH
# Ajouter une clé SSH
ansible all -m authorized_key -a "user=deploy key='ssh-rsa AAAA... user@host'" --become
# Depuis un fichier
ansible all -m authorized_key -a "user=deploy key='{{ lookup(\"file\", \"/home/user/.ssh/id_rsa.pub\") }}'" --become
7 - Collecte d'informations
setup - Facts système
# Tous les facts
ansible web-01 -m setup
# Filtrer les facts
ansible web-01 -m setup -a "filter=ansible_distribution*"
# Facts réseau
ansible web-01 -m setup -a "filter=ansible_default_ipv4"
# Facts mémoire
ansible web-01 -m setup -a "filter=ansible_memory_mb"
Exemple de sortie
{
"ansible_distribution": "Ubuntu",
"ansible_distribution_version": "22.04",
"ansible_distribution_release": "jammy",
"ansible_os_family": "Debian"
}
debug - Afficher des informations
# Afficher un message
ansible localhost -m debug -a "msg='Hello from Ansible'"
# Afficher une variable
ansible localhost -m debug -a "var=ansible_version"
8 - Options importantes
Options courantes
# Devenir root (sudo)
ansible all -m apt -a "name=nginx" --become
# Spécifier l'utilisateur become
ansible all -m command -a "id" --become --become-user=postgres
# Demander le mot de passe sudo
ansible all -m command -a "id" --become --ask-become-pass
# Limiter le parallélisme
ansible all -a "uptime" --forks=1
# Mode check (dry-run)
ansible all -m apt -a "name=nginx state=present" --check
# Mode verbose
ansible all -m ping -v
ansible all -m ping -vvv
# Limiter à certains hôtes
ansible all -m ping --limit web-01
9 - Cas d'usage pratiques
Diagnostic système
# Vérifier l'espace disque
ansible all -a "df -h"
# Vérifier la mémoire
ansible all -a "free -m"
# Vérifier les processus
ansible all -m shell -a "ps aux | head -10"
# Vérifier les ports ouverts
ansible all -m shell -a "ss -tlnp"
# Vérifier l'uptime
ansible all -a "uptime"
Maintenance rapide
# Redémarrer un service sur tous les serveurs
ansible webservers -m service -a "name=nginx state=restarted" --become
# Vider un cache
ansible webservers -a "rm -rf /var/cache/nginx/*" --become
# Synchroniser l'heure
ansible all -m command -a "timedatectl set-ntp true" --become
Déploiement rapide
# Copier une configuration
ansible webservers -m copy -a "src=nginx.conf dest=/etc/nginx/nginx.conf backup=yes" --become
# Recharger le service
ansible webservers -m service -a "name=nginx state=reloaded" --become
# Vérifier que ça fonctionne
ansible webservers -m uri -a "url=http://localhost status_code=200"
10 - Bonnes pratiques
Sécurité
# ✅ Éviter shell quand possible
ansible all -m command -a "cat /etc/passwd"
# ❌ Éviter (injection possible)
ansible all -m shell -a "cat $USER_INPUT"
Idempotence
# ✅ Idempotent
ansible all -m file -a "path=/tmp/test state=directory"
# ❌ Non idempotent
ansible all -m shell -a "mkdir /tmp/test"
Documentation
# Toujours vérifier la documentation
ansible-doc apt
ansible-doc -l | grep -i user
Résumé
Points clés
- Utilisez ad-hoc pour les tâches ponctuelles
- Préférez
commandàshellquand possible - N'oubliez pas
--becomepour les tâches privilégiées - Utilisez
--checkpour tester avant d'exécuter
Exercices pratiques
- Testez la connectivité de tous vos hôtes
- Vérifiez l'espace disque sur le groupe webservers
- Installez vim sur tous les serveurs
- Créez un utilisateur "deploy" avec clé SSH