Ansible lineinfile examples – Add, Modify, Delete, Replace lines
- 0
Modul Ansible lineinfile by vám mohl zachránit den, pokud chcete pracovat se soubory a zejména upravovat jejich obsah za běhu, jako je přidání nového řádku do souboru nebo aktualizace řádku v souboru nebo nahrazení řádku v souboru při nalezení určitého textu a mnoho dalšího.
lineinfile má různou sadu příkladů a poskytuje mnoho parametrů, které vám usnadní práci. V tomto příspěvku si na příkladech ukážeme modul ansible lineinfile v akci.
Obsah
- Modul ansible lineinfile
- Příklady modulu ansible lineinfile
- Příklad 1: Ověřte, zda je řádek v souboru přítomen bez jakýchkoli změn
- Příklad2: Ověřit, zda je v souboru přítomen řetězec nebo řádek, a přidat jej, pokud neexistuje
- Příklad3:
- Chce to nahradit všechny odpovídající řádky? Co když je v souboru více než jedna shoda
- Příklad 4: Odstranění řádku ze souboru, pokud je nalezen ( Všechny výskyty )
- Příklad5: Vložení za odpovídající řádek pomocí parametru insertafter
- Příklad6: Vložení před odpovídající řádek pomocí parametru insertbefore
- Příklad 7: Ověření změn před uložením/odesláním
Modul ansible lineinfile
Modul ansible lineinfile je užitečný, když chcete přidat, odebrat nebo změnit jeden řádek v souboru. Můžete také použít podmínky pro porovnání řádku před úpravou nebo odstraněním pomocí regulárních výrazů. Shodný řádek můžete znovu použít a upravit pomocí parametru zpětného odkazu.
Považte, že máte některý z následujících požadavků
- Chcete přidat řádek, pokud ještě není přítomen.
- Chcete změnit číslo portu v konfiguračním souboru
- Chcete zakázat protokol SSL, když je povolen
- Chcete přidat nový záznam do souboru /etc/hosts
- Chcete přidat nový záznam do souboru /etc/hosts
- Chcete zakázat protokol SSL, když je povolen. chcete aktualizovat verzi balíčku, když nainstalovaná verze odpovídá vašemu regulárnímu výrazu
- Chcete odstranit uživatelské jméno ze souboru /etc/passwd pomocí regexu
Snad to nastaví kontext. Než budeme pokračovat v příkladech Něco je třeba zdůraznit.
Ansible Lineinfile lze použít pouze pro práci s jedním řádkem v souboru. Pokud chcete nahradit více řádků, zkuste modul replace nebo použijte modul blockinfile, pokud chcete vložit/aktualizovat/odstranit blok řádků v souboru.
Pokud chcete prozkoumat více o modulu Ansible Replace, můžete se podívat na tento příspěvek.
Ansible replace line in file – Ansible Replace Examples
Příklady modulu ansible lineinfile
Shromáždili jsme zde různé příklady modulu ansible lineinfile. Těmito příklady jsme se zabývali v tomto příspěvku. můžete si vybrat, zda si chcete přečíst všechny nebo některý konkrétní příklad.
- Ověřit, zda je řádek přítomen bez jakékoli úpravy
- Ověřit, zda je řádek v souboru přítomen, a přidat, pokud neexistuje
- Nahradit řádek v souboru, pokud je nalezen pomocí ansible lineinfile
- Odstranit řádek ze souboru. souboru, pokud je nalezen – Všechny instance
- Vložit před odpovídající řádek pomocí parametru insertbefore
- Vložit za odpovídající řádek pomocí parametru insertafter
- Ověřit správnost změn před uložením
Příklad 1: Ověřte, zda je řádek v souboru přítomen bez jakýchkoli změn
Toto je pouze ověření, zda je řádek v souboru přítomen či nikoli. Soubor se nijak nemodifikuje bez ohledu na to, jaký je výsledek. je to jen jako spuštění rychlého příkazu find
Níže uvedený příklad slouží ke zjištění, zda se v souboru httpd.conf vzdáleného webového serveru apache nachází řetězec „LogLevel debug“.
Jak již bylo uvedeno. Nebyla by provedena žádná akce
V tomto příkladu budeme kontrolovat, zda je LogLevel Debug, a vypíšeme zprávu Pokud tam je nebo není, a neprovedeme žádnou akci. To se provádí pomocí checkmode=yes
--- - název: Examples of lineinfile hosts: web tasks: - název: "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 řádek: "LogLevel debug" stav: present backup: yes check_mode: yes register: example1out
Tento playbook by sice ohlásil, že byla provedena změna tím, že by ji označil jako changed=1
, ale neprovedl by žádnou změnu v souboru, protože jsme úlohu spustili v režimu Check.
Tady je rychlý ad-hoc příkaz pro kontrolu, jaká je aktuální LogLevel ve vzdáleném souboru httpd.conf
$ ansible web -m shell -a "grep -i LogLevel /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >># LogLevel: LogLevel warn
Při použití souboru lineinfile se doporučuje mít v playbooku vždy parametr
backup: yes
. Tím byste se ujistili, že je soubor zálohován před provedením jakýchkoli změn. Pomohlo by to v případě, že byste chtěli vrátit soubor zpět.
Příklad2: Ověřit, zda je v souboru přítomen řetězec nebo řádek, a přidat jej, pokud neexistuje
V tomtéž playbooku, který jsme právě viděli, pokud odstraníme kontrolní režim, by byl platný playbook, který vyhledá řádek a přidá jej, pokud není nalezena žádná shoda
Ale je zde problém, řádek, o kterém se zmiňujete, že má být přidán, by byl přidán pouze na konec souboru nebo na poslední řádek. To lze řídit pomocí direktiv insert_before a insert_before, o kterých bude řeč později v tomto článku.
Nyní playbook
--- - název: Examples of lineinfile hosts: web tasks: - název: "Example2: Add the line if it does not exist" become: yes become_user: root tags: example2 lineinfile: path: /etc/httpd/conf/httpd.conf řádek: "$ ansible web -m shell -a "grep -in LogLevel /etc/httpd/conf/httpd.conf" mwiweb02 | CHANGED | rc=0 >>185:# LogLevel: 189:LogLevel warn354:LogLevel debugKterý lze ovládat pomocí Insert after a Insert before, které si ukážeme později v tomto příspěvku.
Příklad3:
V příkladu2 jsme viděli, jak přidat nový řádek pomocí modulu lineinfile. Nyní se podíváme, jak nahradit řádek při nalezení určitého řádku.
Pro nahrazení můžete použít modul ansible replace. K nahrazení řádku lze použít také modul Lineinfile.
Nyní v tomto příkladu změníme
LogLevel debug
naLogLevel Debug
s velkým DPro vyhledání řádku použijeme modul Ansible Lineinfile s
Regular Expressions
a prvek line by obsahoval argumentline
by obsahoval řádek, který se má nahraditPodívejte se na následující Playbook a snadno to pochopíte.
--- - název: Examples of lineinfile hosts: web tasks: - název: "Example1: Validate if a String or line is present in the file" become: yes become_user: root tags: example1 lineinfile: path: # Řetězec, který se má hledat regexp: "LogLevel warn" # Řetězec, který se má nahradit line: "LogLevel debug" stav: přítomno zálohování: ano registr: example1outVýsledek souboru by vypadal nějak takto
$ ansible web -m shell -a "grep -in LogLevel /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>185:# LogLevel: Řídí počet zpráv zaznamenávaných do error_log.189:LogLevel debugChce to nahradit všechny odpovídající řádky? Co když je v souboru více než jedna shoda
Pokud je v souboru více než jedna shoda. Ansible Lineinfile by nahradil pouze poslední shodný nebo nalezený řádek.
Pokud chcete nahradit všechny výskyty, musíte zvážit použití modulu replace a ne lineinfile.
Příklad 4: Odstranění řádku ze souboru, pokud je nalezen ( Všechny výskyty )
Nyní chci odstranit řádek
LogLevel Debug
, který jsme přidali dříve, protože je na špatném místě a také již máme ve stejném souboru přítomný řádekLogLevel warn
.Tady je ansible playbook pro odstranění řádku ze souboru a můžeme zde použít některé regulární výrazy, abychom našli jak
debug
, takDebug
--- - název: Examples of lineinfile hosts: web tasks: - název: "Example1: Validate if a String or line is present in the file" become: yes become_user: root tags: example1 lineinfile: path: # String to Search regexp: "LogLevel ebug" # State is set to Absent to remove if the Searching Line is found state: absent backup: yes register: example1outZde nastavujeme parametr state jako absent, který se odstraní, pokud je hledání úspěšné. parametr
line
se nepoužívá, protože není nutnýJak již bylo zmíněno, odstranily by se tím všechny odpovídající řádky ze souboru, jinými slovy veškerý výskyt Hledaného řádku.
Příklad5: Vložení za odpovídající řádek pomocí parametru insertafter
Protože jsme vzali Apache httpd.conf soubor jako náš základní soubor v tomto příspěvku, vezměme si nějaký požadavek, který jsme v Apache často dělali, což je přidání nového posluchače
Nejprve se podívejme, co už v souboru je
$ ansible web -m shell -a "grep -in Listen /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>34:# Listen: Umožňuje vázat Apache na konkrétní IP adresy a/nebo38:# Změňte to na Listen na konkrétních IP adresách, jak je uvedeno níže na 41:#Listen 12.34.56.78:8042:Listen 80zde 42 je číslo řádku a můžete vidět, že máme zatím pouze jeden příkaz/příkaz Listen. Nyní, aby Apache naslouchal na 443, musíme přidat
Listen 443
přímo podListen 80
Podívejme se, jak vložit za nějaký řádek pomocí parametru insertafter.Tady je playbook.
--- - název: Příklady řádkuinfile hosts: web tasks: - název: "Example1: Ověřte, zda je v souboru přítomen řetězec nebo řádek" become: yes become_user: root tags: lineinfileexample lineinfile: path: /etc/httpd/conf/httpd.conf insertafter: "^Listen +" řádek: "Zde si můžete všimnout, že zde není žádný parametr REGEX. Není potřeba, protože samotný parametr insertafter může mít vyhledávací řetězec se syntaxí regulárního výrazu$ ansible web -m shell -a "grep -in Listen /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>34:# Listen: Umožňuje vázat Apache na konkrétní IP adresy a/nebo38:# Změňte toto na Listen on specific IP addresses, jak je uvedeno níže na 41:#Listen 12.34.56.78:8042:Listen 8043:Listen 443Pokud si všimnete čísel řádků ve výstupu, můžete vidět, že
Listen 443
byl přidán hned podListen 80
Pokud je v souboru přítomno více záznamů vyhledávacího řádku. V úvahu by se bral poslední odpovídající řádek.
Příklad6: Vložení před odpovídající řádek pomocí parametru insertbefore
Pro otestování parametru insert before vezměme stejný httpd.conf jako základní soubor a tentokrát budeme aktualizovat
ServerAdmin
ID e-mailu z výchozíhoServerAdmin
naServer Admin
Před úpravou
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: Vaše adresa, kde by měly být problémy se serverem87:ServerAdmin root@localhostAle potřebujeme zakázat/komentovat existující řádek ServerAdmin a přidat nový záznam, Zde je playbook pro provedení obou těchto úkolů.
--- - název: Examples of lineinfile hosts: web úkoly: - název: "Example6: Comment the Exisiting ServerAdmin Line" become: yes become_user: root tagy: lineinfileexample6_1 lineinfile: path: /Název: "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 .*' řádek: Očekávaný výsledek by vypadal takto: "ServerAdmin " stav: přítomný registr: lineinfileexample6_2Očekávaný výsledek by vypadal takto.
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: Vaše adresa, kde by měly být problémy se serverem87:ServerAdmin [email protected]:# ServerAdmin root@localhostVidíte, že řádek číslo 88 byl zakomentován, což byl starší ServerAdmin, a řádek číslo 87 je náš nový ServerAdmin
Příklad 7: Ověření změn před uložením/odesláním
Jedná se o pěknou funkci Ansible lineinfile, která vám umožní spustit příkaz shellu pro ověření, zda je upravený soubor opravdu v pořádku, nebo zda jsou nějaké problémy. Protože náš základní soubor je konfigurační soubor
httpd.conf
, má určitou syntaxi, a pokud ji nedodržíme, necháme v sázce celý web/infra.Před uložením souboru jej tedy ověříme.
Server HTTPD od Apache má příkaz pro provedení kontroly syntaxe souboru httpd.conf, který je
httpd -t
Při vyvolání a bez problémů se syntaxí. Vypíše zprávu Syntax OK, jak je uvedeno níže, a vrátí nulový návratový kód, což je vše, na čem Ansible záleží. Ansible se spoléhá na návratový kód příkazu Validation.
$ httpd -t Syntax OKPokud by byl NULOVÝ, změny by nebyly odevzdány a úloha by selhala.
Tady je playbook pro aktualizaci směrnice ServerName Apache.
--- - název: Examples of lineinfile hosts: web tasks: - název: "Example7: Update the ServerName" become: yes become_user: root lineinfile: path: /etc/httpd/conf/httpd.conf insertafter: '#ServerName www.example.com:80' řádek: "ServerName www.middlewareinventory.com:80" state: present # Příkaz pro ověření konfigurace a %s je pracovní kopie souboru validate: "httpd -t -f %s"Zde
%s
je pracovní kopie aktuálního souboru. Ansible by vždy zkopíroval soubor a ponechal ho jako pracovní kopii a provedl změny a nakonec ho překopíroval do určeného umístění a nahradil původní soubor.Rychlý ad hoc příkaz pro ověření
$ ansible web -m shell -a "grep -in ServerName /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>92:# ServerName udává jméno a port, které server používá ke své identifikaci. 98:#ServerName www.example.com:8099:ServerName www.middlewareinventory.com:80Vidíte, že byla přidána direktiva ServerName.
Dospěli jsme ke konci článku.
Doufám, že vám to pomohlo
Ohodnoťte tento článek
Zdraví
Sarav AKSledujte nás na Facebooku nebo TwitteruPro více praktických videí a návodů. Přihlaste se k odběru našeho kanáluNajdete mě na Linkedin Můj profilPro jakoukoli konzultaci nebo pronajmutí Pokud se vám tento článek líbí. Vyjádřete mu svou podporu! Kupte mi kávu.
Přihlaste se k odběru exkluzivního obsahu "pouze pro předplatitele"
.