Ansible lineinfile examples – Add, Modify, Delete, Replace lines
- 0
Modulul Ansible lineinfile ar putea fi salvatorul zilei tale atunci când vrei să lucrezi cu fișiere și mai ales să le modifici conținutul pe fugă, cum ar fi adăugarea unei linii noi în fișier sau actualizarea unei linii din fișier sau înlocuirea unei linii din fișier atunci când se găsește un anumit text și multe altele.
lineinfile are un set variat de exemple și oferă mulți parametri pentru a vă face treaba cu ușurință. În această postare, vom vedea modulul ansible lineinfile în acțiune cu exemple.
Tabelă de materii
- Modul Ansible lineinfile
- Ansible lineinfile examples
- Exemplu 1: Validarea dacă o linie este prezentă în fișier fără nicio modificare
- Exemplu2: Validați dacă un șir de caractere sau o linie este prezentă în fișier și adăugați-o dacă nu există
- Exemplu3: Înlocuirea unei linii într-un fișier cu ansible lineinfile.
- Va înlocui toate liniile care corespund? Ce se întâmplă dacă există mai multe potriviri
- Exemplu 4: Eliminarea unei linii din fișier, dacă este găsită ( Toate instanțele )
- Exemplu5: Insert After a matching line using insertafter parameter
- Exemplu6: Insert Before a matching line using insertbefore parameter
- Exemplu 7: Validarea modificărilor înainte de a salva/commite
Modul Ansible lineinfile
Modul ansible lineinfile este util atunci când doriți să adăugați, să eliminați, să modificați o singură linie într-un fișier. De asemenea, puteți utiliza condiții pentru a potrivi linia înainte de a o modifica sau de a o elimina folosind expresii regulate. Puteți reutiliza și modifica linia corespunzătoare folosind parametrul back reference.
Considerați că aveți oricare dintre următoarele cerințe
- Vreți să adăugați o linie atunci când aceasta nu este deja prezentă.
- Doriți să modificați numărul de port în fișierul de configurare
- Doriți să dezactivați SSL atunci când acesta este activat
- Doriți să adăugați o nouă intrare în fișierul /etc/hosts
- Doriți să adăugați o nouă intrare în fișierul /etc/hosts
- Voi doriți să actualizați versiunea pachetului atunci când versiunea instalată se potrivește cu expresia dvs. regulată
- Vreți să eliminați un nume de utilizator din fișierul /etc/passwd folosind regex
Sperăm că acest lucru stabilește contextul. Înainte de a continua cu exemplele Ceva de subliniat.
Ansible Lineinfile poate fi folosit doar pentru a lucra o singură linie dintr-un fișier. Dacă doriți să înlocuiți mai multe linii încercați modulul replace sau folosiți blockinfile dacă doriți să inserați/actualizați/eliminați un bloc de linii într-un fișier.
Dacă doriți să explorați mai multe despre modulul Ansible Replace puteți consulta această postare.
Ansible replace line in file – Ansible Replace Examples
Ansible lineinfile examples
Am adunat aici diverse exemple de ansible lineinfile. Acestea sunt exemplele pe care le-am acoperit în acest post. puteți alege să citiți toate sau orice exemplu specific.
- Validați dacă o linie este prezentă fără nicio modificare
- Validați dacă o linie este prezentă în fișier și adăugați-o dacă nu există
- Înlocuiți o linie într-un fișier Dacă este găsită cu ansible lineinfile
- Îndepărtați o linie din fișierul fișier dacă este găsită – Toate instanțele
- Inserați înainte de o linie corespunzătoare cu ajutorul parametrului insertbefore
- Inserați după linia corespunzătoare cu ajutorul parametrului insertafter
- Validați că modificările sunt corecte înainte de a salva
Exemplu 1: Validarea dacă o linie este prezentă în fișier fără nicio modificare
Aceasta este doar pentru a valida dacă o linie este prezentă sau nu în fișier. Nu va modifica fișierul indiferent de rezultatul obținut. aceasta este ca și cum ar rula comanda quick find
Exemplul dat mai jos este pentru a afla dacă șirul „LogLevel debug” se găsește sau nu în fișierul httpd.conf al serverului web apache de la distanță.
Așa cum am menționat mai devreme. Nu se va întreprinde nici un fel de acțiune
În acest exemplu vom verifica dacă LogLevel este Debug și vom tipări mesajul Dacă este sau nu acolo și nu vom întreprinde nici o acțiune. Acest lucru se face cu ajutorul checkmode=yes
--- - nume: Examples of lineinfile hosts: web tasks: - nume: "Example1: Validează dacă un String sau o linie este prezentă în fișier" 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
Chiar dacă acest playbook ar raporta că s-a făcut o modificare marcând-o ca changed=1
, dar acest lucru nu ar face nicio modificare în fișier, deoarece am rulat sarcina în modul Check.
Iată comanda rapidă ad-hoc pentru a verifica care este LogLevel-ul real în fișierul httpd.conf de la distanță
$ ansible web -m shell -a "grep -i LogLevel /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >># LogLevel: Controlează numărul de mesaje înregistrate în error_log.LogLevel warn
Se recomandă să aveți întotdeauna parametrul
backup: yes
în playbook-ul dvs. atunci când folosiți lineinfile. Acest lucru ar asigura o copie de rezervă a fișierului înainte de a se face orice modificare. Acest lucru ar fi de ajutor în cazul în care doriți să dați înapoi.
Exemplu2: Validați dacă un șir de caractere sau o linie este prezentă în fișier și adăugați-o dacă nu există
În același playbook, tocmai am văzut că dacă eliminăm modul de verificare, ar fi un playbook valid care caută o linie și o adaugă atunci când nu se găsește nicio potrivire
Dar există o problemă aici, linia pe care o menționați a fi adăugată ar fi adăugată doar la End Of File sau la ultima linie. Acest lucru poate fi controlat cu directivele insert_before și insert_before care vor fi discutate mai târziu în acest articol.
Acum playbook-ul
--- - nume: Examples of lineinfile hosts: web tasks: - nume: "Example2: Add the line if it does not exist" become: yes become_user: root tags: example2 lineinfile: path: /etc/httpd/conf/httpd.conf line: "LogLevel debug" state: present backup: yes register: example2out
Rezultatul acestui lucru ar duce la un fișier de configurare invalid, deoarece intrarea ar fi adăugată la End Of File.
$ ansible web -m shell -a "grep -in LogLevel /etc/httpd/conf/httpd.conf" mwiweb02 | CHANGED | rc=0 >>185:# LogLevel: Controlați numărul de mesaje înregistrate în error_log.189:LogLevel warn354:LogLevel debug
Care poate fi controlat cu Insert after și insert before pe care le vom vedea mai târziu în această postare.
Exemplu3: Înlocuirea unei linii într-un fișier cu ansible lineinfile.
În exemplul2 am văzut cum să adăugăm o nouă linie cu modulul lineinfile. Acum vom vedea cum să înlocuim o linie atunci când se găsește o anumită linie.
Deși puteți folosi modulul ansible replace pentru a înlocui. Modulul Lineinfile poate fi, de asemenea, utilizat pentru a înlocui o linie.
Acum, în acest exemplu, vom schimba LogLevel debug
în LogLevel Debug
cu D majusculă
Vom utiliza Ansible Lineinfile cu Regular Expressions
pentru a căuta o linie, iar elementul line va conține argumentul line
care va conține linia de înlocuit cu
Consultați următorul Playbook și veți putea înțelege cu ușurință.
--- - nume: Examples of lineinfile hosts: web tasks: - nume: "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 # Șirul de căutat regexp: "LogLevel warn" # Șirul de înlocuit linie: "LogLevel debug" state: present backup: yes register: example1out
Rezultatul fișierului ar fi ceva de genul acesta
$ ansible web -m shell -a "grep -in LogLevel /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>185:# LogLevel: Controlează numărul de mesaje înregistrate în error_log.189:LogLevel debug
Va înlocui toate liniile care corespund? Ce se întâmplă dacă există mai multe potriviri
Dacă există mai multe potriviri în fișier. Ansible Lineinfile ar înlocui doar ultima linie cu care se potrivește sau care a fost găsită.
Dacă doriți să înlocuiți toate aparițiile, trebuie să aveți în vedere utilizarea modulului replace și nu a lui lineinfile.
Exemplu 4: Eliminarea unei linii din fișier, dacă este găsită ( Toate instanțele )
Acum vreau să elimin linia LogLevel Debug
pe care am adăugat-o mai devreme, deoarece este într-un loc greșit și, de asemenea, avem deja LogLevel warn
prezentă în același fișier.
Iată playbook-ul ansible pentru a elimina Linia din fișier și putem folosi câteva expresii regulate aici pentru a găsi atât debug
, cât și Debug
--- - nume: Examples of lineinfile hosts: web tasks: - nume: "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
Aici setează parametrul de stare ca absent, care va fi eliminat dacă căutarea are succes. parametrul line
nu este utilizat deoarece nu este necesar
După cum am menționat mai devreme, acest lucru ar elimina toate liniile care se potrivesc din fișier, cu alte cuvinte, tot aspectul unei linii de căutare.
Exemplu5: Insert After a matching line using insertafter parameter
Din moment ce am luat Apache httpd.conf ca fișier de bază în această postare, haideți să luăm o cerință pe care obișnuiam să o facem des în Apache, și anume adăugarea unui nou ascultător
În primul rând haideți să vedem ce există deja în fișier
$ ansible web -m shell -a "grep -in Listen /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>34:# Listen: Vă permite să legați Apache la anumite adrese IP și/sau38:# Schimbați acest lucru în Listen pe anumite adrese IP așa cum se arată mai jos la 41:#Listen 12.34.56.78:8042:Listen 80
acolo 42 este numărul liniei și puteți vedea că avem doar o singură instrucțiune/directivă Listen deocamdată. Acum, pentru a face ca Apache să asculte la 443, trebuie să adăugăm Listen 443
chiar sub Listen 80
Să vedem cum să inserăm după o linie folosind parametrul insertafter.
Iată playbook-ul.
--- - name: Examples of lineinfile hosts: web tasks: - name: "Example1: Validați dacă un String sau o linie este prezentă în fișier" become: yes become_user: root tags: lineinfileexample lineinfile: path: /etc/httpd/conf/httpd.conf insertafter: "^Listen +" linie: "Listen 443" firstmatch: yes state: present register: lineinfileexample
Aici puteți observa că nu există un parametru REGEX. Acesta nu este necesar deoarece parametrul insertafter poate avea el însuși șirul de căutare cu sintaxa expresiei regulate
$ ansible web -m shell -a "grep -in Listen /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>34:# Listen: Vă permite să legați Apache la anumite adrese IP și/sau38:# Schimbați acest lucru în Listen on specific IP addresses așa cum se arată mai jos la 41:#Listen 12.34.56.78:8042:Listen 8043:Listen 443
Dacă observați numerele de linie din Output, puteți vedea că Listen 443
a fost adăugat chiar sub Listen 80
Când sunt mai multe intrări ale liniei de căutare este prezentă în fișier. Ultima linie care corespunde va fi luată în considerare.
Exemplu6: Insert Before a matching line using insertbefore parameter
Pentru a testa parametrul insert before, să luăm același httpd.conf ca fișier de bază și de data aceasta vom actualiza ServerAdmin
ID-ul de e-mail ServerAdmin
de la valoarea implicită ServerAdmin
la Server Admin
Înainte de orice modificare
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: Adresa ta, unde ar trebui să fie problemele cu serverul87:ServerAdmin root@localhost
Dar trebuie să dezactivăm/comentăm linia ServerAdmin existentă și să adăugăm o nouă intrare, Iată playbook-ul pentru a face aceste două sarcini.
--- - nume: Exemple de lineinfile hosts: web tasks: - nume: - nume: "Example6: Comment the Exisiting ServerAdmin Line" become: yes become_user: root tags: lineinfileexample6_1 lineinfile: path: /etc/httpd/conf/httpd.conf regexp: "(^ServerAdmin .*)" linie: "# \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
Rezultatul așteptat ar fi ceva de genul următor.
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: Adresa dumneavoastră, unde ar trebui să fie problemele cu serverul87:ServerAdmin [email protected]:# ServerAdmin root@localhost
Puteți vedea că numărul de linie 88 a fost comentat, care era vechiul ServerAdmin și numărul de linie 87 este noul nostru ServerAdmin
Exemplu 7: Validarea modificărilor înainte de a salva/commite
Aceasta este o caracteristică frumoasă a Ansible lineinfile care vă va permite să rulați o comandă shell pentru a valida dacă fișierul modificat este într-adevăr OK sau dacă există probleme. Având în vedere că fișierul nostru de bază este un fișier de configurare httpd.conf
, acesta are o anumită sintaxă și, dacă nu reușim să o respectăm, vom lăsa în joc întregul site web/infra.
Așa că haideți să îl validăm înainte de a salva fișierul.
Serverul Apache HTTPD are o comandă pentru a efectua verificarea sintaxei pe fișierul httpd.conf care este httpd -t
Când este invocată și fără probleme de sintaxă. Aceasta ar tipări mesajul Syntax OK așa cum este dat mai jos și ar returna un Zero Return Code, ceea ce este tot ceea ce contează pentru Ansible. Ansible se bazează pe Codul de returnare al comenzii de validare.
$ httpd -t Syntax OK
Dacă este NON-ZERO, modificările nu vor fi acceptate și sarcina va eșua.
Iată playbook-ul pentru a actualiza directiva ServerName a Apache.
--- - name: Exemple de 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 -f %s"
Aici %s
este copia de lucru a fișierului real. Ansible ar copia întotdeauna fișierul și l-ar păstra ca o copie de lucru și ar face modificările și, în cele din urmă, l-ar copia în locația Destinat și ar înlocui fișierul original.
Comandă rapidă ad-hoc pentru validare
$ ansible web -m shell -a "grep -in ServerName /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>92:# ServerName oferă numele și portul pe care serverul le folosește pentru a se identifica.98:# #ServerName www.example.com:8099:ServerName www.middlewareinventory.com:80
Vezi că a fost adăugată directiva ServerName.
Am ajuns la sfârșitul articolului.
Sperăm că vă ajută
Ratează acest articol
Salut
Sarav AK
Să ne urmăriți pe Facebook sau TwitterPentru mai multe videoclipuri și tutoriale practice. Abonează-te la canalul nostruGăsește-mă pe Linkedin Profilul meuPentru orice consultație sau pentru a ne angaja Dacă ți-a plăcut acest articol. Arată-ți sprijinul tău! Cumpărați-mi o cafea.
Înscrieți-vă pentru conținut exclusiv „doar pentru abonați”
.