My Daily Tutorials

Ansiblen lineinfile-moduulia voidaan käyttää rivin lisäämiseen, olemassa olevan rivin muuttamiseen, olemassa olevan rivin poistamiseen tai rivin korvaamiseen.

Rivin lisääminen

Katsotaan ensin, miten kirjoitetaan rivi tiedostoon, jos sitä ei ole olemassa.

Voidaan asettaa muutettavan tiedoston polku parametrilla path(>Ansible 2.3)/dest. Ja asetamme lisättävän rivin line-parametrin avulla.

Seuraavassa esimerkissä kirjoitetaan tiedostoon ’remote_server.txt’ rivi ’Inserting a line in a file’. Uusi rivi lisätään EOF:n jälkeen. Jos rivi on jo olemassa, sitä ei lisätä.

Uusi rivi lisätään EOF:iin. Jos rivi on jo olemassa, sitä ei lisätä.

Olemme myös asettaneet create-parametrin, joka sanoo, että jos tiedostoa ei ole, luo uusi tiedosto. Oletusarvo tilalle on present. Mutta lisään sen kuitenkin selkeyden vuoksi.

Tilan oletusarvo on olemassa. Mutta lisään sen kuitenkin selkeyden vuoksi.

- hosts: loc tasks: - name: Ansible insert lineinfile example lineinfile: dest: /home/mdtutorials2/remote_server.txt line: Inserting a line in a file. state: present create: yes

Issue1:

Jos saat seuraavan virheen,

lineinfile unsupported parameter for module: path

Se johtuu luultavasti path-parametrin ongelmasta. Ansible 2.3:een asti tämä parametri oli ’dest’. Jos siis ansible-versiosi on pienempi kuin 2.3, vaihda parametri muotoon ’dest’. Sen pitäisi ratkaista ongelma.

Kysymys 2:

Jos kohdetiedostoa ei ole olemassa, Ansible heittää alla olevan kaltaisen virheen. Voit joko varmistaa, että tiedosto on olemassa etätiedostossa tai voit asettaa parametrin ’create’ arvoksi yes ratkaistaksesi tämän ongelman.

Kohde /home/mdtutorials2/hello.txt ei ole olemassa

Uuden rivin lisääminen kuvion jälkeen/ennen

Emmekä aina halua, että rivi lisätään EOF:iin. Lineinfile-moduuli antaa mahdollisuuden lisätä rivin kuvion jälkeen tai ennen kuviota. Voimme käyttää tähän insertafter- ja insertbefore-parametreja vastaavasti.

Alla olevassa esimerkissä haluan lisätä rivin ennen ”-riviä ansible.cfg-tiedostossa. Olen välttänyt ”:n, koska ne ovat erityisiä regex-merkkejä.

- name: Ansible lineinfile insert after example lineinfile: dest: /etc/ansible/ansible.cfg line: 'inventory = /home/fedora/inventory.ini' insertafter: '\'

Jos haluat lisätä rivin ennen mallia, voit käyttää insertbefore-parametria. Seuraava esimerkki lisää rivin ennen kuviota ’#library’ ansible.cfg:ssä.

- name: Ansible lineinfile insertbefore example lineinfile: dest: /etc/ansible/ansible.cfg line: 'inventory = /home/mdtutorials/inventory.ini' insertbefore: '#library'

Rivin poistaminen

Voit asettaa state-parametrin arvoksi absent, jolloin määritetyt rivit poistetaan. Kaikki kyseisen rivin esiintymät poistetaan.

- hosts: loc tasks: - name: Ansible lineinfile remove line example lineinfile: dest: /home/mdtutorials2/remote_server.txt line: Removed lines. state: absent

Rivin poistaminen Ansible regexp:n avulla

Voit myös määrittää regexp:n rivin poistamiseksi. Voit siis sanoa, että poista kaikki rivit, jotka alkavat sanalla ’hello’ jne.

Säännöllisen lausekkeen annamme lineinfile regexp-parametrilla. Seuraava esimerkki poistaa kaikki rivit, jotka alkavat sanalla DevOps.

- hosts: loc tasks: - name: Ansible lineinfile regexp example lineinfile: dest: /home/mdtutorials2/remote_server.txt regexp: '^DevOps' state: absent

Rivin korvaaminen/muuttaminen Regexin avulla

Muuttaaksemme riviä meidän on käytettävä Ansiblen backrefs-parametria yhdessä regexp-parametrin kanssa. Tätä tulee käyttää tilassa state=present.

Jos regexp ei vastaa mitään riviä, tiedostoa ei muuteta. Jos regexp täsmää riviin/moneen riviin, korvataan viimeinen täsmäävä rivi. Myös regexp:n ryhmitellyt elementit täytetään ja niitä voidaan käyttää muokkaamiseen.

Alha olevassa esimerkissä kommentoimme riviä. Koko rivi on kaapattu rivi sijoittamalla ne sulkujen sisään ’\1’. ’#\1’ korvaa rivin ’#’-merkillä, jota seuraa se, mitä kaapattiin.

Voit ottaa useita kaappauksia ja kutsua niitä käyttämällä ’\1’, ’\2’, ’\3’ jne. Jos haluat lisätietoja ryhmittelystä, katso regular-expression.info.

Rivin kommentointi Ansiblen lineinfile backrefs

- name: Ansible lineinfile regexp replace example lineinfile: dest: /etc/ansible/ansible.cfg regexp: '(inventory = /home/fedora/inventory.ini.*)' line: '#' backrefs: yes

Rivin kommentoinnin poistaminen lineinfile regexp

- name: Ansible lineinfile backrefs example lineinfile: dest: /etc/ansible/ansible.cfg regexp: '#(inventory = /home/fedora/inventory.ini.*)' line: '' backrefs: yes

Voidaan poistaa kommentointi samalta riviltä pienillä muutoksilla. Tässä sijoitan kommentoidun rivin, jossa on ’#’, ryhmittelyn ulkopuolelle. Nyt siis vain ’#’-merkin jälkeinen osa otetaan \1:een. Ja skriptin suorittamisen jälkeen näet, että rivi on kommentoimatta.

Lineinfile useita rivejä

Tässä osiossa korvataan useita lineinfile-tehtäviä yhdellä tehtävällä ja with_items. Jos tarkoituksenasi on lisätä useita rivejä tiedostoon, kannattaa käyttää blockinfile-moduulia.

Voit käyttää with_items-toimintoa silmukoiden läpikäymiseen hash-listan läpi. Voit määrittää destin, rivin, regexp:n jne. jokaiselle listan tehtävälle. Periaatteessa voit käyttää sitä sen sijaan, että kirjoittaisit useita tehtäviä.

Oheinen esimerkki muuttaa kahta tiedostoa: ansible.cfg ja remote_server.txt.

- hosts: loc tasks: - name: Ansible lineinfile multiple lines with_items example lineinfile: dest: "{{ item.dest }}" regexp: "{{ item.regexp }}" line: "{{ item.line }}" backrefs: yes with_items: - {dest: '/etc/ansible/ansible.cfg', regexp: 'config file for ansible', line: 'line changed'} - {dest: '/home/dinoopblogger/remote_server.txt', regexp: 'hello', line: 'world'}

Jätä kommentti