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

  • 0

Ansible lineinfile-moduuli voi olla työpäiviesi pelastaja silloin, kun haluat työskennellä tiedostojen parissa ja erityisesti muokata niiden sisältöä käynnissä, kuten uuden rivin lisääminen tiedostoon tai tiedoston rivin päivittäminen tai tiedoston rivin korvaaminen, kun tietty teksti löytyy ja paljon muuta.

lineinfile sisältää erilaisia esimerkkejä ja se tarjoaa monia parametreja, joiden avulla saat työsi tehtyä helposti. Tässä postauksessa näemme ansiblen lineinfile-moduulin toiminnassa esimerkkien avulla.

ansible lineinfile examples

Sisällysluettelo

Ansiblen lineinfile-moduuli

Ansiblen lineinfile-moduuli on hyödyllinen silloin, kun halutaan lisätä, poistaa tai muuttaa yksittäistä riviä tiedostossa. Voit myös käyttää ehtoja vastaamaan riviä ennen muuttamista tai poistamista säännöllisten lausekkeiden avulla. Voit käyttää sovitettua riviä uudelleen ja muokata sitä käyttämällä back reference -parametria.

Harkitse, että sinulla on jokin seuraavista vaatimuksista

  1. Tahdot lisätä rivin, kun sitä ei vielä ole.
  2. Tahdot muuttaa porttinumeroa asetustiedostossa
  3. Tahdot poistaa SSL:n käytöstä, kun SSL on käytössä
  4. Tahdot lisätä uuden merkinnän /etc/hosts-tiedostoon
  5. Tahdot haluat päivittää paketin version, kun asennettu versio vastaa säännöllistä lauseketta
  6. Tahdot poistaa käyttäjänimen /etc/passwd-tiedostosta regexin avulla

Toivottavasti tämä asettaa kontekstin. Ennen kuin jatkamme esimerkkien kanssa Jotain korostettavaa.

Ansible Lineinfilea voidaan käyttää vain tiedoston yhden rivin työstämiseen. Jos haluat korvata useita rivejä, kokeile replace-moduulia tai käytä blockinfile-moduulia, jos haluat lisätä/päivittää/poistaa rivilohkon tiedostossa.

Jos haluat tutustua tarkemmin Ansible Replace-moduuliin, voit tutustua tähän viestiin.

Ansible replace line in file – Ansible Replace Examples

Ansible lineinfile examples

Olemme koonneet tähän erilaisia esimerkkejä ansible lineinfilestä. Näitä esimerkkejä olemme käsitelleet tässä postauksessa. voit halutessasi lukea kaikki tai jonkin tietyn esimerkin.

  • Validoi, jos rivi on olemassa ilman muutoksia
  • Validoi, jos rivi on olemassa tiedostossa ja lisää, jos sitä ei ole
  • Korvaa rivi tiedostossa, jos se löytyy ansible lineinfile:llä
  • Poista rivi tiedostosta. tiedostosta, jos se löytyy – Kaikki instanssit
  • Sisällytä ennen vastaavaa riviä käyttämällä insertbefore-parametria
  • Sisällytä vastaavan rivin jälkeen käyttämällä insertafter-parametria
  • Varmista, että muutokset ovat oikeita ennen tallentamista

Esimerkki 1: Validoi, onko rivi olemassa tiedostossa ilman muutoksia

Tässä validoidaan vain, onko rivi olemassa tiedostossa vai ei. Se ei muuta tiedostoa riippumatta siitä, mikä on tulos. tämä on aivan kuten quick find-komennon suorittaminen

Alhaalla annetussa esimerkissä selvitetään, löytyykö merkkijono ”LogLevel debug” etäyhteydellä olevan apache-verkkopalvelimen httpd.conf-tiedostosta.

Kuten aiemmin mainittiin. Mitään toimenpiteitä ei tehtäisi

