Ansible est une plateforme permettant de gérer et dâautomatiser la configuration des ordinateurs dâun parc informatique. Cet article présente lâoutil et explique comment il fonctionne afin de lâutiliser pour vos systèmes et donne quelques exemples simples pour démarrer rapidement.
Publié le 19 juin 2025Â
Version PDF Version hors-ligne
Ansible est un logiciel libre (licence GNU v3) permettant de déployer et lancer des tâches sur une partie ou lâensemble dâun parc informatique. Grâce à Ansible, vous pourrez notamment installer un logiciel, mettre à jour des fichiers de configuration, configurer un service sur lâensemble de vos machines et cela, de manière automatique et à distance. Lâexploitation commerciale dâAnsible est, depuis 2015, la propriété de Red Hat. Même si lâoutil est prévu pour un parc informatique, il peut être intéressant de lâutiliser chez soi, et ce, à partir dâun nombre restreint de machines. En effet, Ansible pourra alors permettre de dupliquer la configuration des logiciels ou même du système, sur ces machines. Par exemple, Ansible permet dâavoir une même configuration des outils sur deux machines utilisées pour du développement et de mettre à jour cette configuration sans pour autant effectuer les manipulations sur les machines en question.
Cet article nâa pas pour but de remplacer la documentation officielle (qui est dâailleurs de bonne qualité).
Pour lâélaboration de cet article, Ansible a été mis en place au sein dâun parc virtuel de trois machines sous Linux :
Ces machines sont évidemment placées sur le même réseau Ethernet et peuvent donc communiquer entre elles.
Ansible est distribué sous la forme dâun paquet Python et sâinstalle donc avec la commande :
Ansible doit uniquement être installé sur la machine de contrôle. Quant aux machines gérées par Ansible, elles ne nécessitent quâune installation de Python pour exécuter le code généré par Ansible et un compte utilisateur auquel il est possible de se connecter au travers de SSH.
Cela correspond à un mode de fonctionnement dit « mode push » où les configurations sont envoyées par une machine de contrôle vers les machines cibles. Câest cette utilisation qui est décrite tout au long de lâarticle.
Ansible peut aussi être utilisé dans le mode de fonctionnement dit « mode pull » (donc, à lâinverse du « mode push »). Dans ce deuxième mode de fonctionnement, Ansible est installé directement sur les machines cibles (il nây a pas de machine de contrôle). Les fichiers de configuration dâAnsible devront alors être récupérés sur la machine à configurer (par exemple, en les récupérant depuis un dépôt Git) et appliqués, grâce à Ansible, localement.
Quel que soit le mode que vous utilisez, les fichiers de configuration et les commandes sont identiques. Seule la machine cible à indiquer à Ansible change (localhost, pour indiquer la machine locale, en « mode pull »).
Ansible peut aussi se connecter aux machines fonctionnant sous Windows. Toutefois, une machine sous Windows requiert une configuration spécifique. Premièrement, Ansible peut utiliser le protocole SSH ou le protocole WinRM pour la connexion. Dans le premier cas, un serveur SSH peut être installé sous Windows par le biais des « Fonctionnalités facultatives » présentes dans les paramètres du système.
Le service « OpenSSH SSH Server » nâest pas démarré automatiquement après installation. Il est donc nécessaire de le démarrer manuellement et si nécessaire, dâactiver le démarrage automatique (par exemple, depuis le « Gestionnaire des services ».
De plus, si votre compte utilisateur nâa pas de mot de passe, il ne sera pas possible de sây connecter à travers SSH.
WinRM peut sâactiver avec la commande winrm quickconfig . Cette commande mettra en place une configuration par défaut, suffisante pour une utilisation avec Ansible, mais à modifier pour des questions de sécurité.
Que ce soit avec SSH ou WinRM, Il sera certainement nécessaire de mettre à jour les règles du pare-feu Windows pour permettre aux machines externes de se connecter à ces services.
Sur la machine de contrôle, il sera possible de spécifier le protocole, ssh ou winrm , à travers la variable ansible_connection , notamment, depuis lâinventaire. Le support de WinRM nécessite lâinstallation du paquet Python pywinrm .
Finalement, lâutilisation de WinRM repose sur les variables suivantes :
Ansible vient avec son propre vocabulaire. Ainsi, vous serez rapidement confronté aux mots suivants :
Le parc informatique devant être géré par Ansible doit être décrit dans un fichier (pouvant être au format INI ou YAML) nommé inventaire (« inventory »). Les tâches à effectuer sur les machines du parc sont décrites dans un fichier (au format YAML) appelé « playbook ». Grâce à ses informations, Ansible se connectera donc aux machines mentionnées dans lâinventaire, grâce à SSH, pour lancer les tâches voulues.
Pour débuter avec Ansible, la première étape sera de créer un inventaire puis une tâche simple à exécuter. Le rôle de cette première tâche sera de joindre et dâobtenir une réponse des machines gérées par Ansible. Le but est multiple :
Dans sa forme la plus simple, lâinventaire est une simple liste contenant lâadresse IP ou le nom de la machine. Au format INIÂ :
Ou, son équivalent au format YAML :
Bien que les deux formats, INI et YAML, offrent les mêmes possibilités, le format YAML sera probablement privilégié en raison de sa structure plus facile à manipuler pour les parcs informatiques composés de nombreuses machines.
Dans les exemples ci-dessus, le nom du groupe (ici group1 ) peut être modifié pour mieux correspondre à votre objectif. Il en est de même pour le nom des machines (ici computer1 et computer2 ). De plus, il est possible de définir plusieurs groupes dans un même inventaire.
Déjà , il est possible de vérifier si lâinventaire ne contient pas dâerreur de syntaxe avec la commande :
Et de tester la connexion avec les machines listées avec la commande :
Le premier paramètre ( group1 ) est lâensemble de machines (ici, un nom de groupe) sur lequel effectué la tâche. La tâche en question est définie par le module ping (option -m ). Lâoption -i permet dâindiquer quel inventaire utiliser et pour que cette commande fonctionne, cet inventaire doit définir le group1 .
Les commandes ci-dessus utilisent lâinventaire au format INI mais auraient très bien pu utiliser le fichier inventory.yml au format YAML.
Lorsque les machines sont joignables par le contrôleur, le message suivant est affiché :
Dans le cas où aucun serveur SSH nâest actif sur la machine gérée, le message suivant apparaîtra :
Et si la connexion nâest pas automatique (si lâutilisateur doit entrer un mot de passe pour se connecter), le message suivant apparaîtra :
Finalement, si Python nâest pas trouvé sur la machine, vous obtiendrez le message suivant :
Si un message similaire (toutefois avec un résultat dans module_stderr différent) apparaît pour une machine Windows, vérifiez que votre playbook utilise les modules adéquats, spécifiques à Windows. Dans lâexemple précédent, il sera nécessaire dâutiliser win_ping à la place de ping . En effet, les modules pour Linux et autres vont aussi produire un tel message dâerreur pour les machines Windows.
Avec cette première étape, il est possible de constater que :
Le test de lâétape précédente repose sur le module « ping » dâAnsible, ce qui est très bien pour vérifier le bon fonctionnement de lâinstallation. Toutefois, il deviendra vite intéressant de mettre en place des tâches personnalisées à exécuter sur les machines gérées. Cette configuration se fait au travers dâun « playbook » (au format YAML) : un fichier contenant un ensemble de tâches. Le fichier suivant est un exemple simple dans lequel deux tâches sont configurées : un ping et lâaffichage dâun message de débogage (« debug ») « Bonjour monde » :
Pour exécuter le playbook, il faudra utiliser la commande ansible-playbook , comme suit :
Ce qui permettra dâobtenir la sortie suivante :
Aussi, ce deuxième exemple montre les points suivants :
La tâche « Gathering Facts » est une tâche dâAnsible effectuée par défaut (pouvant être désactivée). Celle-ci va récupérer un ensemble dâinformations sur la machine cible. Ces informations seront alors disponibles au travers de la variable ansible_facts Variables .
Maintenant quâAnsible est en place, que lâinventaire est prêt et quâil est possible dâexécuter des tâches, voyons comment mettre en place des tâches utiles permettant de modifier la configuration des machines gérées. Pour la première tâche, nous avons utilisé deux modules :
Ansible propose une multitude de modules, listés sur cette page . Afin de sâhabituer à la mise en place de playbooks, quelques modules sont décrits ci-dessous.
Les exemples suivants se veulent simples. Chaque module décrit dans cet article, possède de nombreuses options permettant de couvrir la majorité des cas. Toutefois, ces options ne sont pas mentionnées ici et il est donc nécessaire de se référer à la documentation officielle.
Vous souhaitez envoyer un fichier à toutes les machines dâun groupe, pour ce faire, votre tâche pourra utiliser le module ansible.builtin.copy (et win_copy pour les machines Windows).
Le module possède des options pour :
Par contre, de la sorte, il ne sera pas possible dâécrire dans un dossier dâun autre utilisateur, ou plus précisément, un dossier auquel seul le compte administrateur a accès, comme cela est majoritairement le cas pour les fichiers de configuration dâune machine.
Rapidement, il sera nécessaire dâexécuter des tâches en tant quâadministrateur (de la machine gérée). Pour cela, Ansible propose les commandes become , become_user , become_method et become_flags . Le playbook précédent deviendra :
Mais avec une telle solution (et en utilisant lâoption --check pour jouer le playbook), Ansible indiquera quâil ne sait pas comment devenir administrateur :
Il est possible de donner le mot de passe, et ce, de plusieurs manières :
Bien que fonctionnelles, la sécurité de ces méthodes peut être discutée. Heureusement, Ansible propose une méthode pour stocker des informations de manière sécurisée : les coffres-forts.
Ansible propose une solution au problème du stockage de mot de passe, dâinformation ou de fichier sensible sous la forme dâun coffre-fort (« vault » en anglais). Pour gérer le coffre-fort, Ansible propose une commande dédiée : ansible-vault . La création dâun coffre-fort se fait ainsi :
Une fois un mot de passe entré, la commande ouvre automatiquement le fichier en édition, dans vi . Dans ce fichier, vous pourrez renseigner une variable contenant le mot de passe. Pour lâexemple de copie dâun fichier, nécessitant une élévation de privilège demandé au travers du mot clef become , il suffit de définir le mot de passe dans la variable standard dédiée à cet usage :
Le playbook peut alors être modifié pour charger le coffre-fort :
Et si on lance le playbook, on obtient immédiatement la réponse suivante :
Dorénavant, il faut utiliser lâoption --ask-vault-pass lorsque lâon veut lancer le playbook :
Le mot de passe du coffre-fort peut être stocké dans un autre fichier ou encore, dans un gestionnaire de secrets .
La commande ansible-vault permet aussi de lire, éditer, déchiffrer et re-chiffrer un coffre-fort.
Le module fetch permet dâeffectuer lâopération inverse de la commande copy vue précédemment : grâce à fetch, vous pouvez récupérer des fichiers depuis les nÅuds gérés.
Le fichier fstab sera alors stocké, sur la machine de contrôle, à lâemplacement /tmp/out/computer1/etc/fstab (pour la machine nommée computer1 ).
Le module fetch dispose dâune option flat , désactivée par défaut, permettant de stocker le fichier directement dans le fichier ou le dossier spécifié :
Par conséquent, chaque fois quâun fichier est récupéré dâune machine, le fichier est écrasé par le nouveau. Par conséquent, cette option nâest utile que lorsque vous souhaitez récupérer un fichier à partir dâune seule machine.
Pour télécharger un fichier, il faudra utiliser le module get_url (et win_get_url pour les machines Windows) :
Entre autres, ce module dispose dâune option ( cheksum ) pour vérifier la somme de contrôle du fichier téléchargé.
Le module git permet récupérer des fichiers depuis Git. Il existe une commande équivalente pour hg et pour subversion .
De manière plus générale, il est possible dâexécuter une commande quelconque avec le module command ( win_command sous Windows) ou encore un script, avec le module script (le script est local et sera transféré sur le nÅud). En plus du module command, il existe un module shell (et win_shell ), reprenant le même principe que command mais disposant des spécificités dâun shell (câest-à -dire, les variables telles que $HOME ou les redirections). Finalement, il existe le module raw , une variante bas niveau des commandes précédentes permettant dâexécuter une commande à travers SSH. Lâavantage de cette dernière étant quâil est possible de lâutiliser pour installer Python ou pour automatiser des tâches sur une machine sans Python. Toutefois, son utilisation doit être évitée, autant que possible.
Ansible permet de créer des variables . Celles-ci peuvent être définies au travers dâun playbook, dâun inventaire, en les passant en option lors du lancement dâAnsible ou encore, dans un fichier à inclure (comme vu avec les coffre-forts). Une tâche peut aussi produire une nouvelle variable (en utilisant le mot clé register ). La documentation indique dans la section « return values », les différentes variables produites par un module. Voici un exemple dâutilisation de register  :
Le nom dâune variable est sujet à quelques restrictions : le nom ne peut contenir que des lettres, des chiffres et des soulignés. Plus précisément, le nom dâune variable ne peut pas commencer par un chiffre et ne peut pas être un mot clef du langage Python ou des playbooks.
Voici un autre exemple, où la variable est définie dans le playbook :
La même chose peut être réalisée, mais en définissant la variable dans lâinventaire :
Ce qui permet dâavoir une variable spécifique à la machine lâexécutant.
Si la variable nâest définie que pour une machine et non pour lâautre, la tâche sâexécutera correctement pour la machine pour laquelle la variable est définie, mais échouera pour lâautre.
Finalement, la variable peut être définie lors de lâexécution de la commande avec lâoption -e ou --extra-vars . Les différentes variables doivent être séparées par une espace :
Par conséquent, il est possible que votre variable soit définie à deux endroits différents. La documentation officielle indique lâordre de précédence .
Les variables peuvent être de différents types, comme des booléens, des listes et des dictionnaires. Avec la présence des listes ou des dictionnaires, il peut vite devenir utile dâitérer sur les différents éléments de ceux-ci, ce quâAnsible propose avec le mot clef loop . Ce dernier inscrit lâélément de lâitération en cours dans la variable item  :
Ansible fournit un ensemble de variables, appelées « faits » ( facts ), quâil est possible de consulter de deux manières différentes :
avec une ligne de commande :
Ansible propose aussi le mot clef when permettant dâajouter une condition à lâexécution dâune tâche. La tâche suivante ne sâexécute que sur les machines non Windows :
Les template permettent dâutiliser un fichier modèle pour générer un fichier sur les machines gérées. En effet, les variables utilisées dans le modèle seront remplacées par leur valeur telle que connue par Ansible. Ce mécanisme repose sur un langage spécifique : Jinja2 . De plus, pour transformer un fichier modèle vers son état final, il est nécessaire dâutiliser le module Ansible template (et win_template pour Windows), qui, de manière globale, possède les mêmes fonctionnalités que le module copy Copier un fichier .
Avec le fichier Jinja 2 suivant :
Vous obtiendrez, sur les machines gérées, le fichier suivant :
lorsque la variable machine_name est définie à « Ordinateur 2 ». Dans le cas présent, une telle variable serait certainement définie pour chaque machine de lâinventaire.
Le module template dispose dâune option validate permettant de lancer une commande vérifiant la validité du fichier créé avant dâeffectuer la copie sur la machine de destination. Cela permet dâéviter de bloquer la machine gérée lors de la mise à jour des fichiers de configuration de cette dernière (par exemple, le fichier sudoers ).
La documentation officielle de Jinja2 permet dâen apprendre plus sur les possibilités de ce langage.
Ansible propose un mécanisme, sous le nom de « handler  », permettant dâeffectuer une tâche uniquement si la machine gérée a été modifiée (état « changed »). Plus précisément, un « handler » est une tâche placée dans une section dédiée : handlers . Pour que le « handler » soit exécuté, une tâche classique doit en faire la demande avec le mot clef notify . Voici un exemple, reprenant le playbook pour récupérer un fichier en ligne :
Une telle tâche pourra être à lâorigine de la sortie suivante :
Ici, seul « computer1 » a exécuté le « handler ». En effet, sur « computer2 », le fichier à récupérer était déjà présent, faisant quâaucun changement nâa été effectué sur cette machine. Par conséquent, le « handler » nâa pas été exécuté. Un cas classique dâutilisation des « handlers » est de redémarrer un service après la modification dâun fichier de configuration.
Les rôles dâAnsible sont des ensembles de fichiers pouvant définir des tâches, des « handlers », des variables, des templates ou des fichiers quelconques. Lâobjectif est de mettre en place un ensemble de fichiers pouvant être utilisés dans une ou plusieurs tâches.
Les rôles se définissent au travers de la hiérarchie de fichiers suivante :
Dans une telle hiérarchie, le nom du rôle est défini par le nom du dossier dans le dossier roles , ici : common . Ansible cherchera un fichier main.yml dans chacun des sous dossiers. Les sous dossiers dâun rôle sont les suivants :
Avec la particularité que tout dossier est optionnel et peut-être absent si vous nâen avez pas besoin. Un rôle est valide sâil contient au moins un de ces dossiers.
Ansible cherche un fichier main.yml , dans les sous-dossiers dâun rôle. Il est toujours possible dâinclure dâautres fichiers, par exemple, un deuxième fichier de tâches, à partir du fichier main.yml .
Les rôles doivent être placés dans le dossier du playbook, ou un chemin relatif à celui-ci ou dans le dossier défini par roles_path . Il est aussi possible, lors de lâutilisation dâun rôle de spécifier un chemin complet.
Ci-dessous, un exemple dâun rôle, appelé test et définissant un unique fichier tasks/main.yml  :
Et un playbook utilisant ce rôle :
La tâche définie par le rôle est exécutée avant la tâche du playbook. Il est à noter que le playbook aurait aussi pu uniquement contenir :
Exécutant uniquement la ou les tâches définies dans le rôle.
En plus des modules proposés avec Ansible, il est possible dâobtenir des collections et des rôles provenant de la communauté et disponible sur le site Galaxy . En complément de lâinterface Web, il est possible dâexplorer Galaxy avec la commande ansible-galaxy . La commande est aussi utile pour lâinstallation dâun rôle trouvé sur Galaxy :
Maintenant que les fonctionnalités principales dâAnsible ont été expliquées, il est temps de mettre en place des tâches utiles.
La création dâune tâche suit généralement le processus suivant :
La tâche suivante va créer un nouveau compte utilisateur et configurer Git de façon à ce que le nom de lâutilisateur et son adresse de courriel soient définis. En bref, la tâche effectue les actions suivantes :
Pour que la tâche soit plus intéressante, elle repose sur une liste dâutilisateurs dans un fichier de configuration, tel que le suivant :
Il est aussi possible dâutiliser un fichier CSV, grâce au module read_csv .
Par contre, dans un vrai environnement, il est étonnant de configurer deux développeurs sur la même machine. Une autre façon de faire serait de définir ces variables dans lâinventaire.
La tâche peut être rédigée ainsi :
La tâche ci-dessous installe et configure automatiquement le logiciel fzf . Le playbook utilise les conditions pour rendre le processus compatible avec différentes distributions Linux et différents shells. Cette fois, le mot de passe administrateur est demandé par Ansible au lancement du playbook (grâce à vars_prompt ). Pour activer fzf, il est nécessaire dâajouter une ligne dans le fichier de configuration du shell. La mise à jour de ce fichier de configuration est réalisée par le module lineinfile , qui permet de chercher si une ligne est déjà présente dans le fichier (option search_string ) et de lâajouter dans le cas contraire (option line ).
Il est possible dâaméliorer le processus. Notamment, il serait judicieux dâavoir un rôle spécifique à la mise à jour du système et qui serait appelé au lancement du playbook ci-dessus. En effet, il nâest pas toujours nécessaire de faire la mise à jour du système à chaque lancement du playbook, ou inversement, il serait intéressant dâavoir un playbook pour uniquement mettre à jour le système.
Le scénario suivant a pour but de mettre en place un point de montage réseau (par exemple, pour se connecter automatiquement à un NAS) grâce à systemd automount .
Pour cela, le module systemd sera utile, notamment pour charger la nouvelle configuration à travers un handler Handler , ainsi que les commandes template et copy pour envoyer des fichiers sur les machines cibles.
Les fichiers de configuration à envoyer seront :
Ainsi quâun troisième fichier devant être préparé par Ansible et donc au format Jinja 2.
Et la tâche en elle-même :
Dans cet exemple, Ansible configure un point de montage automatique sur les machines cibles. Le processus (avec les modules template et copy) est le même pour la configuration dâune multitude de logiciels ou même, du système. Généralement, la configuration de ceux-ci est stockée dans des fichiers.
La commande ansible-playbook dispose dâune option --check permettant de vérifier ce qui va être réalisé lors de lâexécution dâun playbook (sans pour autant effectuer les tâches en question) :
Cette option est donc un bon outil pour vérifier que les tâches effectueront ce qui est demandé ou encore, pour déboguer un playbook ne fonctionnant pas comme attendu.
En plus de lâoption --check , ansible-playbook propose aussi les options --diff , --list-hosts , --list-tasks et --syntax-check .
De plus, Ansible propose un outil, ansible-lint , vérifiant la syntaxe et des erreurs communes lors de lâécriture dâun playbook. Celui-ci nâest pas installé par défaut avec Ansible. La commande suivante permet de lâinstaller :
Lâoutil sâexécute grâce à la commande suivante :
Ce qui pourra donner la sortie suivante :
Ansible est un outil puissant, utile pour gérer un parc informatique, mais pouvant aussi être pratique dans un environnement plus modeste, tel que celui à la maison. Cet article a permis de découvrir les différentes fonctionnalités dâAnsible et détaille la mise en place de tâches simples. Libre à vous de réutiliser ces connaissances et dâétendre les différents playbooks afin de gérer la configuration de vos machines.
Merci à Franck Talbart, Christophe et N_BaH pour leurs suggestions. Merci également à ALT pour sa relecture orthographique.
Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants :
En complément sur Developpez.com