Variables et modèles

AnsibleBeginner
Pratiquer maintenant

Introduction

Si vous gérez 100 serveurs, vous ne voulez pas qu’ils soient exactement identiques. Chaque serveur peut avoir besoin de son propre nom d’hôte, de sa propre adresse IP ou de paramètres de configuration spécifiques.

Ansible gère cela avec les variables et les modèles.

  • Variables : espaces réservés pour des données, comme port: 8080 ou server_name: "web-01".
  • Modèles : fichiers texte contenant des « trous ». Ansible les remplit avec des variables pour créer le fichier final.

Cette combinaison rend l’automatisation réutilisable plutôt que répétitive. Vous pouvez conserver une structure générale pour de nombreux hôtes tout en modifiant les données insérées pour chaque environnement ou chaque machine.

Ansible utilise un langage de modélisation appelé Jinja2. L’automatisation devient ainsi plus réutilisable, car un même modèle peut produire différents fichiers de configuration finaux selon les variables fournies.

Et transformez-le en : Welcome to web-01

Dans ce laboratoire, vous allez générer une page web HTML personnalisée pour votre serveur à l’aide de variables et de modèles.

Créer un modèle

Commençons par organiser les fichiers. Ansible recherche les modèles dans un dossier spécifique nommé templates.

Cette convention fait partie de la philosophie de conception d’Ansible. Ansible privilégie des structures de répertoires prévisibles afin que l’automatisation reste facile à lire et à partager entre les équipes.

Créez ce répertoire dans votre dossier de projet :

mkdir -p ~/project/templates

Créez maintenant le fichier modèle. Les fichiers modèles se terminent généralement par .j2 (pour Jinja2).

Ouvrez nano pour créer index.html.j2 :

nano ~/project/templates/index.html.j2

Ajoutez le code HTML suivant. Remarquez les accolades spéciales {{ }}. Elles indiquent à Ansible : « insérer une variable ici ».

<html>
  <head>
    <title>{{ page_title }}</title>
  </head>
  <body>
    <h1>Welcome to {{ inventory_hostname }}</h1>
    <p>This file was generated by Ansible.</p>
  </body>
</html>

Comprendre les variables :

  • {{ page_title }} : il s’agit d’une variable personnalisée. Nous définirons sa valeur dans notre playbook à l’étape suivante.
  • {{ inventory_hostname }} : il s’agit d’une variable magique. Ansible la connaît automatiquement : c’est le nom du serveur sur lequel il travaille actuellement, dans notre cas localhost.

Il est utile de distinguer ces deux types de valeurs. Certaines variables sont définies par vous, tandis que d’autres sont fournies automatiquement par Ansible à partir de l’inventaire et du contexte d’exécution.

Enregistrez le fichier et quittez (Ctrl+X, Y, Enter).

Définir les variables

Nous avons maintenant besoin d’un playbook pour utiliser ce modèle. Dans le playbook, nous définirons la valeur de notre variable personnalisée page_title.

Créez un nouveau fichier nommé playbook.yml :

nano ~/project/playbook.yml

Commencez par définir le play et les variables :

---
- name: Deploy Web Page
  hosts: localhost
  vars:
    page_title: "My LabEx Web Server"
  tasks:

Comprendre le code :

  • vars: : cette section permet de répertorier vos variables.
  • page_title: "..." : nous indiquons à Ansible que, chaque fois qu’il rencontre {{ page_title }} dans un modèle, il doit le remplacer par "My LabEx Web Server".

Laissez le fichier ouvert pour l’étape suivante.

Utiliser le module template

Ajoutons maintenant la tâche qui effectue réellement le travail. Nous utilisons le module template. Ce module lit notre fichier .j2, y insère les valeurs des variables, puis enregistre le résultat sur le serveur.

En pratique, le module template permet de déployer de nombreux fichiers de configuration dans des environnements réels. Au lieu de copier un fichier statique, vous générez une version adaptée à l’hôte à partir d’un modèle commun.

Ajoutez la tâche à votre fichier playbook.yml. Faites attention à l’indentation !

---
- name: Deploy Web Page
  hosts: localhost
  become: yes
  vars:
    page_title: "My LabEx Web Server"
  tasks:
    - name: Create index.html from template
      template:
        src: templates/index.html.j2
        dest: /var/www/html/index.html
        mode: "0644"

Comprendre le code :

  • template: : le module que nous utilisons.
  • src : le fichier source, c’est-à-dire notre modèle contenant les espaces réservés.
  • dest : la destination, où le fichier HTML final doit être enregistré.
  • mode: "0644" : définit les permissions du fichier afin que le serveur web puisse le lire.
  • become: yes : nous l’avons ajouté, car l’écriture dans /var/www/html nécessite les permissions root.

Enregistrez le fichier et quittez.

Déployer et vérifier

Exécutons le playbook pour voir le résultat.

Exécutez le playbook :

ansible-playbook -i inventory playbook.yml

Si tout fonctionne, vous verrez un état changed.

Affichez maintenant le fichier final créé par Ansible. Les espaces réservés doivent avoir disparu et avoir été remplacés par du texte réel.

Lisez le fichier HTML généré :

cat /var/www/html/index.html

Résultat attendu :

<html>
  <head>
    <title>My LabEx Web Server</title>
  </head>
  <body>
    <h1>Welcome to localhost</h1>
    <p>This file was generated by Ansible.</p>
  </body>
</html>

Comme vous pouvez le constater, {{ page_title }} est devenu "My LabEx Web Server" et {{ inventory_hostname }} est devenu "localhost".

Résumé

Dans ce laboratoire, vous avez appris à rendre vos configurations dynamiques.

  1. Modèles : vous avez créé un fichier .j2 contenant des {{ placeholders }}.
  2. Variables : vous avez défini des valeurs dans la section vars du playbook.
  3. Variables magiques : vous avez utilisé inventory_hostname, qu’Ansible fournit automatiquement.
  4. Module template : vous avez utilisé le module template pour combiner les variables et les modèles dans un fichier de configuration final.

Cette fonction puissante vous permet d’utiliser un seul modèle pour configurer des milliers de serveurs, chacun avec ses propres informations spécifiques.