My Daily Tutorials

Az Ansible lineinfile modul használható egy sor beszúrására, egy meglévő sor módosítására, egy meglévő sor eltávolítására vagy egy sor cseréjére.

Sor beillesztése

Először megnézzük, hogyan írhatunk egy sort egy fájlba, ha az nincs benne.

A módosítandó fájl elérési útvonalát a path(>Ansible 2.3)/dest paraméterrel tudjuk megadni. A beillesztendő sort pedig a line paraméterrel állítjuk be.

A következő példában a ‘sor beillesztése egy fájlba’ sort írjuk a ‘remote_server.txt’ fájlba. Az új sor az EOF után kerül beillesztésre. Ha a sor már létezik, akkor nem kerül hozzáadásra.

Az új sor az EOF-ba kerül. Ha a sor már létezik, akkor nem lesz hozzáadva.

A create paramétert is beállítottuk, ami azt mondja, hogy ha a fájl nincs meg, akkor hozzon létre egy új fájlt. Az állapot alapértelmezett értéke a jelen van. De az egyértelműség kedvéért mégis hozzáadom.

Az állapot alapértelmezett értéke megvan. But I am adding it anyway for clararity.

- 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:

If you get the following error,

lineinfile unsupported parameter for module: path

Ez valószínűleg a path paraméterrel kapcsolatos probléma miatt van. Az ansible 2.3-ig ez a paraméter a ‘dest’ volt. Tehát ha az ansible verziója 2.3-nál kisebb, akkor változtassa meg a paramétert ‘dest’-re. Ez megoldja a problémát.

Feladat 2:

Ha a célfájl nem létezik, akkor az Ansible az alábbi hibát dobja ki. Vagy meggyőződhet róla, hogy a fájl létezik a távoli fájlban, vagy a ‘create’ paramétert yes-re állíthatja, hogy megoldja ezt a problémát.

A /home/mdtutorials2/hello.txt célállomás nem létezik

Új sor beszúrása egy minta után/előtt

Nem akarjuk mindig az EOF-ig beszúrni a sort. A lineinfile modul lehetőséget ad arra, hogy a sort egy minta után vagy egy minta előtt illesszük be. Ehhez használhatjuk az insertafter, illetve insertbefore paramétereket.

Az alábbi példában az ansible.cfg fájlban a ” sor elé akarom beszúrni a sort. A ”-t kikerültem, mivel ezek speciális regex karakterek.

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

Ha egy minta elé kell beszúrni egy sort, akkor az insertbefore paramétert használhatjuk. A következő példa a ‘#library’ minta előtti sort illeszti be az ansible.cfg-be.

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

Sor eltávolítása

A state paramétert absent-re állíthatja, hogy a megadott sorokat eltávolítsa. Az adott sor minden előfordulása eltávolításra kerül.

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

Sor eltávolítása az Ansible regexp használatával

Egy sor eltávolításához megadhat egy regexp-t is. Így mondhatjuk, hogy távolítsuk el az összes olyan sort, amely a ‘hello’ szóval kezdődik stb.

A lineinfile regexp paraméterrel adjuk meg a reguláris kifejezést. A következő példa a DevOps szóval kezdődő összes sort eltávolítja.

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

Sor cseréje/módosítása Regex használatával

A sor módosításához az Ansible backrefs paramétert kell használnunk a regexp paraméterrel együtt. Ezt a state=present paraméterrel kell használni.

Ha a regexp nem egyezik egyetlen sorral sem, akkor a fájl nem módosul. Ha a regexp egy sorra/több sorra illeszkedik, akkor az utolsó illeszkedő sor kerül kicserélésre. A regexp-ben lévő csoportosított elemek is feltöltődnek, és felhasználhatók a módosításhoz.

Az alábbi példában egy sort kommentálunk. A teljes sort a ‘\1’ zárójelen belüli elhelyezésével rögzítjük. A ‘#\1’ helyettesíti a sort a ‘#’-vel, amit a rögzített sor követ.

Többszörös rögzítés is lehet, és ezeket a ‘\1’, ‘\2’, ‘\3’ stb. használatával hívhatjuk meg. Ha további információkat szeretne megtudni a csoportosításról, olvassa el a regular-expression.info-t.

Sor megjegyzése az Ansible lineinfile backrefs

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

Sor megjegyzésének feloldása lineinfile regexp

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

Egy kis módosítással ugyanezt a sort feloldhatjuk. Itt a kommentált sort a ‘#’-vel a csoportosításon kívülre helyezem. Így most már csak a ‘#’ utáni rész kerül rögzítésre a \1-ben. És a szkript futtatása után láthatjuk, hogy a sor ki van kommentálva.

Lineinfile több sor

Ez a szakasz arra szolgál, hogy több lineinfile feladatot egyetlen feladattal és with_items-szel helyettesítsünk. Ha az a szándékod, hogy több sort adj hozzá egy fájlhoz, akkor a blockinfile modult kell használnod.

A with_items segítségével végighaladhatsz egy hash-listán. A lista minden egyes feladatához megadhatja a dest, a sort, a regexp-t stb. Alapvetően több task írása helyett használhatja.

A következő példa két fájlt fog megváltoztatni: ansible.cfg és 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'}

Szólj hozzá!