Aller au contenu principal

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émentDescriptionExemple
patternHôtes ciblesall, webservers, web-01
-mModule à utiliserping, shell, apt
-aArguments 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 à shell quand possible
  • N'oubliez pas --become pour les tâches privilégiées
  • Utilisez --check pour tester avant d'exécuter

Exercices pratiques

  1. Testez la connectivité de tous vos hôtes
  2. Vérifiez l'espace disque sur le groupe webservers
  3. Installez vim sur tous les serveurs
  4. Créez un utilisateur "deploy" avec clé SSH

← Inventaire | Playbooks →