My Daily Tutorials

Ansible lineinfile-modulen kan användas för att infoga en rad, ändra en befintlig rad, ta bort en befintlig rad eller ersätta en rad.

Insättning av en rad

Först ska vi se hur man skriver en rad till en fil, om den inte finns där.

Vi kan ställa in sökvägen till den fil som ska ändras med hjälp av parametern path(>Ansible 2.3)/dest. Och vi anger den rad som ska infogas med hjälp av parametern line.

Med följande exempel skrivs raden ”Inserting a line in a file” (infogas en rad i en fil) till filen ”remote_server.txt”. Den nya raden kommer att läggas till i EOF. Om raden redan finns kommer den inte att läggas till.

Den nya raden kommer att läggas till i EOF. Om raden redan finns kommer den inte att läggas till.

Vi har också ställt in parametern create, som säger att om filen inte finns så skapa en ny fil. Standardvärdet för tillståndet är present. Men jag lägger till det ändå för tydlighetens skull.

Standardvärdet för tillståndet finns. Men jag lägger till det ändå för tydlighetens skull.

- 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

Uppgift1:

Om du får följande fel,

lineinfile unsupported parameter for module: path

Det beror troligen på problemet med path-parametern. Fram till ansible 2.3 var denna parameter ”dest”. Så om din ansible-version är mindre än 2.3 ändrar du parametern till ”dest”. Det borde lösa problemet.

Problem 2:

Om destinationsfilen inte existerar, så kommer Ansible att ge ett fel som nedan. Du kan antingen se till att filen finns i fjärrfilen eller så kan du ställa in parametern ”create” till yes för att lösa problemet.

Destination /home/mdtutorials2/hello.txt finns inte

Insättning av en ny rad efter/framför ett mönster

Vi vill inte alltid att raden ska sättas in till EOF. Modulen lineinfile ger möjlighet att infoga raden efter ett mönster eller före ett mönster. Vi kan använda parametrarna insertafter respektive insertbefore för detta.

I nedanstående exempel vill jag infoga raden före raden ” i filen ansible.cfg. Jag har undvikit ” eftersom de är speciella regex-tecken.

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

Om du behöver infoga en rad före ett mönster kan du använda parametern insertbefore. Följande exempel kommer att infoga raden före mönstret ”#library” i ansible.cfg.

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

Föra bort en rad

Du kan ställa in state-parametern till absent, för att ta bort de angivna raderna. Alla förekomster av den linjen tas bort.

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

För att ta bort en rad med Ansible regexp

Du kan också ange ett regexp för att ta bort en rad. Så du kan säga ta bort alla rader som börjar med ordet ”hello” etc.

Vi anger det reguljära uttrycket med hjälp av lineinfile regexp-parametern. Följande exempel tar bort alla rader som börjar med DevOps.

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

Replacing/ Modifying a line using Regex

För att ändra en rad måste vi använda Ansible backrefs-parametern tillsammans med regexp-parametern. Detta bör användas med state=present.

Om regexp inte matchar någon rad ändras inte filen. Om regexp:et matchar en rad/flera rader ersätts den senast matchade raden. Dessutom fylls de grupperade elementen i regexp i och kan användas för ändring.

I exemplet nedan kommenterar vi en rad. Hela raden fångas upp raden genom att placera dem inom parentesen till ”\1”. ”#\1” ersätter raden med ”#” följt av det som fångades.

Du kan ha flera fångster och kalla dem genom att använda ”\1”, ”\2”, ”\3” osv. Om du behöver mer information om gruppering, se regular-expression.info.

Kommenterar en rad med Ansible lineinfile backrefs

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

Unkommenterar raden med lineinfile regexp

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

Vi kan avkommentera samma rad med små ändringar. Här placerar jag den kommenterade raden med ”#” utanför grupperingen. Så nu fångas bara delen efter ”#” i \1. Och efter att ha kört skriptet kan du se att raden är okommenterad.

Lineinfile flera rader

Detta avsnitt är till för att ersätta flera lineinfile-uppgifter med en enda uppgift och with_items. Om din avsikt är att lägga till flera rader i en fil bör du använda modulen blockinfile.

Du kan använda with_items för att slinga dig genom en lista med hash. Du kan ange dest, linje, regexp etc. för varje uppgift i listan. I princip kan du använda det istället för att skriva flera uppgifter.

Följande exempel kommer att ändra två filer: ansible.cfg och 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'}

Lämna en kommentar