Comment utiliser le module lineinfile d’Ansible pour gérer les fichiers texte

Ansible est un outil d’automatisation largement utilisé qui peut gérer des centaines de nœuds en une seule opération. Ansible offre de nombreuses fonctionnalités exceptionnelles, et l’une d’entre elles est sa capacité à gérer une seule ligne au sein d’un fichier sur des nœuds distants en utilisant le module Ansible lineinfile.

Le module Ansible lineinfile effectue diverses actions sur une seule ligne d’un fichier, telles que le remplacement d’une ligne, la mise à jour d’une ligne ou l’ajout d’une ligne particulière.

Dans ce tutoriel, vous allez apprendre ce qu’est le module Ansible lineinfile, comment il fonctionne et comment l’utiliser pour gérer des fichiers texte.

Prérequis

Ce billet sera un tutoriel étape par étape sur le module Ansible lineinfile. Si vous souhaitez suivre, assurez-vous d’avoir les éléments suivants en place :

  • A remote computer to run commands. You’ll need an inventory file set up and one or more hosts already configured to run Ansible command and playbooks on. The remote Linux computer will be called myserver, and the tutorial will use an inventory group called web.
  • Apache doit déjà être installé sur l’ordinateur distant si vous souhaitez suivre exactement le tutoriel.

Modification d’un fichier texte avec le module lineinfile d’Ansible.

Commençons ce tutoriel en exécutant le module lineinfile d’Ansible à l’aide des commandes ad hoc. Les commandes ad hoc sont un moyen rapide de tester ou d’exécuter une seule commande sur un hôte distant.

Connectez-vous à votre contrôleur Ansible et exécutez la commande suivante. Cette commande utilise le module lineinfile (-m) pour se connecter à la machine web et transmet un argument (-a) qui est la commande à exécuter.

Dans cet exemple, le module lineinfile met à jour l’entrée localhost en associant l’adresse IP 127.0.0.1 à myapache dans le fichier /etc/hosts. En associant le 127.0.0.1 à myapache, vous pouvez accéder à la page de test apache localement sur HTTP://myapache:80

  • path indique l’emplacement du fichier.
  • regexp trouve l’expression régulière, le cas échéant, dans le fichier et met à jour avec 127.0.0.1 myapache spécifié dans le paramètre line.
  • -devenir permet d’exécuter la commande en tant qu’utilisateur privilégié.
  • Le groupe web est le groupe d’inventaire qui est une collection de tous les serveurs.
  • ansible.builtin.lineinfile ou simplement lineinfile est le nom du module.
ansible web -m ansible.builtin.lineinfile -a "path=/etc/hosts regexp='^127\.0\.0\.1'  line='127.0.0.1 myapache' state=present" --become

Après avoir exécuté la commande, vous devriez voir un message CHANGED qui confirme que la ligne a été mise à jour avec succès sur l’hôte distant.

Running the ad hoc command with ansible lineinfile module

Connectez-vous au nœud distant en utilisant un client SSH et vérifiez si le fichier /etc/hosts a été mis à jour avec la nouvelle valeur en utilisant la commande cat.

Comme vous pouvez le voir ci-dessous, l’entrée localhost a été mise à jour avec succès avec 127.0.0.1 myapache sur la machine distante.

Verifying the host file on remote machine

Modification de plusieurs fichiers texte dans un playbook

Travailler avec une commande ad hoc unique pour gérer les lignes sur une machine distante peut être acceptable, mais cela va être difficile si vous avez des lignes dans plusieurs fichiers ou plusieurs lignes dans un fichier à gérer. Au lieu d’utiliser des commandes ad hoc, envisagez d’utiliser le module lineinfile d’Ansible dans le playbook en utilisant la commande ansible-playbook.

Maintenant, apprenons comment utiliser le module lineinfile d’Ansible dans le playbook et modifier quelques lignes.

En supposant que vous êtes déjà connecté à l’hôte du contrôleur Ansible:

1. Créez un répertoire appelé ansible_lineinfile_module_demo dans votre répertoire personnel. Ce répertoire contiendra le playbook que vous utiliserez pour invoquer le module lineinfile.

mkdir ~/ansible_lineinfile_module_demo
cd ~/ansible_lineinfile_module_demo

2. Créez un autre fichier appelé my_playbook.yml dans le répertoire ~/ansible_lineinfile_module_demo et collez-y le contenu suivant du playbook YAML. Ce playbook comporte plusieurs tâches qui utilisent le module Ansible lineinefile pour gérer les lignes de différents fichiers de configuration pour Apache sur la machine distante.

Le playbook ci-dessous contient les tâches suivantes :

1. Vérifie si ADMIN est présent dans le fichier /etc/sudoers; si ce n’est pas le cas, la tâche l’ajoute.

