My Daily Tutorials

Modułu Ansible lineinfile można używać do wstawiania linii, modyfikowania istniejącej linii, usuwania istniejącej linii lub zastępowania linii.

Wstawianie linii

Po pierwsze, zobaczymy jak zapisać linię do pliku, jeśli nie jest ona obecna.

Możemy ustawić ścieżkę do pliku, który ma być zmodyfikowany używając parametru path(>Ansible 2.3)/dest. Natomiast linię, która ma zostać wstawiona, ustawimy za pomocą parametru line.

Następujący przykład zapisze linię 'Wstawianie linii w pliku’ do pliku 'remote_server.txt’. Nowa linia zostanie dodana do EOF. Jeśli linia już istnieje, to nie zostanie dodana.

Nowa linia zostanie dodana do EOF. Jeśli linia już istnieje, to nie zostanie dodana.

Ustawiliśmy również parametr create, który mówi, że jeśli plik nie jest obecny, to utwórz nowy plik. Wartość domyślna dla tego stanu jest obecna. Ale dodaję to i tak dla jasności.

Domyślna wartość dla stanu jest obecna. Ale i tak dodaję ją dla jasności.

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

Jeśli otrzymasz następujący błąd,

lineinfile unsupported parameter for module: path

Jest to prawdopodobnie spowodowane problemem z parametrem path. Do wersji ansible 2.3 parametr ten miał wartość 'dest’. Jeśli więc twoja wersja ansible jest niższa niż 2.3, zmień ten parametr na 'dest’. To powinno rozwiązać problem.

Kwestia 2:

Jeśli plik docelowy nie istnieje, Ansible wyrzuci błąd jak poniżej. Możesz albo upewnić się, że plik istnieje w pliku zdalnym, albo ustawić parametr 'create’ na yes, aby rozwiązać ten problem.

Plik docelowy /home/mdtutorials2/hello.txt nie istnieje

Wstawianie nowej linii po/przed wzorcem

Nie zawsze chcemy, aby linia była wstawiana do EOF. Moduł lineinfile daje możliwość wstawienia linii po wzorcu lub przed wzorcem. Możemy użyć do tego odpowiednio parametrów insertafter i insertbefore.

W poniższym przykładzie, chcę wstawić linię przed linią ” w pliku ansible.cfg. Uniknąłem znaków ” ponieważ są to specjalne znaki regex.

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

Jeśli potrzebujesz wstawić linię przed wzorcem, możesz użyć parametru insertbefore. Poniższy przykład spowoduje wstawienie linii przed wzorcem '#library’ w ansible.cfg.

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

Usuwanie linii

Możesz ustawić parametr state na absent, aby usunąć określone linie. Wszystkie wystąpienia tej linii zostaną usunięte.

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

Usuwanie linii przy użyciu Ansible regexp

Możesz również określić regexp, aby usunąć linię. Możesz więc powiedzieć usuń wszystkie linie, które zaczynają się od słowa 'hello’ itd.

Podajemy wyrażenie regularne używając parametru lineinfile regexp. Poniższy przykład usunie wszystkie linie zaczynające się od DevOps.

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

Zastępowanie/modyfikowanie linii przy użyciu Regex

Aby zmodyfikować linię, musimy użyć parametru Ansible backrefs wraz z parametrem regexp. Należy go użyć z parametrem state=present.

Jeśli parametr regexp nie pasuje do żadnej linii, plik nie zostanie zmieniony. Jeśli regexp pasuje do linii/wielu linii, wtedy ostatnia dopasowana linia zostanie zastąpiona. Również zgrupowane elementy w regexp są zaludnione i mogą być użyte do modyfikacji.

W poniższym przykładzie komentujemy linię. Pełna linia jest przechwytywana przez umieszczenie ich wewnątrz nawiasów do '#1′. '#’ zastępuje linię z '#’, po którym następuje to, co zostało przechwycone.

Możesz mieć wiele przechwyceń i nazywać je za pomocą '\1′, '\2′, '\3′ itd. Jeśli potrzebujesz więcej informacji na temat grupowania, zapoznaj się z regular-expression.info.

Komentowanie linii za pomocą Ansible lineinfile backrefs

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

Uncommenting the line with lineinfile regexp

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

Możemy odkomentować tę samą linię z małymi modyfikacjami. Tutaj umieszczam komentowaną linię z '#’ poza grupowaniem. Więc teraz tylko część po '#’ jest przechwytywana w \1. A po uruchomieniu skryptu, możesz zobaczyć, że linia jest odkomentowana.

Lineinfile wiele linii

Ta sekcja służy do zastąpienia wielu zadań lineinfile pojedynczym zadaniem i with_items. Jeśli twoim zamiarem jest dodanie wielu linii do pliku, powinieneś użyć modułu blockinfile.

Możesz użyć with_items do pętli przez listę haszy. Możesz określić dest, linię, regexp itp. dla każdego zadania na liście. Zasadniczo, możesz użyć tego zamiast pisania wielu zadań.

Następujący przykład zmieni dwa pliki: ansible.cfg i 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'}

.

Dodaj komentarz