Les commandes Ad-hoc
Objectif de cet atelier pratique
- Découvrir les premières commandes Ansible en mode interactif ou ad hoc.
 
Démarrer le labo
Placez-vous dans le répertoire du septième atelier pratique :
Voici les quatre machines virtuelles de cet atelier :
| Machine virtuelle | Adresse IP | 
|---|---|
ansible | 
192.168.56.10 | 
rocky | 
192.168.56.20 | 
debian | 
192.168.56.30 | 
suse | 
192.168.56.40 | 
Démarrez les VM :
Connectez-vous au Control Host :
L'environnement de cet atelier est préconfiguré et prêt à l'emploi :
- 
Ansible est installé sur le Control Host.
 - 
Le fichier
/etc/hostsdu Control Host est correctement renseigné. - 
L'authentification par clé SSH est établie sur les trois Target Hosts.
 - 
Le répertoire du projet existe et contient une configuration de base et un inventaire.
 
Rendez-vous dans le répertoire du projet :
Le mode ad hoc
Une commande ad hoc, c'est l'utilisation spontanée et interactive d'une
fonctionnalité Ansible par le biais de la commande ansible. Vous en
connaissez déjà au moins une, le test ping :
- 
Dans ce contexte,
pingn'est qu'un seul parmi les très (!) nombreux modules Ansible. - 
L'option
-mest la forme courte de--module-name. - 
L'identificateur
alldétermine l'ensemble des hôtes auxquels s'applique la commande. - 
Une commande ad hoc est donc l'appel d'un seul module, avec ou sans paramètres.
 
Le mode ad hoc au quotidien
Dans la pratique quotidienne avec Ansible, vous utiliserez très peu le mode
ad hoc, étant donné que vous travaillerez presque essentiellement avec
des playbooks et la commande correspondante ansible-playbook.
Le module command
Le module command est sans doute l'un de ceux que l'on utilisera le plus dans
le contexte des commandes ad hoc. Son paramètre est tout simplement une
commande Linux à exécuter. Faisons un premier test en affichant l'espace
utilisé de la partition principale sur tous les Target Hosts :
$ ansible all -m command -a "df -h /"
debian | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda3       124G  1.8G  116G   2% /
rocky | CHANGED | rc=0 >>
Filesystem                  Size  Used Avail Use% Mounted on
/dev/mapper/rl_rocky9-root   70G  2.0G   68G   3% /
suse | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       124G  2.2G  118G   2% /
Ce module est tellement populaire qu'il constitue d'ailleurs le module par
défaut d'Ansible. Si vous n'explicitez pas son utilisation par -m command,
vous obtiendrez le même résultat :
$ ansible all -a "df -h /"
debian | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda3       124G  1.8G  116G   2% /
rocky | CHANGED | rc=0 >>
Filesystem                  Size  Used Avail Use% Mounted on
/dev/mapper/rl_rocky9-root   70G  2.0G   68G   3% /
suse | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       124G  2.2G  118G   2% /
L'option -o (comme --one-line) peut augmenter la lisibilité du résultat si
celui-ci tient en une seule ligne :
$ ansible all -a "hostname" -o
debian | CHANGED | rc=0 | (stdout) debian
suse | CHANGED | rc=0 | (stdout) suse
rocky | CHANGED | rc=0 | (stdout) rocky
Le module shell
Vous ne pourrez pas utiliser le module command si votre commande ad hoc
utilise des mécanismes du shell comme | ou > etc. Dans ce cas il vous
faudra passer par le module shell.
Ici par exemple, j'utilise la combinaison des deux commandes ps et wc pour
afficher le nombre de processus en cours sur chacun des Target Hosts :
$ ansible all -m shell -a "ps -ef | wc -l" -o
debian | CHANGED | rc=0 | (stdout) 91
suse | CHANGED | rc=0 | (stdout) 103
rocky | CHANGED | rc=0 | (stdout) 116
Dans sa configuration par défaut, le module shell envoie la commande vers
/bin/sh. Sur la majorité des systèmes cela équivaudra à un shell Bash, mais
ce n'est pas toujours le cas, et vous risquez d'avoir des surprises. 
Pour être sûr que la commande soit exécutée dans un shell spécifique, vous
pouvez expliciter ce dernier à l'aide du paramètre executable comme ceci par
exemple :
$ ansible all -m shell -a 'echo $RANDOM executable=/bin/bash' -o
debian | CHANGED | rc=0 | (stdout) 20304
suse | CHANGED | rc=0 | (stdout) 10828
rocky | CHANGED | rc=0 | (stdout) 7461
- 
La variable
RANDOMn'existe pas dans un shellsh. - 
Veillez à utiliser des apostrophes simples. Si vous utilisez des apostrophes doubles, votre variable sera interprétée sur le Control Host, et vous serez probablement surpris d'obtenir quatre fois le même résultat.
 
Au-delà de command et shell
En théorie, rien ne vous empêche d'invoquer n'importe quel module Ansible par le biais d'une commande ad hoc, ce qui vous permet d'effectuer toute une série de tâches administratives. Voyons ce que ça peut donner dans la pratique.
Créez un répertoire /tmp/test sur tous vos Target Hosts :
Copiez le fichier /etc/passwd du Control Host vers tous les Target Hosts
sous forme d'un fichier /tmp/test2.txt :
Créez un utilisateur kevin qui utilise le shell Bash par défaut :
Installez le paquet cowsay sur toutes les cibles :
Limites du module package
Pour des raisons évidentes, cela fonctionnera uniquement avec des paquets
qui ont le même nom sur les différentes distributions : cowsay,
tree, git, nmap, etc.
Vous pouvez même vous amuser à redémarrer toutes vos cibles :
Et maintenant ?
Nous venons d'utiliser une série de modules comme ping, command,
shell, file, copy, user, package et reboot. Vous vous demandez
peut-être comment vous allez faire pour mémoriser tous ces noms de modules
avec la syntaxe de leurs paramètres respectifs.
Soyez rassurés ici, il s'agit là des mêmes modules que vous utiliserez au quotidien dans vos playbooks. Au bout d'un certain temps, vous finirez par être tellement familiarisés avec leur syntaxe et les principaux paramètres à appliquer que vous n'y penserez plus.

