Aller au contenu principal

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.

  1. 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
  1. É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 que root).

    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 ou apt 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.

  1. Enregistrez le fichier et quittez l'éditeur de texte.

  2. 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


Que représente un Playbook dans Ansible ?


Quel langage est utilisé pour écrire les Playbooks Ansible ?


Que fait la directive 'become: yes' dans un Playbook Ansible ?


Comment exécutez-vous un Playbook Ansible ?



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.
  1. Ouvrez un terminal sur votre serveur de contrôle Ansible.
  2. Créez un fichier nommé deploy_apache.yml dans le répertoire /root/ansible.
  3. Ouvrez ce fichier avec un éditeur de texte de votre choix, par exemple nano ou vim.
  4. 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 (avec sudo), nous devrions ajouter la ligne suivante dans le Playbook : 'become: yes'
  1. Exécutez le Playbook sur vos conteneurs cibles.
  2. 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

astuce

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

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

attention

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 :

  1. 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
  2. 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
  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-ssh

    Ceci 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.

  4. 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'utilisateur ansible 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 et conteneur-web-3.

  1. 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
  2. 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:8083

    Chaque 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.