Ansible lineinfile példák – Vonalak hozzáadása, módosítása, törlése, cseréje
- 0
Az Ansible lineinfile modul lehet a nap megmentője, ha fájlokkal szeretnénk dolgozni, és különösen a tartalmukat menet közben módosítani, például egy új sor hozzáadása a fájlban, vagy egy sor frissítése a fájlban, vagy egy sor cseréje a fájlban, ha bizonyos szöveget talál, és még sok más.
lineinfile számos példával rendelkezik, és számos paramétert biztosít, hogy könnyedén elvégezhesse a feladatát. Ebben a bejegyzésben az ansible lineinfile modult fogjuk látni működés közben példákon keresztül.
Tartalomjegyzék
- Az Ansible lineinfile modul
- Ansible lineinfile példák
- 1. példa:
- Példa2: Ellenőrzi, hogy egy karakterlánc vagy sor jelen van-e a fájlban, és hozzáadja, ha nem létezik
- Példa3:
- Kicserélné az összes egyező sort? Mi van, ha egynél több találat van
- 4. példa: Egy sor eltávolítása a fájlból, ha megtalálható ( Minden példány )
- 5. példa: Beillesztés a megfelelő sor után az insertafter paraméter használatával
- Példa6: Beillesztés egy illeszkedő sor előtt az insertbefore paraméter használatával
- 7. példa: Validálja a módosításokat mentés/átvitel előtt
Az Ansible lineinfile modul
Az ansible lineinfile modul akkor hasznos, ha egy fájlban egyetlen sort szeretnénk hozzáadni, eltávolítani, módosítani. A módosítás vagy eltávolítás előtt a reguláris kifejezések segítségével feltételeket is használhat a sorra való megfeleltetéshez. Az illesztett sort a back reference paraméter segítségével újra felhasználhatja és módosíthatja.
Tegyük fel, hogy az alábbi követelmények bármelyikével rendelkezik
- Egy sort szeretne hozzáadni, ha az még nincs benne.
- A port számát szeretné megváltoztatni a konfigurációs fájlban
- Az SSL-t szeretné letiltani, ha az SSL engedélyezve van
- Új bejegyzést szeretne hozzáadni az /etc/hosts fájlhoz
- Az /etc/hosts fájlban
- Új bejegyzést szeretne hozzáadni. frissíteni akarod a csomag verzióját, ha a telepített verzió megfelel a reguláris kifejezésednek
- Eltávolítani akarsz egy felhasználónevet az /etc/passwd fájlból a regex segítségével
Hope ez beállítja a kontextust. Mielőtt folytatnánk a példákkal Valamit ki kell emelni.
Az Ansible Lineinfile csak egy fájl egyetlen sorának megmunkálására használható. Ha több sort akarsz cserélni, próbáld ki a replace modult, vagy használd a blockinfile-t, ha egy sorblokkot akarsz beszúrni/frissíteni/eltávolítani egy fájlban.
Ha többet szeretnél megtudni az Ansible Replace modulról, akkor nézd meg ezt a bejegyzést.
Ansible replace line in file – Ansible Replace példák
Ansible lineinfile példák
Az ansible lineinfile különböző példáit gyűjtöttük össze itt. Ezeket a példákat ebben a bejegyzésben tárgyaltuk. választhatsz, hogy az összeset vagy bármelyik konkrét példát elolvasod.
- Hitelesíti, hogy egy sor jelen van-e módosítás nélkül
- Hitelesíti, hogy egy sor jelen van-e a fájlban, és hozzáadja, ha nem létezik
- Replace a Line in a file If it is found with ansible lineinfile
- Remove a line from a file fájlból, ha megtalálták – Az összes példány
- Előtte a megfelelő sort az insertbefore paraméterrel
- Előtte a megfelelő sor után az insertafter paraméterrel
- Mentés előtt ellenőrizze a változások helyességét
1. példa:
Ez csak annak ellenőrzésére szolgál, hogy egy sor jelen van-e a fájlban módosítás nélkül
Ez csak annak ellenőrzésére szolgál, hogy egy sor jelen van-e a fájlban vagy sem. Nem módosítja a fájlt, függetlenül attól, hogy milyen eredményt kapunk. ez olyan, mintha a quick find parancsot futtatnánk
Az alábbi példa azt vizsgálja, hogy a “LogLevel debug” karakterlánc megtalálható-e a távoli apache webszerver httpd.conf fájljában.
Mint korábban említettük. Semmilyen lépést nem fogunk tenni
Ebben a példában azt fogjuk ellenőrizni, hogy a LogLevel Debug-e, és kiírjuk az üzenetet, hogy megvan-e vagy sem, és nem teszünk semmilyen lépést. Ezt a checkmode=yes
--- - name: Példák sorinfile 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 sor: /etc/httpd/conf/httpd.conf sor: /etc/httpd/conf/httpd.conf line: "LogLevel debug" state: present backup: yes check_mode: yes register: example1out
Ez a playbook ugyan jelentené, hogy történt egy változás a changed=1
jelöléssel, de ez nem végezne semmilyen módosítást a fájlon, mivel a feladatot Check módban futtattuk.
Itt a gyors ad-hoc parancs annak ellenőrzésére, hogy mi az aktuális LogLevel a távoli httpd.conf fájlban
$ ansible web -m shell -a "grep -i LogLevel /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >># LogLevel: Az error_logba naplózott üzenetek számának szabályozása. logLevel warn
A lineinfile használata esetén ajánlott, hogy a playbookban mindig szerepeljen a
backup: yes
paraméter. Ez biztosítaná, hogy a fájlról biztonsági mentés készüljön, mielőtt bármilyen változtatásra kerülne sor. Ez segítene abban az esetben, ha vissza akarod tekerni.
Példa2: Ellenőrzi, hogy egy karakterlánc vagy sor jelen van-e a fájlban, és hozzáadja, ha nem létezik
Az imént látott playbookban, ha eltávolítjuk az ellenőrzési módot, akkor ez egy érvényes playbook lenne, amely keres egy sort, és hozzáadja, ha nem talál egyezést
De van egy probléma itt a sor, amit említesz, hogy hozzá kell adni, csak a fájl végén vagy az utolsó sorban lenne hozzáadva. Ezt az insert_before és insert_before direktívákkal lehet szabályozni, amelyekről a cikk későbbi részében lesz szó.
Most a playbook
--- - name: Examples of lineinfile hosts: web tasks: - name: "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
Az eredmény egy érvénytelen konfigurációs fájl lenne, mivel a bejegyzés a fájl végére kerülne.
$ ansible web -m shell -a "grep -in LogLevel /etc/httpd/conf/httpd.conf" mwiweb02 | CHANGED | rc=0 >>185:# LogLevel: Az error_logba naplózott üzenetek számának szabályozása.189:LogLevel warn354:LogLevel debug
Az Insert after és insert before segítségével szabályozható, amire később ebben a bejegyzésben még kitérünk.
Példa3:
A példa2-ben láttuk, hogyan lehet egy új sort hozzáadni a lineinfile modullal. Most azt fogjuk megnézni, hogyan cserélhetünk ki egy sort, ha egy Bizonyos sort találunk.
A cseréhez használhatjuk az ansible replace modult. A lineinfile modul is használható egy sor cseréjére.
Most ebben a példában a LogLevel debug
-et LogLevel Debug
-re fogjuk cserélni nagy D-vel
Az Ansible Lineinfile-t fogjuk használni a Regular Expressions
-val egy sor keresésére, és a line elem tartalmazná a line
argumentum tartaná a sort, amivel helyettesíteni szeretnénk
Nézze meg a következő Playbookot, és könnyen megértheti.
--- - 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 # A keresendő karakterlánc regexp: "LogLevel warn" # A cserélendő karakterlánc line: "LogLevel debug" state: present backup: yes register: example1out
A fájl eredménye valami ilyesmi lenne
$ ansible web -m shell -a "grep -in LogLevel /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>185:# LogLevel: Az error_logba naplózott üzenetek számának szabályozása. 189:LogLevel debug
Kicserélné az összes egyező sort? Mi van, ha egynél több találat van
Ha egynél több találat van a fájlban. Az Ansible Lineinfile csak az utolsó egyező vagy talált sort cserélné le.
Ha az összes előfordulást szeretné lecserélni, akkor nem a lineinfile, hanem a replace modul használatát kell megfontolnia.
4. példa: Egy sor eltávolítása a fájlból, ha megtalálható ( Minden példány )
Most szeretném eltávolítani a korábban hozzáadott LogLevel Debug
sort, mivel rossz helyen van, és aLogLevel warn
már jelen van ugyanabban a fájlban.
Itt van az ansible playbook a Line eltávolításához a fájlból, és itt használhatunk néhány reguláris kifejezést, hogy megtaláljuk mind a debug
, mind a Debug
--- - 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 # String to Search regexp: "LogLevel ebug" # Az állapotot Absent-re állítjuk, hogy eltávolítsuk, ha a keresett sort megtaláljuk state: absent backup: yes register: example1out
Itt az állapot paramétert absent-re állítjuk, ami eltávolítja, ha a keresés sikeres. a line
paramétert nem használjuk, mivel nincs rá szükség
Mint korábban említettük, ez eltávolítaná az összes megfelelő sort a fájlból, vagyis a Keresés sorának minden megjelenését.
5. példa: Beillesztés a megfelelő sor után az insertafter paraméter használatával
Mivel az Apache httpd.conf fájlt vettük alapfájlnak ebben a bejegyzésben, vegyünk néhány követelményt, amit gyakran szoktunk csinálni az Apache-ban, ami egy új listener hozzáadása
Először nézzük meg, mi van már a fájlban
$ ansible web -m shell -a "grep -in Listen /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>34:# Listen: Lehetővé teszi, hogy az Apache-t meghatározott IP-címekhez kössük és/vagy38:# Módosítsuk ezt Listen on specific IP-címekre, ahogy alább látható 41:#Listen 12.34.56.78:8042:Listen 80
itt 42 a sorszám és láthatjuk, hogy mostantól csak egy Listen utasításunk/irányelvünk van. Most ahhoz, hogy az Apache Listen a 443-at hallgassa, közvetlenül a Listen 80
alá Listen 443
kell beillesztenünk.Listen 80
Lássuk, hogyan kell beilleszteni néhány sor után az insertafter paraméter segítségével.
Itt van a playbook.
--- - név: Példák sorinfile hosts: web tasks: - név: "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
Itt látható, hogy nincs REGEX paraméter. Erre nincs is szükség, mivel az insertafter paraméter maga is lehet a kereső karakterlánc a Regular Expression Syntax
$ ansible web -m shell -a "grep -in Listen /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>34:# Listen: Lehetővé teszi, hogy az Apache-t meghatározott IP-címekhez kösse és/vagy38:# Módosítsa ezt Listen on specific IP-címekre az alábbiakban látható módon 41:#Listen 12.34.56.78:8042:Listen 8043:Listen 443
Ha észreveszi a sorszámokat a kimeneten, láthatja, hogy a Listen 443
közvetlenül a Listen 80
Ahol több bejegyzés van a kereső sor jelen van a fájlban. Az utolsó illeszkedő sort vennénk figyelembe.
Példa6: Beillesztés egy illeszkedő sor előtt az insertbefore paraméter használatával
Az insert before paraméter teszteléséhez vegyük ugyanazt a httpd.conf fájlt alapfájlnak, és ezúttal a ServerAdmin
Email ID-t frissítjük az alapértelmezett ServerAdmin
-ről
Minden módosítás előtt
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: A cím, ahol a szerverrel kapcsolatos problémákat kell87:ServerAdmin root@localhost
De ki kell kapcsolnunk/kommentálnunk a meglévő ServerAdmin sort és hozzá kell adnunk egy új bejegyzést, Itt van a playbook mindkét feladat elvégzéséhez.
--- - név: Példák lineinfile hostok: web feladatok: - név: "Example6: Comment the Exisiting ServerAdmin Line" become: yes become_user: root tags: lineinfileexample6_1 lineinfile: path: /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: /.conf insertbefore: '# ServerAdmin .*' line: "ServerAdmin " state: present register: lineinfileexample6_2
A várt eredmény a következő lenne.
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: Az Ön címe, ahol a szerverrel kapcsolatos problémáknak kell lennie87:ServerAdmin [email protected]:# ServerAdmin root@localhost
Láthatjuk, hogy a 88-as sorszámot kommentáltuk, ami a régebbi ServerAdmin volt, a 87-es sorszám pedig a mi új ServerAdminunk
7. példa: Validálja a módosításokat mentés/átvitel előtt
Ez az Ansible lineinfile egy szép funkciója, amely lehetővé teszi egy shell parancs futtatását annak ellenőrzésére, hogy a módosított fájl valóban rendben van-e vagy vannak-e problémák. Mivel az alapfájlunk egy konfigurációs fájl httpd.conf
van némi szintaxis, és ha ezt nem tartjuk be, akkor az egész weboldalt/infra kockán hagyjuk.
Szóval validáljuk a fájl mentése előtt.
Apache HTTPD szerver rendelkezik egy paranccsal a httpd.conf fájl szintaxis ellenőrzésére, amely httpd -t
Ha meghívjuk és nincsenek szintaxis problémák. A parancs az alábbiakban megadott Syntax OK üzenetet írja ki, és egy nulla visszatérési kódot ad vissza, ami az Ansible számára csak ez számít. Az Ansible az érvényesítési parancs visszatérési kódjára támaszkodik.
$ httpd -t Syntax OK
Ha ez NEM NULLA, akkor a változások nem kerülnek rögzítésre és a feladat sikertelen lesz.
Itt a playbook az Apache ServerName irányelvének frissítésére.
--- - name: Példák 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" sor: "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. Az Ansible mindig lemásolná a fájlt, és megtartaná munkamásolatként, majd elvégezné a módosításokat, végül átmásolná a Meghatározott helyre, és kicserélné az eredeti fájlt.
Gyors Ad Hoc parancs az érvényesítéshez
$ ansible web -m shell -a "grep -in ServerName /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>92:# A ServerName adja meg a szerver azonosítására használt nevet és portot.98:#ServerName www.example.com:8099:ServerName www.middlewareinventory.com:80
Láthatod, hogy a ServerName direktíva hozzá lett adva.
A cikk végére értünk.
Remélem ez segít
Bíráld ezt a cikket
Cheers
Sarav AK
Kövessen minket a Facebookon vagy a Twitteren További praktikus videók és oktatóanyagokért. Iratkozzon fel csatornánkraTaláljon meg a Linkedin profilomonMindenféle konzultációért, vagy ha fel akar bérelni minket Ha tetszett ez a cikk. Mutasd meg a támogatásod! Vegyél nekem egy kávét.
Iratkozz fel az exkluzív “csak előfizetőknek szóló” tartalomra