Ansible lineinfile examples – Add, Modify, Delete, Replace lines

  • 0

Moduł Ansible lineinfile może być wybawieniem twojego dnia, gdy chcesz pracować z plikami, a w szczególności modyfikować ich zawartość w biegu, jak dodanie nowej linii w pliku lub uaktualnienie linii w pliku lub zastąpienie linii w pliku, gdy określony tekst zostanie znaleziony i wiele więcej.

lineinfile posiada różnorodny zestaw przykładów i dostarcza wiele parametrów, aby łatwo wykonać swoją pracę. W tym poście zobaczymy moduł ansible lineinfile w akcji z przykładami.

ansible lineinfile przykłady

Table of Contents

Moduł ansible lineinfile

Moduł ansible lineinfile jest pomocny, gdy chcesz dodać, usunąć, zmodyfikować pojedynczą linię w pliku. Możesz również użyć warunków, aby dopasować linię przed modyfikacją lub usunięciem za pomocą wyrażeń regularnych. Możesz ponownie użyć i zmodyfikować dopasowaną linię używając parametru back reference.

Zastanów się, czy masz któreś z poniższych wymagań

  1. Chcesz dodać linię, gdy nie jest ona jeszcze obecna.
  2. Chcesz zmienić numer portu w pliku konfiguracyjnym
  3. Chcesz wyłączyć SSL, gdy SSL jest włączony
  4. Chcesz dodać nowy wpis w pliku /etc/hosts
  5. Chcesz chcesz uaktualnić wersję pakietu, gdy zainstalowana wersja pasuje do twojego wyrażenia regularnego
  6. Chcesz usunąć nazwę użytkownika z pliku /etc/passwd używając regex

Mam nadzieję, że to ustawi kontekst. Zanim przejdziemy do przykładów Coś do podkreślenia.

Ansible Lineinfile może być użyty tylko do pracy z pojedynczą linią w pliku. Jeśli chcesz zastąpić wiele linii spróbuj modułu replace lub użyj blockinfile jeśli chcesz wstawić/uaktualnić/usunąć blok linii w pliku.

Jeśli chcesz dowiedzieć się więcej o module Ansible Replace możesz odnieść się do tego postu.

Ansible replace line in file – Ansible Replace Examples

Ansible lineinfile examples

Zebraliśmy tutaj różne przykłady ansible lineinfile. Są to przykłady, które uwzględniliśmy w tym poście. możesz wybrać, aby przeczytać wszystkie lub dowolny konkretny przykład.

  • Sprawdź, czy linia jest obecna bez żadnych modyfikacji
  • Sprawdź, czy linia jest obecna w pliku i dodaj ją, jeśli nie istnieje
  • Zastąp linię w pliku, jeśli zostanie znaleziona za pomocą ansible lineinfile
  • Usuń linię z pliku jeśli zostanie znaleziona – Wszystkie instancje
  • Wstaw przed pasującą linią używając parametru insertbefore
  • Wstaw po pasującej linii używając parametru insertafter
  • Zapewnij poprawność zmian przed zapisaniem

Przykład 1: Walidacja czy linia jest obecna w pliku bez żadnych modyfikacji

To jest tylko walidacja czy linia jest obecna w pliku czy nie. To nie zmodyfikuje pliku niezależnie od tego, jaki jest wynik. to jest tak jak uruchomienie polecenia quick find

Przykład podany poniżej ma na celu stwierdzenie, czy ciąg „LogLevel debug” znajduje się w pliku httpd.conf zdalnego serwera WWW apache.

Jak wspomniano wcześniej. Nie zostanie podjęta żadna akcja

W tym przykładzie zamierzamy sprawdzić, czy LogLevel jest Debug i wydrukować wiadomość Jeśli jest tam lub nie i nie podjąć żadnych działań. Robimy to za pomocą checkmode=yes

--- - nazwa: Examples of lineinfile hosty: web zadania: - nazwa: "Example1: Validate if a String or line is present in the file" become: yes become_user: root tags: example1 lineinfile: path: /etc/httpd/conf/httpd.conf linia: "LogLevel debug" state: present backup: yes check_mode: yes register: example1out

