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.
Table of Contents
- Moduł ansible lineinfile
- Ansible lineinfile examples
- Przykład 1: Walidacja czy linia jest obecna w pliku bez żadnych modyfikacji
- Przykład2: Sprawdź, czy ciąg lub linia jest obecna w pliku i dodaj ją, jeśli nie istnieje
- Przykład3: Zamień linię w pliku za pomocą ansible lineinfile.
- Czy to zastąpi wszystkie pasujące linie? What if there are More than one Matches
- Przykład 4: Usuń linię z pliku, jeśli została znaleziona (wszystkie wystąpienia).
- Przykład5: Wstaw po pasującej linii używając parametru insertafter
- Przykład6: Wstaw przed dopasowaną linią używając parametru insertbefore
- Przykład 7: Sprawdzanie poprawności zmian przed zapisaniem/zatwierdzeniem
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ń
- Chcesz dodać linię, gdy nie jest ona jeszcze obecna.
- Chcesz zmienić numer portu w pliku konfiguracyjnym
- Chcesz wyłączyć SSL, gdy SSL jest włączony
- Chcesz dodać nowy wpis w pliku /etc/hosts
- Chcesz chcesz uaktualnić wersję pakietu, gdy zainstalowana wersja pasuje do twojego wyrażenia regularnego
- 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
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
.