Tässä esimerkissä tarkistetaan, onko LogLevel on Debug ja tulostetaan viesti Jos se on olemassa vai ei, eikä ryhdytä toimenpiteisiin. Tämä tehdään checkmode=yes

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

Tämä pelikirja tosin raportoisi, että muutos on tehty merkitsemällä sen changed=1:ksi, mutta tämä ei tekisi mitään muutoksia tiedostoon, koska ajoimme tehtävän Check-tilassa.

Tässä on nopea ad-hoc-komento, jolla voidaan tarkistaa, mikä on todellinen LogLevel etäkäytössä olevassa httpd.conf-tiedostossa

$ ansible web -m shell -a "grep -i LogLevel /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | MUUTETTU | rc=0 >>># LogLevel: Ohjaa error_logiin kirjattavien viestien määrää. logLevel warn

On suositeltavaa, että playbookissa on aina parametri backup: yes, kun käytät lineinfileä. Näin varmistettaisiin, että tiedosto varmuuskopioidaan ennen muutosten tekemistä. Tämä auttaisi siinä tapauksessa, jos haluat tehdä palautuksen.

Esimerkki2: Tarkista, onko merkkijono tai rivi olemassa tiedostossa ja lisää, jos sitä ei ole

Samaisessa playbookissa olemme juuri nähneet, että jos poistamme tarkistustilan, se olisi kelvollinen playbook, joka etsii rivin ja lisää sen, jos vastaavaa ei löydy

Mutta tässä on ongelma, että mainitsemasi rivi, joka halutaan lisätä, lisättäisiin vain End Of File tai Last line. Tätä voidaan kontrolloida insert_before- ja insert_before-direktiiveillä, joita käsitellään myöhemmin tässä artikkelissa.

Nyt playbook

--- - name: Esimerkkejä lineinfilestä hosts: web tasks: - name: "Esimerkki2: Lisää rivi jos sitä ei ole olemassa" become: yes become_user: root tags: example2 lineinfile: path: /etc/httpd/conf/httpd.conf line: "LogLevel debug" state: present backup: yes register: example2out

Tuloksena olisi virheellinen konfiguraatiotiedosto, koska merkintä lisättäisiin tiedoston loppuun.

$ ansible web -m shell -a "grep -in LogLevel /etc/httpd/conf/httpd.conf" mwiweb02 | CHANGED | rc=0 >>>185:# LogLevel: Ohjaa virhe_logiin kirjattavien viestien määrää.189:LogLevel warn354:LogLevel debug

Jota voidaan ohjata Insert after ja insert before -toiminnoilla, joihin palataan myöhemmin tässä postauksessa.

Esimerkki3: Esimerkissä2 näimme, miten lineinfile-moduulilla lisätään uusi rivi tiedostoon.

Esimerkissä2 näimme, miten lineinfile-moduulilla lisätään uusi rivi. Nyt katsomme, miten korvataan rivi, kun löytyy tietty rivi.

Vaikka voit käyttää ansiblen replace-moduulia korvaamiseen. Lineinfile-moduulia voidaan käyttää myös rivin korvaamiseen.

Nyt tässä esimerkissä vaihdamme LogLevel debug:n LogLevel Debug:ksi isolla D:llä

Käytämme Ansiblen Lineinfile-moduulia Regular Expressions:llä rivin etsimiseen ja rivielementti sisältäisi line-argumentin sisältäisi rivin, jolla korvattaisiin

Katsokaa seuraavaa Playbookia, niin ymmärrätte sen helposti.

--- - nimi: Esimerkkejä lineinfile isännät: web tehtävät: - nimi: "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 # Etsittävä merkkijono regexp: "LogLevel warn" # Korvattava merkkijono line: "LogLevel debug" state: present backup: yes register: example1out

Tiedoston tulos olisi jotakuinkin tällainen

$ ansible web -m shell -a "grep -in LogLevel /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>>185:# LogLevel: Ohjaa error_logiin kirjattavien viestien määrää. 189:LogLevel debug

