Exécuter des commandes de manière sécurisée sur des nœuds distants peut être complexe, surtout dans des environnements hétérogènes.
Une mauvaise gestion de l’exécution des commandes peut entraîner des failles de sécurité et des comportements inattendus, compromettant la stabilité du système.
Découvrez comment le module Ansible command offre une solution sécurisée et efficace pour exécuter des commandes, tout en conservant un contrôle granulaire grâce à ses options avancées.
Devenez un expert d'Ansible et simplifiez vos tâches d'administration.
Le module ansible.builtin.command est utilisé pour exécuter des commandes sur les cibles (nœuds gérés) dans Ansible. C’est l’un des modules les plus simples et les plus couramment utilisés pour lancer des commandes shell de base sur les machines distantes.
Module Ansible Command : Fonctionnement
- Exécution de Commandes :Le modulecommandpermet d’exécuter des commandes spécifiques sur les nœuds cibles. Il n’interprète pas les caractères spéciaux comme les redirections (>, |) ou les opérateurs de shell (&&, ||). Pour des besoins plus complexes, il est recommandé d’utiliser le moduleshell.
- Sécurité :Contrairement au module shell, le modulecommandest plus sûr car il ne passe pas par un interpréteur de shell, réduisant ainsi les risques liés à l’exécution de commandes arbitraires.
Conditions pour Exécution Command Ansible
Le module ansible.builtin.command peut être utilisé avec diverses conditions pour contrôler son exécution. Voici quelques exemples de conditions courantes :
- Répertoire Courant :Vous pouvez spécifier le répertoire dans lequel la commande doit être exécutée en utilisant l’optionchdir.
Exemple : Exécuter une commande dans le répertoire / tmp .
- name: Lister les fichiers dans /tmp
ansible.builtin.command:
cmd: ls
chdir: /tmp
La commande ls est exécuté dans le répertoire courant / tmp .
- Exécution en Fonction de la Présence d’un Fichier :Vous pouvez utiliser la conditionwhenpour exécuter une commande seulement si un fichier spécifique est présent.
Exemple : Exécuter une commande seulement si le fichier /tmp/fichier_present.txt existe.
- name: Vérifier la présence d’un fichier et exécuter une commande
ansible.builtin.command:
cmd: echo "Le fichier est présent"
when: ansible_facts['os_family'] == "RedHat"
- Exécution en Fonction de l’Absence d’un Fichier :De la même manière, vous pouvez exécuter une commande seulement si un fichier spécifique est absent.
Exemple : Exécuter une commande seulement si le fichier /tmp/fichier_absent.txt n’existe pas.
- name: Vérifier l’absence d’un fichier et exécuter une commande
ansible.builtin.command:
cmd: echo "Le fichier est absent"
when: not ansible_facts['os_family'] == "RedHat"
Pour récapituler cette partie, voici un visuel résumant ce concept :
Sécurité du Module Ansible Command
Dans cette partie, nous allons nous concentrer uniquement sur la machine Ubuntu. Par conséquent, nous allons commenter la machine Redhat dans l’inventaire de la machine de contrôle de la manière suivante :
Voilà, nous avons en commentaire la nœud basé sur redhat. Ensuite, nous allons exécuter le playbook :
- hosts: all
tasks:
- name: Return testfile to register var
command: "cat /tmp/testFile"
register: testFile
- name: display testFile content
command: " echo {{testFile}}"
Ce playbook récupère le contenu du fichier /tmp/testFile sur tous les hôtes spécifiés, le stocke dans une variable nommée testFile, puis affiche ce contenu à l’écran. Pour exécuter ce playbook avec succès, il est nécessaire de créer le fichier testFile dans le répertoire / tmp de l’hôte géré et d’y ajouter un contenu préalablement.
Copier le playbook dans le fichier command-playbook.yml du nœud de contrôle maintenant pour pouvoir l’executer :
Exécutons maintenant ce playbook avec la commande : ansible-playbook command-playbook.yml et nous obtenons le résultat attendu comme ceci :
Parfait, nous avons bien récupéré le contenu du fichier dans le noud géré et l’afficher dans le terminal.
Dans la seconde pratique, nous allons exécuter un script sur le nœud géré à partir du nœud de contrôle.
Voici le script que nuìous allons executer :
#!/usr/bin/env bash
pwd
cd ~/.ssh
pwd
cat authorized_keys
cd
pwd
(#!/usr/bin/env bash) : Spécifie l’interpréteur de commandes à utiliser, ici bash, trouvé via env pour assurer la portabilité.
pwd : Affiche le répertoire de travail courant avant chaque commande cd, pour afficher le chemin complet.
cd ~/.ssh : Change le répertoire de travail vers ~/.ssh.
pwd : Affiche à nouveau le répertoire de travail courant après la commande cd, confirmant le changement de répertoire.
cat authorized_keys : Affiche le contenu du fichier authorized_keys situé dans ~/.ssh.
cd : Retourne au répertoire personnel de l’utilisateur.
pwd : Affiche le répertoire de travail courant après le retour au répertoire personnel.
Copions ce script dans le fichier testCommand.sh du nœud géré :
Ensuite, créons le playbook et le copier dans le fichier comandsh-playbook.yml permettant d’exécuter ce script :
Commençons par donner l’autorisation d’exécution à notre script avec la commande
chmod +x testCommand.sh. Ensuite, nous pouvons l’exécuter avec ./testCommand.sh , ce qui affichera le contenu du fichier authorized_keys.
Une fois le script lancé, exécutons ensuite le playbook avec la commande : ansible-playbook -v commandsh-playbook.yml, ce qui affichera les résultats du script.
Parfait, nous avons terminé cette partie avec succès.
Formez-vous gratuitement avec Alphorm !
Maîtrisez les compétences clés en IT grâce à nos formations gratuites et accélérez votre carrière dès aujourd'hui.
FAQ
Comment fonctionne le module Ansible command?
Quelles sont les conditions d'exécution du module command?
Pourquoi le module command est-il plus sûr que shell?
Comment exécuter un playbook avec le module command?
Comment exécuter un script depuis Ansible avec le module command?
Conclusion
En comprenant les capacités du module command d’Ansible, vous pouvez sécuriser et simplifier l’exécution de commandes dans vos infrastructures. Quels autres modules Ansible pourraient compléter votre boîte à outils pour une gestion encore plus efficace?