2. Assure que le port par défaut d’Apache écoute sur le port 8080 dans le fichier /etc/apache2/ports.conf; s’il trouve une autre ligne de port, le module lineinfile la met à jour avec le port 8080. De même, dans le fichier /etc/apache2/apache2.conf, il met à jour MaxKeepAliveRequests à 1000 et KeepAliveTimeout à 100.

3. Ajoute la ligne avec le texte « Bonjour, ceci est ma page Apache » à la fin de la page index.html sur le serveur distant sous le répertoire /var/www/html.

Les playbooks Ansible sont écrits en YAML. Pour en savoir plus sur YAML, cliquez ici

---
- name: Ansible lineinfile module example
# Définition du serveur distant où le module lineinfile Ansible sera appliqué
  hosts: web
  remote_user: ubuntu   # Utilisation de l'hôte distant comme ubuntu
  become: true
  tasks:

# (Tâche-1) Vérification du fichier Sudoers si les administrateurs sont autorisés à effectuer toutes les opérations
    - name: Validate the sudoers file before saving
      ansible.builtin.lineinfile:
         path: /etc/sudoers
         state: present
         regexp: '^%ADMIN ALL='
         line: '%ADMIN ALL=(ALL) NOPASSWD: ALL'

# (Tâche-2) Mise à jour du port par défaut d'Apache en 8080
    - name: Ensure the default Apache port is 8080
      ansible.builtin.lineinfile:
         path: /etc/apache2/ports.conf
         regexp: '^Listen '
         insertafter: '^#Listen '
         line: Listen 8080

# (Tâche-3) Ajout de la ligne à la fin de la page html Hello This is my Apache Page
    - name: Add a line to a file if the file does not exist
      ansible.builtin.lineinfile:
         path: /var/www/html/index.html
         line: Hello This is my Apache Page
         create: yes

# (Tâche-4) Vérification du fichier Sudoers si les administrateurs sont autorisés à effectuer toutes les opérations
    - name: Ensure MaxKeepAliveRequests is set to greater than 100
      ansible.builtin.lineinfile:
         path: /etc/apache2/apache2.conf
         regexp: '^MaxKeepAliveRequests'
         line: MaxKeepAliveRequests=1000

# (Tâche-5) Vérification du fichier Sudoers si les administrateurs sont autorisés à effectuer toutes les opérations
    - name: Ensure KeepAliveTimeout is set to greater than 50
      ansible.builtin.lineinfile:
         path: /etc/apache2/apache2.conf
         regexp: '^KeepAliveTimeout'
         line: KeepAliveTimeout=100

3. Maintenant, invoquez le playbook et exécutez les tâches en utilisant la commande ansible-playbook pour ajouter ou mettre à jour toutes les lignes définies dans le playbook sur l’hôte distant.

ansible-playbook my_playbook.yml 
Invoking the ansible playbook

Vous pouvez voir ci-dessous que la TÂCHE a un statut de modifié, ce qui signifie que l’hôte distant n’était pas dans l’état approprié et a été modifié pour exécuter la commande. Pour cette TÂCHE qui a un statut OK, cela montre qu’elles ne nécessitent aucun changement.

4. Ensuite, connectez-vous en SSH à l’hôte distant en utilisant votre client SSH préféré.

5. Enfin, vérifiez si toutes les lignes définies dans le my_playbook.yml sont mises à jour ou ajoutées sur l’hôte distant en utilisant la commande cat.

# Pour vérifier si l'administrateur est présent avec tous les privilèges et l'ajouter sinon
cat /etc/sudoers
# Pour vérifier si MaxKeepAliveRequests et KeepAliveTimeout ont été mis à jour à 1000 et 100, respectivement.
cat /etc/apache2/apache.config | grep Alive
# Pour vérifier si Apache écoute sur le port 8080
cat /etc/apache2/ports.config

La capture d’écran ci-dessous confirme que le admin est déjà ajouté dans le fichier sudoers.

Verifying the sudoers file

De plus, la capture d’écran ci-dessous confirme que Apache écoute sur le Port 8080 par défaut.

Verifying the ports for in the config file

Enfin, vérifiez si MaxKeepAliveRequests et KeepAliveTimeout ont été mis à jour à 1000 et 100, respectivement.

Verifying the MaxKeepAliveRequests and KeepAliveTimeout in the config file

Conclusion

Le module Ansible lineinfile est un excellent moyen de modifier des fichiers texte sur des hôtes distants. Le module offre une excellente manière d’ajouter, supprimer et modifier des lignes dans des fichiers texte au sein de vos playbooks.

Quels autres cas d’utilisation pensez-vous bénéficier du module Ansible lineinfile?

Source:
https://adamtheautomator.com/ansible-lineinfile/