Korvaako se kaikki vastaavat rivit? Entä jos osumia on useampi kuin yksi

Jos tiedostossa on useampi kuin yksi osuma. Ansible Lineinfile korvaisi vain viimeisen täsmäävän tai löydetyn rivin.

Jos haluat korvata kaikki esiintymät, sinun on harkittava replace-moduulin eikä lineinfilen käyttöä.

Esimerkki 4: Poista rivi tiedostosta, jos se löytyy ( Kaikki esiintymät )

Nyt haluan poistaa rivin LogLevel Debug, jonka olemme lisänneet aiemmin, koska se on väärässä paikassa ja lisäksi meillä on jo LogLevel warn läsnä samassa tiedostossa.

Tässä on ansible-toimintakirja rivin poistamiseksi tiedostosta ja voimme käyttää joitakin säännöllisiä lausekkeita tässä löytääksemme sekä debug että Debug

--- - nimi: Esimerkkejä rivitiedostosta hosts: web tasks: - nimi: "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" # Tilaksi asetetaan Absent poistaaksemme, jos etsittävä rivi löytyy state: absent backup: yes register: example1out

Tässä asetamme tilaparametriksi absent, joka poistaa, jos haku on Success. lineparametria ei käytetä, koska se ei ole välttämätön

Kuten aiemmin mainittiin, tämä poistaisi kaikki vastaavat rivit tiedostosta, toisin sanoen kaikki hakurivin ulkonäkö.

Esimerkki5: Lisää täsmäävän rivin jälkeen käyttämällä insertafter-parametria

Koska olemme ottaneet Apache httpd.conf-tiedoston perustiedostoksi tässä postauksessa, Otetaanpa jokin vaatimus, jota meillä on ollut tapana tehdä usein Apachessa, eli uuden kuuntelijan lisääminen

Katsotaan ensin, mitä tiedostossa jo on

$ ansible web -m shell -a "grep -in Listen /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | MUUTETTU | rc=0 >>34:# Listen: Mahdollistaa Apachen sitomisen tiettyihin IP-osoitteisiin ja/tai38:# Muuta tämä Kuuntele tietyissä IP-osoitteissa kuten alla näkyy 41:#Kuuntele 12.34.56.78:8042:Kuuntele 80

täällä 42 on rivinumero ja näet, että meillä on vain yksi Listen-lauseke/suuntaviiva toistaiseksi. Nyt saadaksemme Apachen kuuntelemaan 443:aa meidän on lisättävä Listen 443 aivan Listen 80
Alkaen Listen 80
Katsotaanpa, miten jonkin rivin jälkeen lisätään insertafter-parametrin avulla.

Tässä on leikkikirja.

--- - nimi: Esimerkkejä linjatiedostosta isännät: web-tehtävät: - nimi: "Esimerkki1: 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

Tässä voi huomata, että REGEX-parametria ei ole. Sitä ei tarvita, koska insertafter-parametrissa itsessään voi olla hakujono Regular Expression -syntaksilla

$ ansible web -m shell -a "grep -in Listen /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>34:# Listen: Mahdollistaa Apachen sitomisen tiettyihin IP-osoitteisiin ja/tai38:# Muuta tämä kuuntelemaan tiettyjä IP-osoitteita alla esitetyllä tavalla 41:#Kuuntele 12.34.56.78:8042:Kuuntele 8043:Kuuntele 443

Jos huomaat rivinumerot ulostulossa, huomaat, että Listen 443 on lisätty suoraan Listen 80

Tiedostossa on useampia merkintöjä etsimällä rivi on läsnä. Viimeinen täsmäävä rivi otettaisiin huomioon.

Esimerkki6: Lisää ennen täsmäävää riviä insertbefore-parametrin avulla

