Ansible lineinfile-modulet kan bruges til at indsætte en linje, ændre en eksisterende linje, fjerne en eksisterende linje eller til at erstatte en linje.
Insættelse af en linje
Først vil vi se, hvordan man skriver en linje til en fil, hvis den ikke er til stede.
Vi kan angive stien til den fil, der skal ændres, ved hjælp af parameteren path(>Ansible 2.3)/dest. Og vi indstiller den linje, der skal indsættes, ved hjælp af line-parameteren.
Det følgende eksempel vil skrive linjen “Indsætter en linje i en fil” til filen “remote_server.txt”. Den nye linje vil blive tilføjet til EOF. Hvis linjen allerede findes, vil den ikke blive tilføjet.
Den nye linje vil blive tilføjet til EOF. Hvis linjen allerede findes, vil den ikke blive tilføjet.
Vi har også indstillet parameteren create, som siger, at hvis filen ikke er til stede, skal du oprette en ny fil. Standardværdien for tilstanden er present. Men jeg tilføjer den alligevel for klarhedens skyld.
Den standardværdi for tilstanden er til stede. Men jeg tilføjer den alligevel for klarhedens skyld.
- 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
Sag1:
Hvis du får følgende fejl,
lineinfile unsupported parameter for module: path
Det skyldes sandsynligvis et problem med path-parameteren. Indtil ansible 2.3 var denne parameter ‘dest’. Så hvis din ansible-version er mindre end 2.3, skal du ændre parameteren til ‘dest’. Det skulle løse problemet.
Sag 2:
Hvis destinationsfilen ikke findes, så ville Ansible kaste en fejl som nedenfor. Du kan enten sikre dig, at filen findes i fjernfilen, eller du kan indstille parameteren ‘create’ til yes for at løse dette problem.
Destination /home/mdtutorials2/hello.txt findes ikke
Insættelse af en ny linje efter/før et mønster
Vi ønsker ikke altid, at linjen skal indsættes til EOF. Lineinfile-modulet giver mulighed for at indsætte linjen efter et mønster eller før et mønster. Vi kan bruge parametrene insertafter og insertbefore til dette.
I nedenstående eksempel ønsker jeg at indsætte linjen før ”-linjen i ansible.cfg-filen. Jeg har undtaget ”, da de er specielle regex-tegn.
- name: Ansible lineinfile insert after example lineinfile: dest: /etc/ansible/ansible.cfg line: 'inventory = /home/fedora/inventory.ini' insertafter: '\'
Hvis du har brug for at indsætte en linje før et mønster, kan du bruge insertbefore-parameteren. Følgende eksempel indsætter linjen før mønsteret ‘#library’ i ansible.cfg.
- name: Ansible lineinfile insertbefore example lineinfile: dest: /etc/ansible/ansible.cfg line: 'inventory = /home/mdtutorials/inventory.ini' insertbefore: '#library'
Fjernelse af en linje
Du kan indstille state-parameteren til absent, for at fjerne de angivne linjer. Alle forekomster af den pågældende linje vil blive fjernet.
- hosts: loc tasks: - name: Ansible lineinfile remove line example lineinfile: dest: /home/mdtutorials2/remote_server.txt line: Removed lines. state: absent
Fjernelse af en linje ved hjælp af Ansible regexp
Du kan også angive en regexp for at fjerne en linje. Så du kan sige fjerne alle linjer, der starter med ordet ‘hello’ osv.
Vi angiver det regulære udtryk ved hjælp af lineinfile regexp-parameteren. Følgende eksempel vil fjerne alle linjer, der starter med DevOps.
- hosts: loc tasks: - name: Ansible lineinfile regexp example lineinfile: dest: /home/mdtutorials2/remote_server.txt regexp: '^DevOps' state: absent
Forsøgning/ændring af en linje ved hjælp af regex
For at ændre en linje skal vi bruge Ansible backrefs-parameteren sammen med regexp-parameteren. Dette skal bruges med state=present.
Hvis regexp’en ikke matcher nogen linje, ændres filen ikke. Hvis regexp’et matcher en linje/flere linjer, vil den sidst matchede linje blive erstattet. Desuden er de grupperede elementer i regexp udfyldt og kan bruges til ændring.
I nedenstående eksempel kommenterer vi en linje. Den fulde linje er fanget linje ved at placere dem inden for parentesen til “\1”. ‘#\1’ erstatter linjen med ‘#’ efterfulgt af det, der blev opfanget.
Du kan have flere opfangninger og kalde dem ved at bruge ‘\1’, ‘\2’, ‘\3’ osv. Hvis du har brug for flere oplysninger om gruppering, henvises til regular-expression.info.
Kommenterer en linje 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
Ukommenterer linjen 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 afkommentere den samme linje med små ændringer. Her placerer jeg den kommenterede linje med ‘#’ uden for grupperingen. Så nu er det kun den del efter ‘#’, der bliver fanget i \1. Og efter at scriptet er kørt, kan du se, at linjen er udkommenteret.
Lineinfile flere linjer
Dette afsnit er til erstatning af flere lineinfile-opgaver med en enkelt opgave og with_items. Hvis din hensigt er at tilføje flere linjer til en fil, bør du bruge blockinfile-modulet.
Du kan bruge with_items til at løbe gennem en liste af hashes. Du kan angive dest, linje, regexp osv. for hver opgave i listen. Dybest set kan du bruge det i stedet for at skrive flere opgaver.
Det følgende eksempel vil ændre to filer: ansible.cfg og 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'}