Ansible est une solution d'automatisation complète pour votre environnement informatique. Vous pouvez utiliser Ansible pour automatiser la configuration des serveurs Linux et Windows, orchestrer le provisionnement des services, déployer des environnements cloud et même configurer vos périphériques réseau.
Les modules Ansible résument les actions sur votre système afin que vous n'ayez pas à vous soucier des détails de mise en œuvre. Vous décrivez simplement l'état souhaité et Ansible s'assure que le système cible y correspond.
La disponibilité de ce module est l'un des principaux avantages d'Ansible, et il est souvent appelé Ansible avec "piles incluses". En effet, vous pouvez trouver des modules pour un grand nombre de tâches, et même si c'est génial, j'entends souvent des débutants dire qu'ils ne savent pas par où commencer.
Bien que votre choix de modules dépende exclusivement de vos besoins et de ce que vous essayez d'automatiser avec Ansible, voici les dix principaux modules dont vous avez besoin pour démarrer avec Ansible pour l'automatisation du système Linux.
1. copier
Le module de copie vous permet de copier un fichier du nœud de contrôle Ansible vers les hôtes cibles. En plus de copier le fichier, il vous permet de définir la propriété, les autorisations et les étiquettes SELinux sur le fichier de destination. Voici un exemple d'utilisation du module de copie pour copier un fichier de configuration "message du jour" vers les hôtes cibles :
- nom :Assurez-vous que le fichier MOTD est en place
copie :
src :files/motd
dest :/etc/motd
owner :root
group :mode racine
:0644
Pour un contenu moins complexe, vous pouvez copier le contenu directement dans le fichier de destination sans avoir de fichier local, comme ceci :
- nom :Assurez-vous que le fichier MOTD est en place
copie :
contenu :"Bienvenue dans ce système."
dest :/etc/motd
propriétaire :root
groupe :racine
mode :0644
Ce module fonctionne de manière idempotente, ce qui signifie qu'il ne copiera le fichier que si le même fichier n'est pas déjà en place avec le même contenu et les mêmes autorisations.
Le module de copie est une excellente option pour copier un petit nombre de fichiers avec un contenu statique. Si vous avez besoin de copier un grand nombre de fichiers, jetez un œil au module de synchronisation. Pour copier des fichiers avec un contenu dynamique, jetez un œil au template
module suivant.
2. modèle
Le module de modèle fonctionne de manière similaire à la copy
module, mais il traite le contenu dynamiquement à l'aide du langage de template Jinja2 avant de le copier sur les hôtes cibles.
Par exemple, définissez un modèle "message du jour" qui affiche le nom du système cible, comme ceci :
$ vi templates/motd.j2
Bienvenue dans {{ inventor_hostname }}.
Ensuite, instanciez ce template en utilisant le template
module, comme ceci :
- nom :Assurez-vous que le fichier MOTD est en place
modèle :
src :templates/motd.j2
dest :/etc/motd
propriétaire :root
groupe :root
mode :0644
Avant de copier le fichier, Ansible traite le modèle et interpole la variable, en la remplaçant par le nom du système hôte cible. Par exemple, si le nom du système cible est rh8-vm03
, le fichier résultat est :
Bienvenue sur rh8-vm03.
Alors que la copy
le module peut également interpoler des variables lors de l'utilisation du content
paramètre, le template
permet une flexibilité supplémentaire en créant des fichiers modèles, qui vous permettent de définir un contenu plus complexe, y compris for
boucles, if
conditions, et plus encore. Pour une référence complète, consultez la documentation Jinja2.
Ce module est également idempotent, et il ne copiera pas le fichier si le contenu sur le système cible correspond déjà au contenu du modèle.
3. utilisateur
Le module utilisateur vous permet de créer et de gérer des utilisateurs Linux dans votre système cible. Ce module a de nombreux paramètres différents, mais dans sa forme la plus basique, vous pouvez l'utiliser pour créer un nouvel utilisateur.
Par exemple, pour créer l'utilisateur ricardo
avec UID 2001, fait partie des groupes users
et wheel
, et le mot de passe mypassword
, appliquez le user
module avec ces paramètres :
- nom :Assurez-vous que l'utilisateur ricardo existe
utilisateur :
nom :ricardo
groupe :utilisateurs
groupes :wheel
uid :2001
mot de passe :"{{ 'mypassword' | password_hash('sha512') }}"
état :présent
Notez que ce module essaie d'être idempotent, mais il ne peut pas le garantir pour toutes ses options. Par exemple, si vous exécutez à nouveau l'exemple de module précédent, il réinitialisera le mot de passe à la valeur définie, en changeant l'utilisateur dans le système pour chaque exécution. Pour rendre cet exemple idempotent, utilisez le paramètre update_password: on_create
, en veillant à ce qu'Ansible ne définisse le mot de passe que lors de la création de l'utilisateur et non lors des exécutions suivantes.
Vous pouvez également utiliser ce module pour supprimer un utilisateur en définissant le paramètre state: absent
.
L'user
Le module propose de nombreuses options pour vous permettre de gérer plusieurs aspects utilisateur. Assurez-vous de consulter la documentation du module pour plus d'informations.
4. paquet
Le module de package vous permet d'installer, de mettre à jour ou de supprimer des packages logiciels de votre système cible à l'aide du gestionnaire de packages standard du système d'exploitation.
Par exemple, pour installer le serveur Web Apache sur une machine Red Hat Linux, appliquez le module comme ceci :
- nom :Assurez-vous que le package Apache est installé
package :
nom :httpd
état :présent
En savoir plus sur Ansible
- Guide de démarrage rapide d'Ansible
- Aide-mémoire Ansible
- Cours en ligne gratuit :les bases d'Ansible
- Télécharger et installer Ansible
- eBook :L'entreprise automatisée
- Livre électronique :Ansible pour DevOps
- Livres numériques Ansible gratuits
- Derniers articles Ansible
Ce module est indépendant de la distribution et fonctionne en utilisant le gestionnaire de packages sous-jacent, tel que yum/dnf
pour les distributions basées sur Red Hat et apt
pour Debian. Pour cette raison, il n'effectue que des tâches de base telles que l'installation et la suppression de packages. Si vous avez besoin de plus de contrôle sur les options du gestionnaire de packages, utilisez le module spécifique pour la distribution cible.
Gardez également à l'esprit que, même si le module lui-même fonctionne sur différentes distributions, le nom du package pour chacun peut être différent. Par exemple, dans la distribution basée sur Red Hat, le nom du package du serveur Web Apache est httpd
, alors que dans Debian, c'est apache2
. Assurez-vous que vos playbooks traitent de cela.
Ce module est idempotent et n'agira pas si l'état actuel du système correspond à l'état souhaité.
5. services
Utilisez le module de service pour gérer les services du système cible à l'aide du système init requis ; par exemple, systemd.
Dans sa forme la plus basique, tout ce que vous avez à faire est de fournir le nom du service et l'état souhaité. Par exemple, pour démarrer le sshd
service, utilisez le module comme ceci :
- nom :Assurez-vous que SSHD est démarré
service :
nom :sshd
état :démarré
Vous pouvez également vous assurer que le service démarre automatiquement lorsque le système cible démarre en fournissant le paramètre enabled: yes
.
Comme avec le package
module, le service
module est flexible et fonctionne sur différentes distributions. Si vous avez besoin d'un réglage fin sur le système d'initialisation cible spécifique, utilisez le module correspondant ; par exemple, le module systemd
.
Semblable aux autres modules que vous avez vus jusqu'à présent, le service
module est également idempotent.
6. pare-feu
Utilisez le module firewalld pour contrôler le pare-feu du système avec le firewalld
démon sur les systèmes qui le prennent en charge, comme les distributions basées sur Red Hat.
Par exemple, pour ouvrir le service HTTP sur le port 80, utilisez-le comme ceci :
- nom :Assurez-vous que le port 80 (http) est ouvert
pare-feu :
service :http
état :activé
permanent :oui
immédiat :ouiVous pouvez également spécifier des ports personnalisés au lieu des noms de service avec le
port
paramètre. Dans ce cas, assurez-vous de spécifier également le protocole. Par exemple, pour ouvrir le port TCP 3000, utilisez ceci :- nom :Assurez-vous que le port 3000/TCP est ouvert
pare-feu :
port :3000/tcp
état :activé
permanent :oui
immédiat :ouiVous pouvez également utiliser ce module pour contrôler d'autres
firewalld
aspects comme les zones ou les règles complexes. Assurez-vous de consulter la documentation du module pour une liste complète des options.7. fichier
Le module de fichiers vous permet de contrôler l'état des fichiers et des répertoires, en définissant les autorisations, la propriété et les étiquettes SELinux.
Par exemple, utilisez le
file
module pour créer un répertoire/app
appartenant à l'utilisateurricardo
, avec des autorisations de lecture, d'écriture et d'exécution pour le propriétaire et le groupeusers
:- nom :Assurez-vous que le répertoire /app existe
fichier :
chemin :/app
état :répertoire
propriétaire :ricardo
groupe :utilisateurs
mode :0770Vous pouvez également utiliser ce module pour définir les propriétés des fichiers sur les répertoires de manière récursive en utilisant le paramètre
recurse: yes
ou supprimer des fichiers et répertoires avec le paramètrestate: absent
.Ce module fonctionne avec l'idempotence pour la plupart de ses paramètres, mais certains d'entre eux peuvent lui faire changer le chemin cible à chaque fois. Consultez la documentation pour plus de détails.
8. fichier de ligne
Le module lineinfile vous permet de gérer des lignes simples sur des fichiers existants. Il est utile de mettre à jour la configuration ciblée sur des fichiers existants sans modifier le reste du fichier ni copier l'intégralité du fichier de configuration.
Par exemple, ajoutez une nouvelle entrée à votre fichier hosts comme ceci :
- nom :Assurez-vous que l'hôte rh8-vm03 dans le fichier d'hôtes
lineinfile :
chemin :/etc/hosts
ligne :192.168.122.236 rh8-vm03
état :présentVous pouvez également utiliser ce module pour modifier une ligne existante en appliquant le paramètre
regexp
pour rechercher une ligne existante à remplacer. Par exemple, mettez à jour lesshd_config
fichier pour empêcher la connexion root en modifiant la lignePermitRootLogin yes
àPermitRootLogin no
:- nom :assurez-vous que la racine ne peut pas se connecter via ssh
lineinfile :
chemin :/etc/ssh/sshd_config
regexp :'^PermitRootLogin'
ligne :PermitRootLogin no
état :présentRemarque :Utilisez le module de service pour redémarrer le service SSHD afin d'activer cette modification.
Ce module est également idempotent, mais, en cas de modification de ligne, assurez-vous que l'expression régulière correspond à la fois aux états d'origine et mis à jour pour éviter des modifications inutiles.
9. désarchiver
Utilisez le module unarchive pour extraire le contenu des fichiers d'archive tels que
tar
ouzip
des dossiers. Par défaut, il copie le fichier d'archive du nœud de contrôle vers la machine cible avant de l'extraire. Modifiez ce comportement en fournissant le paramètreremote_src: yes
.Par exemple, extraire le contenu d'un
.tar.gz
fichier qui a déjà été téléchargé sur l'hôte cible avec cette syntaxe :- nom :Extraire le contenu de app.tar.gz
unarchive :
src :/tmp/app.tar.gz
dest :/app
remote_src :yesCertaines technologies d'archivage nécessitent que des packages supplémentaires soient disponibles sur le système cible; par exemple, le package
unzip
pour extraire.zip
fichiers.Selon le format d'archive utilisé, ce module peut ou non fonctionner de manière idempotente. Pour éviter des modifications inutiles, vous pouvez utiliser le paramètre
creates
pour spécifier un fichier ou un répertoire que ce module créerait lors de l'extraction du contenu de l'archive. Si ce fichier ou répertoire existe déjà, le module n'en réextrait pas le contenu.10. commande
Le module de commande est flexible et vous permet d'exécuter des commandes arbitraires sur le système cible. En utilisant ce module, vous pouvez faire presque n'importe quoi sur le système cible tant qu'il y a une commande pour cela.
Même si la
command
module est flexible et puissant, il doit être utilisé avec précaution. Évitez d'utiliser le module de commande pour exécuter une tâche s'il existe un autre module approprié disponible pour cela. Par exemple, vous pourriez créer des utilisateurs en utilisant lacommand
module pour exécuter leuseradd
commande, mais vous devriez utiliser leuser
module à la place, car il vous fait abstraction de nombreux détails, en prenant soin des cas particuliers et en veillant à ce que la configuration ne change que lorsque cela est nécessaire.Pour les cas où aucun module n'est disponible, ou pour exécuter des scripts ou des programmes personnalisés, la
command
module est toujours une excellente ressource. Par exemple, utilisez ce module pour exécuter un script déjà présent sur la machine cible :- nom :exécutez la commande du programme d'installation de l'application
:"/app/install.sh"Par défaut, ce module n'est pas idempotent, car Ansible exécute la commande à chaque fois. Pour faire la
command
module idempotent, vous pouvez utiliserwhen
conditions pour n'exécuter la commande que si la condition appropriée existe, ou si lecreates
argument, similaire à l'exemple du module de désarchivage.Quelle est la prochaine ?
À l'aide de ces modules, vous pouvez configurer des systèmes Linux entiers en copiant, en créant des modèles ou en modifiant des fichiers de configuration, en créant des utilisateurs, en installant des packages, en démarrant des services système, en mettant à jour le pare-feu, etc.
Si vous êtes nouveau sur Ansible, assurez-vous de consulter la documentation sur la façon de créer des playbooks pour combiner ces modules afin d'automatiser votre système. Certaines de ces tâches nécessitent d'être exécutées avec des privilèges élevés pour fonctionner. Pour plus de détails, consultez la documentation sur l'élévation des privilèges.
Depuis Ansible 2.10, les modules sont organisés en collections. La plupart des modules de cette liste font partie du
ansible.builtin
collection et sont disponibles par défaut avec Ansible, mais certains d'entre eux font partie d'autres collections. Pour une liste des collections, consultez la documentation Ansible.