Chociaż ten playbook zgłosiłby, że dokonano zmiany, oznaczając ją jako changed=1, ale nie wykonałoby to żadnej modyfikacji na pliku, ponieważ uruchomiliśmy zadanie w trybie Check.

Tutaj jest szybkie polecenie ad-hoc, aby sprawdzić, jaki jest rzeczywisty LogLevel w zdalnym pliku httpd.conf

$ ansible web -m shell -a "grep -i LogLevel /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >># LogLevel: Kontroluj liczbę komunikatów logowanych do error_log.LogLevel warn

Zaleca się, aby zawsze mieć parametr backup: yes w swoim playbooku, gdy używasz pliku lineinfile. Pozwoli to upewnić się, że plik zostanie zarchiwizowany przed wprowadzeniem jakichkolwiek zmian. Pomogłoby to w przypadku, gdybyś chciał się cofnąć.

Przykład2: Sprawdź, czy ciąg lub linia jest obecna w pliku i dodaj ją, jeśli nie istnieje

W tym samym playbooku, który właśnie widzieliśmy, jeśli usuniemy tryb sprawdzania, będzie to poprawny playbook, który szuka linii i dodaje ją, gdy nie ma żadnych dopasowań

Ale jest problem tutaj linia, o której wspominasz, aby zostać dodana, zostanie dodana tylko na końcu pliku lub ostatniej linii. Można to kontrolować za pomocą dyrektyw insert_before i insert_before, które zostaną omówione w dalszej części artykułu.

Teraz playbook

--- - nazwa: Przykłady lineinfile hosts: web zadania: - nazwa: "Example2: Dodaj linię, jeśli nie istnieje" become: yes become_user: root tagi: example2 lineinfile: path: /etc/httpd/conf/httpd.conf linia: "LogLevel debug" state: present backup: yes register: example2out

W wyniku tego powstałby niepoprawny plik konfiguracyjny, ponieważ wpis zostałby dodany na końcu pliku.

$ ansible web -m shell -a "grep -in LogLevel /etc/httpd/conf/httpd.conf" mwiweb02 | CHANGED | rc=0 >>185:# LogLevel: Kontroluje liczbę komunikatów logowanych do error_log.189:LogLevel warn354:LogLevel debug

Które można kontrolować za pomocą Insert after i insert before, którymi zajmiemy się w dalszej części tego postu.

Przykład3: Zamień linię w pliku za pomocą ansible lineinfile.

W przykładzie2 widzieliśmy, jak dodać nową linię za pomocą modułu lineinfile. Teraz zobaczymy, jak zastąpić linię, gdy zostanie znaleziona linia Certain.

Chociaż możesz użyć modułu ansible replace, aby zastąpić. Moduł Lineinfile może być również użyty do zastąpienia linii.

Teraz w tym przykładzie zamierzamy zmienić LogLevel debug na LogLevel Debug z dużą literą D

Użyjemy Ansible Lineinfile z Regular Expressions do wyszukiwania linii, a element linii zawierałby argument line przechowywałby linię, którą należy zastąpić

Spójrz na poniższy Playbook i możesz go łatwo zrozumieć.

--- - name: Examples of lineinfile hosts: web tasks: - name: "Example1: Validate if a String or line is present in the file" become: yes become_user: root tags: example1 lineinfile: path: /etc/httpd/conf/httpd.conf # The String to Search regexp: "LogLevel warn" # The String to Replace line: "LogLevel debug" state: present backup: yes register: example1out

Wynikiem tego pliku byłoby coś takiego

$ ansible web -m shell -a "grep -in LogLevel /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>185:# LogLevel: Kontroluje liczbę komunikatów logowanych do error_log.189:LogLevel debug

Czy to zastąpi wszystkie pasujące linie? What if there are More than one Matches

