My Daily Tutorials

Das Ansible lineinfile Modul kann verwendet werden, um eine Zeile einzufügen, eine bestehende Zeile zu ändern, eine bestehende Zeile zu entfernen oder eine Zeile zu ersetzen.

Einfügen einer Zeile

Zunächst werden wir sehen, wie man eine Zeile in eine Datei schreibt, wenn sie nicht vorhanden ist.

Wir können den Pfad der zu ändernden Datei mit dem Parameter path(>Ansible 2.3)/dest festlegen. Und wir werden die einzufügende Zeile mit dem Parameter line festlegen.

Das folgende Beispiel schreibt die Zeile ‚Inserting a line in a file‘ in die Datei ‚remote_server.txt‘. Die neue Zeile wird an das EOF angehängt. Wenn die Zeile bereits vorhanden ist, wird sie nicht hinzugefügt.

Die neue Zeile wird an das EOF angefügt. Wenn die Zeile bereits existiert, wird sie nicht hinzugefügt.

Wir haben auch den Parameter create gesetzt, der besagt, dass, wenn die Datei nicht vorhanden ist, eine neue Datei erstellt wird. Der Standardwert für den Status ist vorhanden. Aber ich füge ihn der Übersichtlichkeit halber trotzdem hinzu.

Der Standardwert für den Status ist vorhanden. Aber ich füge ihn der Übersichtlichkeit halber trotzdem hinzu.

- 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:

Wenn Sie die folgende Fehlermeldung erhalten,

lineinfile unsupported parameter for module: path

Es liegt wahrscheinlich an dem Problem mit dem path-Parameter. Bis ansible 2.3 war dieser Parameter ‚dest‘. Wenn Ihre Ansible-Version kleiner als 2.3 ist, dann ändern Sie den Parameter in ‚dest‘. Damit sollte das Problem gelöst sein.

Issue 2:

Wenn die Zieldatei nicht existiert, gibt Ansible eine Fehlermeldung wie unten aus. Sie können entweder sicherstellen, dass die Datei in der Remote-Datei existiert, oder Sie können den Parameter „create“ auf „yes“ setzen, um dieses Problem zu lösen.

Ziel /home/mdtutorials2/hello.txt existiert nicht

Einfügen einer neuen Zeile nach/vor einem Muster

Wir wollen nicht immer, dass die Zeile bis zum EOF eingefügt wird. Das Modul lineinfile bietet die Möglichkeit, die Zeile nach einem Muster oder vor einem Muster einzufügen. Dazu können wir die Parameter insertafter und insertbefore verwenden.

Im folgenden Beispiel möchte ich die Zeile vor der Zeile “ in die Datei ansible.cfg einfügen. Ich habe die “ mit Escape-Zeichen versehen, da es sich um spezielle Regex-Zeichen handelt.

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

Wenn Sie eine Zeile vor einem Muster einfügen müssen, können Sie den Parameter insertbefore verwenden. Im folgenden Beispiel wird die Zeile vor dem Muster ‚#library‘ in ansible.cfg eingefügt.

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

Entfernen einer Zeile

Sie können den Parameter state auf absent setzen, um die angegebenen Zeilen zu entfernen. Alle Vorkommen dieser Zeile werden entfernt.

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

Entfernen einer Zeile mit Ansible regexp

Sie können auch einen regexp zum Entfernen einer Zeile angeben. So können Sie sagen, dass alle Zeilen entfernt werden sollen, die mit dem Wort „Hallo“ beginnen usw.

Wir geben den regulären Ausdruck mit dem Parameter lineinfile regexp an. Das folgende Beispiel entfernt alle Zeilen, die mit DevOps beginnen.

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

Ersetzen/Ändern einer Zeile mit Regex

Um eine Zeile zu ändern, müssen wir den Ansible backrefs-Parameter zusammen mit dem regexp-Parameter verwenden. Dieser sollte mit state=present verwendet werden.

Wenn der regexp mit keiner Zeile übereinstimmt, dann wird die Datei nicht geändert. Wenn der regexp auf eine Zeile/mehrere Zeilen zutrifft, wird die zuletzt getroffene Zeile ersetzt. Außerdem werden die gruppierten Elemente in der Regexp aufgefüllt und können zur Änderung verwendet werden.

Im folgenden Beispiel wird eine Zeile kommentiert. Die gesamte Zeile wird erfasst, indem sie innerhalb der Klammer zu ‚\1‘ gesetzt wird. Das ‚#\1‘ ersetzt die Zeile durch ‚#‘, gefolgt von dem, was erfasst wurde.

Sie können mehrere Erfassungen haben und diese durch die Verwendung von ‚\1‘, ‚\2‘, ‚\3‘ usw. aufrufen. Wenn Sie weitere Informationen zur Gruppierung benötigen, lesen Sie regular-expression.info.

Kommentieren einer Zeile mit Ansible lineinfile backrefs

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

Entkommentieren der Zeile mit lineinfile regexp

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

Wir können die gleiche Zeile mit kleinen Änderungen entkommentieren. Hier platziere ich die auskommentierte Zeile mit dem ‚#‘ außerhalb der Gruppierung. So wird jetzt nur der Teil nach dem ‚#‘ in \1 erfasst. Und nach dem Ausführen des Skripts können Sie sehen, dass die Zeile unkommentiert ist.

Lineinfile mehrere Zeilen

Dieser Abschnitt dient dazu, mehrere lineinfile-Aufgaben durch eine einzige Aufgabe und with_items zu ersetzen. Wenn Sie mehrere Zeilen zu einer Datei hinzufügen wollen, sollten Sie das Modul blockinfile verwenden.

Mit with_items können Sie eine Liste von Hashes durchlaufen. Sie können das Ziel, die Zeile, den Regexp usw. für jede Aufgabe in der Liste angeben. Grundsätzlich können Sie es verwenden, anstatt mehrere Aufgaben zu schreiben.

Das folgende Beispiel wird zwei Dateien ändern: ansible.cfg und 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'}

Schreibe einen Kommentar