Mes tutoriels quotidiens

Le module Ansible lineinfile peut être utilisé pour insérer une ligne, modifier une ligne existante, supprimer une ligne existante ou pour remplacer une ligne.

Insérer une ligne

D’abord, nous allons voir comment écrire une ligne dans un fichier, si celui-ci n’est pas présent.

Nous pouvons définir le chemin du fichier à modifier en utilisant le paramètre path(>Ansible 2.3)/dest. Et nous définirons la ligne à insérer en utilisant le paramètre line.

L’exemple suivant écrira la ligne ‘Insertion d’une ligne dans un fichier’ dans le fichier ‘remote_server.txt’. La nouvelle ligne sera ajoutée à l’EOF. Si la ligne existe déjà, alors elle ne sera pas ajoutée.

La nouvelle ligne sera ajoutée à l’EOF. Si la ligne existe déjà, alors elle ne sera pas ajoutée.

Nous avons également défini le paramètre create, qui dit que si le fichier n’est pas présent, alors créez un nouveau fichier. La valeur par défaut de l’état est présente. Mais je l’ajoute quand même pour plus de clarté.

La valeur par défaut pour l’état est présente. Mais je l’ajoute quand même pour plus de clarté.

- hosts: loc tasks: - name: Ansible insert lineinfile example lineinfile: dest: /home/mdtutorials2/remote_server.txt line: Inserting a line in a file. state: present create: yes

Issue1:

Si vous obtenez l’erreur suivante,

lineinfile unsupported parameter for module : path

C’est probablement dû au problème du paramètre path. Jusqu’à ansible 2.3, ce paramètre était ‘dest’. Donc si votre version ansible est inférieure à 2.3, alors changez le paramètre en ‘dest’. Cela devrait résoudre le problème.

Issue 2:

Si le fichier de destination n’existe pas, alors Ansible lancerait une erreur comme ci-dessous. Vous pouvez soit vous assurer que le fichier existe dans le fichier distant, soit définir le paramètre ‘create’ sur yes pour résoudre ce problème.

Destination /home/mdtutorials2/hello.txt n’existe pas

Insertion d’une nouvelle ligne après/avant un motif

Nous ne voulons pas toujours que la ligne soit insérée jusqu’au EOF. Le module lineinfile donne la possibilité d’insérer la ligne après un motif ou avant un motif. Nous pouvons utiliser les paramètres insertafter et insertbefore respectivement pour cela.

Dans l’exemple ci-dessous, je veux insérer la ligne avant la ligne  » dans le fichier ansible.cfg. J’ai échappé le  » puisqu’il s’agit de caractères spéciaux de regex.

- name: Ansible lineinfile insert after example lineinfile: dest: /etc/ansible/ansible.cfg line: 'inventory = /home/fedora/inventory.ini' insertafter: '\'

Si vous devez insérer une ligne avant un motif, vous pouvez utiliser le paramètre insertbefore. L’exemple suivant insérera la ligne avant le motif ‘#library’ dans ansible.cfg.

- name: Ansible lineinfile insertbefore example lineinfile: dest: /etc/ansible/ansible.cfg line: 'inventory = /home/mdtutorials/inventory.ini' insertbefore: '#library'

Suppression d’une ligne

Vous pouvez définir le paramètre state sur absent, pour supprimer les lignes spécifiées. Toutes les occurrences de cette ligne seront supprimées.

- hosts: loc tasks: - name: Ansible lineinfile remove line example lineinfile: dest: /home/mdtutorials2/remote_server.txt line: Removed lines. state: absent

Suppression d’une ligne à l’aide du regexp Ansible

Vous pouvez également spécifier un regexp pour supprimer une ligne. Ainsi, vous pouvez dire supprimer toutes les lignes qui commencent par le mot ‘hello’ etc.

Nous donnons l’expression régulière en utilisant le paramètre regexp lineinfile. L’exemple suivant supprimera toutes les lignes commençant par DevOps.

- hosts: loc tasks: - name: Ansible lineinfile regexp example lineinfile: dest: /home/mdtutorials2/remote_server.txt regexp: '^DevOps' state: absent

Remplacer/modifier une ligne en utilisant Regex

Pour modifier une ligne, nous devons utiliser le paramètre Ansible backrefs avec le paramètre regexp. Ceci doit être utilisé avec state=present.

Si le regexp ne correspond à aucune ligne, alors le fichier n’est pas modifié. Si la regexp correspond à une ligne/multiples lignes, alors la dernière ligne correspondante sera remplacée. De plus, les éléments groupés dans la regexp sont peuplés et peuvent être utilisés pour la modification.

Dans l’exemple ci-dessous, nous commentons une ligne. La ligne complète est capturée ligne en les plaçant à l’intérieur des parenthèses à ‘\1’. Le ‘#\1’ remplace la ligne par ‘#’ suivi de ce qui a été capturé.

Vous pouvez avoir plusieurs captures et les appeler en utilisant ‘\1’, ‘\2’, ‘\3’ etc. Si vous avez besoin d’en savoir plus sur le regroupement, référez-vous à regular-expression.info.

Commenter une ligne avec Ansible lineinfile backrefs

- name: Ansible lineinfile regexp replace example lineinfile: dest: /etc/ansible/ansible.cfg regexp: '(inventory = /home/fedora/inventory.ini.*)' line: '#' backrefs: yes

Décommenter la ligne avec lineinfile regexp

- name: Ansible lineinfile backrefs example lineinfile: dest: /etc/ansible/ansible.cfg regexp: '#(inventory = /home/fedora/inventory.ini.*)' line: '' backrefs: yes

Nous pouvons décommenter la même ligne avec de petites modifications. Ici, je place la ligne commentée avec le ‘#’ en dehors du regroupement. Donc maintenant, seule la partie après ‘#’ est capturée dans \1. Et après avoir exécuté le script, vous pouvez voir que la ligne est décommentée.

Lineinfile lignes multiples

Cette section est pour le remplacement de plusieurs tâches lineinfile avec une seule tâche et with_items. Si votre intention est d’ajouter plusieurs lignes à un fichier, vous devriez utiliser le module blockinfile.

Vous pouvez utiliser with_items pour parcourir en boucle une liste de hachages. Vous pouvez spécifier le dest, la ligne, le regexp etc. pour chaque tâche dans la liste. Fondamentalement, vous pouvez l’utiliser au lieu d’écrire plusieurs tâches.

L’exemple suivant modifiera deux fichiers : ansible.cfg et remote_server.txt.

- hosts: loc tasks: - name: Ansible lineinfile multiple lines with_items example lineinfile: dest: "{{ item.dest }}" regexp: "{{ item.regexp }}" line: "{{ item.line }}" backrefs: yes with_items: - {dest: '/etc/ansible/ansible.cfg', regexp: 'config file for ansible', line: 'line changed'} - {dest: '/home/dinoopblogger/remote_server.txt', regexp: 'hello', line: 'world'}

.

Laisser un commentaire