Jeśli w pliku jest więcej niż jedno dopasowanie. Ansible Lineinfile zastąpiłby tylko ostatnią dopasowaną lub znalezioną linię.

Jeśli chciałbyś zastąpić wszystkie wystąpienia, musisz rozważyć użycie modułu replace, a nie lineinfile.

Przykład 4: Usuń linię z pliku, jeśli została znaleziona (wszystkie wystąpienia).

Teraz chcę usunąć linię LogLevel Debug, którą dodaliśmy wcześniej, ponieważ jest w złym miejscu, a także mamy już linięLogLevel warn obecną w tym samym pliku.

Tutaj jest playbook ansible do usunięcia linii z pliku i możemy użyć wyrażeń regularnych, aby znaleźć zarówno debug jak i Debug

--- - nazwa: Examples of lineinfile hosts: web tasks: - nazwa: "Example1: Validate if a String or line is present in the file" become: yes become_user: root tags: example1 lineinfile: path: /etc/httpd/conf/httpd.conf # String to Search regexp: "LogLevel ebug" # State is set to Absent to remove if the Searching Line is found state: absent backup: yes register: example1out

Here we are set the state parameter as absent which will remove if the Search is Success. Parametr line nie jest używany, ponieważ nie jest konieczny

Jak wspomniano wcześniej, spowoduje to usunięcie wszystkich pasujących linii z pliku, innymi słowy, wszystkich wyglądów Linii Wyszukiwania.

Przykład5: Wstaw po pasującej linii używając parametru insertafter

Ponieważ wzięliśmy plik Apache httpd.conf jako nasz plik bazowy w tym poście, weźmy pewne wymaganie, które często robiliśmy w Apache, czyli dodanie nowego listenera

Najpierw zobaczmy co już jest w pliku

$ ansible web -m shell -a "grep -in Listen /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>34:# Listen: Allows you to bind Apache to specific IP addresses and/or38:# Change this to Listen on specific IP addresses as shown below to 41:#Listen 12.34.56.78:8042:Listen 80

here 42 is the line number and you can see that we have only one Listen statement/directive as of now. Teraz aby Apache nasłuchiwał na 443 musimy dodać Listen 443 zaraz pod Listen 80
Zobaczmy jak wstawić po jakiejś linii używając parametru insertafter.

Tutaj jest playbook.

--- - nazwa: Examples of lineinfile hosts: web tasks: - nazwa: "Example1: Validate if a String or line is present in the file" become: yes become_user: root tags: lineinfileexample lineinfile: path: /etc/httpd/conf/httpd.conf insertafter: "^Listen +" line: "Listen 443" firstmatch: yes state: present register: lineinfileexample

W tym miejscu można zauważyć, że nie ma parametru REGEX. Nie jest on potrzebny, ponieważ sam parametr insertafter może mieć ciąg wyszukiwania ze składnią wyrażenia regularnego

$ ansible web -m shell -a "grep -in Listen /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>34:# Listen: Allows you to bind Apache to specific IP addresses and/or38:# Change this to Listen on specific IP addresses as shown below to 41:#Listen 12.34.56.78:8042:Listen 8043:Listen 443

If you notice the Line numbers in the Output, You can see the Listen 443 has been added right beneath the Listen 80

When there are multiple entries of the searching line is present in the file. Ostatnia dopasowana linia będzie brana pod uwagę.

Przykład6: Wstaw przed dopasowaną linią używając parametru insertbefore

Aby przetestować parametr insert before, weźmy ten sam plik httpd.conf jako plik bazowy i tym razem zaktualizujemy ServerAdmin Email ID z domyślnego ServerAdmin do Server Admin

Przed jakąkolwiek modyfikacją

aksarav@middlewareinventory:/apps/vagrant/webinfra$ ansible web -m shell -a "grep -in ServerAdmin /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>83:# ServerAdmin: Twój adres, gdzie należy zgłaszać problemy z serwerem87:ServerAdmin root@localhost

Ale musimy wyłączyć/komentować istniejącą linię ServerAdmin i dodać nowy wpis, Oto playbook do wykonania obu tych zadań.