Testataksemme insert before-parametrin, Otetaan sama httpd.conf-tiedosto pohjatiedostoksi ja tällä kertaa päivitämme ServerAdmin Sähköpostitunnuksen oletusarvosta ServerAdmin muotoon Server Admin

Before before any modification

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: Osoitteesi, johon ongelmat palvelimen kanssa pitäisi olla87:ServerAdmin root@localhost

Mutta meidän on poistettava käytöstä/kommentoitava olemassa oleva ServerAdmin-rivi ja lisättävä uusi merkintä, Tässä on pelikirja näiden molempien tehtävien tekemiseen.

--- - nimi: Esimerkkejä lineinfilestä hosts: web tasks: - nimi: "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: # ServerAdmin .*' rivi: '# ServerAdmin .*' rivi: '# ServerAdmin .*' rivi: "ServerAdmin " state: present register: lineinfileexample6_2

Odotettu tulos olisi seuraavanlainen.

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: Osoitteesi, jossa ongelmat palvelimen kanssa pitäisi olla87:ServerAdmin [email protected]:# ServerAdmin root@localhost

Voit nähdä, että rivi numero 88 on kommentoitu, joka oli vanhempi ServerAdmin ja rivi numero 87 on meidän uusi ServerAdmin

Esimerkki 7: Validoi muutokset ennen tallentamista/kommitointia

Tämä on Ansiblen kiva piirre lineinfile, jonka avulla voit ajaa komentotulkkikomennon, jolla voit tarkistaa, onko muutettu tiedosto oikeasti kunnossa, vai onko siinä ongelmia. Koska perustiedostomme on konfiguraatiotiedosto httpd.conf siinä on jonkin verran syntaksia ja jos emme noudata sitä, jätämme koko verkkosivuston/infran vaakalaudalle.

Varmennetaan siis se ennen tiedoston tallentamista.

Apache HTTPD-palvelimella on komento, jolla voidaan suorittaa httpd.conf-tiedoston syntaksitarkistus, joka on httpd -t

Kunnes se on kutsuttu esiin ja jossa ei ole syntaksiongelmia. Se tulostaisi alla olevan kaltaisen viestin Syntax OK ja palauttaisi nollapalautuskoodin, mikä on ainoa asia, jolla on merkitystä Ansibelle. Ansible luottaa validointikomennon palautuskoodiin.

$ httpd -t Syntax OK

Jos se on NON-ZERO, muutoksia ei vahvisteta ja tehtävä epäonnistuu.

Tässä on pelikirja Apachen ServerName-direktiivin päivittämiseen.

--- - name: Esimerkkejä 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 # Komento konfiguraation tarkistamiseksi ja %s on työkopio tiedostosta validate: "httpd -t -f %s"

Tässä %s on työkopio varsinaisesta tiedostosta. Ansible kopioisi tiedoston aina ja säilyttäisi sen työkopiona ja tekisi muutokset ja lopuksi kopioisi sen Destined-sijaintiin ja korvaisi alkuperäisen tiedoston.

Nopea Ad Hoc -komento validointiin

$ ansible web -m shell -a "grep -in ServerName /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>92:# ServerName antaa nimen ja portin, jota palvelin käyttää tunnistautuakseen.98:#ServerName www.example.com:8099:ServerName www.middlewareinventory.com:80 

Voit nähdä, että ServerName-direktiivi on lisätty.

Olemme tulleet artikkelin loppuun.

Toivottavasti siitä on apua

Arvioi tätä artikkelia

Hyvinvointikahvit
Sarav AK

Osta minulle kahvi ko-fissa.com

Seuraa meitä Facebookissa tai TwitterissäLisäksi käytännön videoita ja opetusohjelmia. Tilaa kanavammeLöydä minut Linkedinissä ProfiiliniMikä tahansa konsultointi tai palkata meidät Jos pidät tästä artikkelista. Näytä tukesi! Osta minulle kahvia.

Tilaa eksklusiivista ”vain tilaajille” tarkoitettua sisältöä