Playbooks Ansible
La partition de l'automatisation.
Notions théoriques
Les Playbooks
Les Playbooks sont écrits en YAML
, un langage de sérialisation de données humainement lisible,
qui permet de décrire les tâches d'automatisation de manière très structurée.
Un Playbook est une liste ordonnée de tâches que vous voulez exécuter sur un ou plusieurs hôtes dans votre inventaire. C'est comme une partition musicale qui indique à chaque musicien (serveur) ce qu'il doit jouer et à quel moment.
Un Playbook Ansible typique contient :
- Un nom
name
pour le Playbook. - Un ou plusieurs hôtes cibles
hosts
. - Une liste de tâches à exécuter
tasks
.
Nous verrons; par la suite, qu'un Playbook Ansible peut également contenir des variables.
Exemple pratique
Pour cet exemple, nous allons écrire un Playbook simple pour mettre à jour les paquets de nos conteneurs Debian et installer le paquet vim
.
- Sur votre serveur Ansible, créez un fichier
mise_a_jour.yml
dans le répertoire/root/ansible
.
nano /root/ansible/mise_a_jour.yml
- Écrivez le Playbook suivant dans le fichier :
---
- name: Mise a jour et installation de vim sur tous les conteneurs
hosts: conteneurs
# become: yes # Pour utiliser sudo
tasks:
- name: Mise a jour de tous les paquets
apt:
update_cache: yes
upgrade: dist
- name: Installation de vim
apt:
name: vim
state: present
Explication détaillée des lignes de cet exemple
La ligne ---
indique le début d'un document YAML.
-
'
name
' donne un nom descriptif à la 'play'.Cela aide à comprendre ce que la 'play' est censée faire lorsque vous exécutez le Playbook.
-
'
hosts
' spécifie sur quels hôtes ou groupes d'hôtes le Playbook doit être exécuté.Ici, il cible un groupe nommé 'conteneurs'.
-
'
become: yes
' indique à Ansible d'exécuter les tâches avec les privilèges d'administration (souvent en tant queroot
).Cela équivaut à utiliser sudo sur les systèmes Unix/Linux.
-
'
tasks
' est une liste de tâches que Ansible exécutera séquentiellement.Chaque tâche a un nom qui décrit ce que la tâche est censée faire.
-
'
apt
' est un module Ansible utilisé pour gérer les paquets sur les systèmes basés sur Debian/Ubuntu. -
'
update_cache: yes
' dit à Ansible de rafraîchir le cache des paquets locaux avant de faire une modification.C'est similaire à '
apt update
'. -
'
upgrade: dist
' indique à Ansible de mettre à niveau tous les paquets vers les dernières versions disponibles.Cela correspond à '
apt dist-upgrade
ouapt full-upgrade
'. -
'
state: present
' s'assure que le paquet spécifié ('vim
' dans cet exemple) est installé.Si '
vim
' n'est pas installé, Ansible l'installera.
-
Enregistrez le fichier et quittez l'éditeur de texte.
-
Exécutez le Playbook avec la commande suivante :
ansible-playbook -i /root/ansible/mon_inventaire.ini /root/ansible/mise_a_jour.yml
Si tout est configuré correctement, Ansible exécutera les tâches sur tous les hôtes spécifiés dans le groupe conteneurs
de votre inventaire :
Test de mémorisation/compréhension
TP - Installer Apache sur vos 3 conteneurs
Votre mission consiste à déployer un serveur Web Apache sur vos conteneurs.
Pour cela, vous allez créer un Playbook Ansible qui accomplira les tâches suivantes :
- Installer Apache.
- Démarrer le service Apache.
- S'assurer que le service Apache est activé au démarrage.
- Ouvrez un terminal sur votre serveur de contrôle Ansible.
- Créez un fichier nommé
deploy_apache.yml
dans le répertoire/root/ansible
. - Ouvrez ce fichier avec un éditeur de texte de votre choix, par exemple
nano
ouvim
. - Rédigez le Playbook nécessaire pour installer Apache, démarrer le service et l'activer au démarrage:
---
- name: Deploiement d'Apache sur les conteneurs
hosts: conteneurs
# become: yes # Pour utiliser sudo
tasks:
- name: Installation d'Apache
apt:
name: apache2
state: present
- name: Demarrage du service Apache
service:
name: apache2
state: started
enabled: yes
'become: yes'
Dans ce TP, pour se connecter à nos machines, nous utilisons l'utilisateur root
.
- En production, nous utiliserions un autre compte utilisateur (pour davantage de sécurité).
- Et pour permettre à cet utilisateur de devenir
root
pendant l'exécution de la commande (avecsudo
), nous devrions ajouter la ligne suivante dans le Playbook : 'become: yes'
- Exécutez le Playbook sur vos conteneurs cibles.
- Vérifiez que le service Apache est installé et fonctionne correctement
en accédant à l'adresse IP de chacun de vos conteneurs en utilisant la commande
curl
depuis votre serveur Ansible :
curl adresse_ip_de_votre_conteneur
Par exemple :
curl 172.17.0.3
Voici la commande pour installer curl
:
apt install curl
Pour vérifier que le service Apache est installé et fonctionne correctement (en accédant à l'adresse IP de chacun de vos conteneurs) vous pourrier aussi utiliser un navigateur Web.
C'est ce que nous verrons ensuite.
Une solution
Vous devez être connecté pour voir le contenu.
TP - Accéder à vos 3 sites avec un navigateur
Votre mission consiste maintenant à accéder à vos 3 sites Web (depuis votre ordinateur Windows) avec un navigateur Web.
Avec par exemple l'URL http://localhost:8081
Une fois qu'un conteneur Docker est créé, vous ne pouvez pas modifier directement le mappage des ports.
Les ports sont définis lors de la création du conteneur avec l'option -p
de la commande docker run
.
Si vous devez changer les ports mappés, vous devez arrêter et supprimer le conteneur, puis le recréer avec les nouveaux mappages de ports.
Pour accéder aux serveurs Web Apache dans les conteneurs depuis un navigateur sur la machine hôte nous devons mapper les ports des conteneurs aux ports de notre machine hôte :
-
Arrêtez les conteneurs actuels. Vous pouvez arrêter les conteneurs avec la commande
docker stop
:docker stop conteneur-web-1 conteneur-web-2 conteneur-web-3
-
Supprimez les conteneurs arrêtés. Une fois arrêtés, vous pouvez les supprimer avec la commande
docker rm
:docker rm conteneur-web-1 conteneur-web-2 conteneur-web-3
-
Redémarrez les conteneurs avec un mappage de port. Lorsque vous redémarrez les conteneurs, utilisez l'option
-p
pour mapper les ports. Par exemple, si vous souhaitez mapper le port 80 de chaque conteneur au port 8081, 8082 et 8083 de votre machine hôte, vous feriez :docker run -d --name conteneur-web-1 -p 8081:80 my-debian-ssh
docker run -d --name conteneur-web-2 -p 8082:80 my-debian-ssh
docker run -d --name conteneur-web-3 -p 8083:80 my-debian-sshCeci mappera le port 80 à l'intérieur de chaque conteneur (le port par défaut sur lequel Apache écoute) aux ports 8081, 8082 et 8083 sur votre machine hôte.
-
Copiez la clé publique SSH du serveur Ansible vers les serveurs cibles.
Vous pouvez le faire en affichant et en copiant la clé publique, puis en la collant manuellement dans le fichier
authorized_keys
de chaque conteneur cible :
-
Sur le serveur Ansible :
cat ~/.ssh/id_rsa.pub
-
Sur chaque serveur cible :
Ajoutez la clé publique au fichier
authorized_keys
de l'utilisateuransible
avec les commandes suivantes :docker exec -it conteneur-web-1 /bin/bash
mkdir -p /root/.ssh/
echo 'clé_publique' >> /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
chown root:root /root/.ssh/authorized_keys
exit -
Remplacez
'clé_publique'
par la clé que vous avez copiée. -
Répétez ces commandes pour
conteneur-web-2
etconteneur-web-3
.
-
Exécutez les 2 Playbooks d'Ansible :
ansible-playbook -i /root/ansible/mon_inventaire.ini /root/ansible/mise_a_jour.yml
et
ansible-playbook -i /root/ansible/mon_inventaire.ini /root/ansible/deploy_apache.yml
-
Accédez à Apache via votre navigateur. Après avoir redémarré les conteneurs avec le mappage de port, vous pouvez ouvrir votre navigateur et accéder à Apache en utilisant :
http://localhost:8081
http://localhost:8082
http://localhost:8083Chaque adresse correspondra à l'un de vos conteneurs Apache :
Assurez-vous que les ports que vous choisissez pour le mappage sur la machine hôte ne sont pas déjà utilisés par d'autres services. Vous pouvez choisir n'importe quel port non utilisé pour le mappage.