--- - name: Examples of lineinfile hosts: web tasks: - name: "Example6: Comment the Exisiting ServerAdmin Line" become: yes become_user: root tags: lineinfileexample6_1 lineinfile: path: /etc/httpd/conf/httpd.conf regexp: '(^ServerAdmin .*)' line: '# \1' backrefs: yes state: present register: lineinfileexample6_1 - name: "Example6: Add a New ServerAdmin Before the Commented Line" become: yes become_user: root tags: lineinfileexample6_2 lineinfile: path: /etc/httpd/conf/httpd.conf insertbefore: '# ServerAdmin .*' line: "ServerAdmin " state: present register: lineinfileexample6_2

Oczekiwany wynik byłby czymś w rodzaju następujących.

aksarav@middlewareinventory:/apps/vagrant/webinfra$ ansible web -m shell -a "grep -in ServerAdmin /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>83:# ServerAdmin: Twój adres, na który należy zgłaszać problemy z serwerem87:ServerAdmin [email protected]:# ServerAdmin root@localhost

Widzisz, że linia numer 88 została zakomentowana, co było starszym ServerAdminem, a linia numer 87 jest naszym nowym ServerAdminem

Przykład 7: Sprawdzanie poprawności zmian przed zapisaniem/zatwierdzeniem

To jest fajna funkcja Ansible lineinfile, która pozwoli ci uruchomić komendę powłoki, aby sprawdzić, czy zmodyfikowany plik jest naprawdę w porządku lub czy są jakieś problemy. Ponieważ nasz plik bazowy jest plikiem konfiguracyjnym httpd.conf ma on pewną składnię i jeśli nie będziemy się do niej stosować, zostawimy całą stronę/infra na szali.

Więc sprawdźmy ją przed zapisaniem pliku.

Serwer HTTPD posiada polecenie sprawdzania składni pliku httpd.conf, które jest httpd -t

Gdy zostanie wywołane i nie ma problemów ze składnią. Polecenie wydrukuje komunikat Syntax OK jak poniżej i zwróci Zero Return Code, co jest wszystkim, co ma znaczenie dla Ansible. Ansible opiera się na kodzie zwrotnym polecenia walidacji.

$ httpd -t Syntax OK

Jeżeli będzie to wartość NON-ZERO, zmiany nie zostaną zatwierdzone i zadanie zakończy się niepowodzeniem.

Tutaj jest playbook do aktualizacji dyrektywy ServerName w Apache.

--- - name: Przykłady lineinfile hosts: web tasks: - name: "Example7: Update the ServerName" become: yes become_user: root lineinfile: path: /etc/httpd/conf/httpd.conf insertafter: '#ServerName www.example.com:80' line: "ServerName www.middlewareinventory.com:80" state: present # Command to Validate the Configuration and %s is a working copy of the file validate: "httpd -t -f %s"

Here the %s is the working copy of the actual file. Ansible zawsze kopiuje plik i zachowuje go jako kopię roboczą, a następnie wprowadza zmiany i w końcu kopiuje go do lokalizacji Destined i zastępuje oryginalny plik.

Quick Ad Hoc command to validate

$ ansible web -m shell -a "grep -in ServerName /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>92:# ServerName podaje nazwę i port, których serwer używa do identyfikacji siebie.98:# #ServerName www.example.com:8099:ServerName www.middlewareinventory.com:80 

Widzisz, że dyrektywa ServerName została dodana.

Dotarliśmy do końca artykułu.

Mam nadzieję, że to pomoże

Rate this article

Cheers
Sarav AK

Buy Me a Coffee at ko-fi.com

Follow us on Facebook or TwitterFor more practical videos and tutorials. Subskrybuj nasz kanałZnajdź mnie na Linkedin Mój profilDla wszelkich konsultacji lub aby nas zatrudnićJeśli podoba Ci się ten artykuł. Okaż swoje wsparcie! Kup mi kawę.

Signup for Exclusive „Subscriber-only” Content

.