De Ansible lineinfile module kan gebruikt worden om een regel in te voegen, een bestaande regel te wijzigen, een bestaande regel te verwijderen of om een regel te vervangen.
Een regel invoegen
Eerst zullen we zien hoe we een regel naar een bestand kunnen schrijven, als dat niet aanwezig is.
We kunnen het pad van het te wijzigen bestand instellen met de parameter path(>Ansible 2.3)/dest. En we stellen de in te voegen regel in met de parameter line.
Het volgende voorbeeld zal de regel ‘Invoegen van een regel in een bestand’ in het bestand ‘remote_server.txt’ schrijven. De nieuwe regel zal worden toegevoegd aan de EOF. Als de regel al bestaat, dan wordt hij niet toegevoegd.
De nieuwe regel wordt toegevoegd aan de EOF. Als de regel al bestaat, dan wordt hij niet toegevoegd.
We hebben ook de create parameter ingesteld, die zegt dat als het bestand niet aanwezig is, maak dan een nieuw bestand. De standaardwaarde voor de status is aanwezig. Maar ik voeg het toch toe voor de duidelijkheid.
De standaard waarde voor de status is aanwezig. Maar ik voeg het toch toe voor de duidelijkheid.
- 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:
Als u de volgende fout krijgt,
lineinfile unsupported parameter for module: path
Het is waarschijnlijk te wijten aan het probleem met de path parameter. Tot ansible 2.3 was deze parameter ‘dest’. Dus als uw ansible versie lager is dan 2.3, verander de parameter dan in ‘dest’. Dit zou het probleem moeten oplossen.
Issue 2:
Als het doelbestand niet bestaat, dan zou Ansible een foutmelding geven zoals hieronder. U kunt ervoor zorgen dat het bestand bestaat in het bestand op afstand of u kunt de parameter ‘create’ op yes zetten om dit probleem op te lossen.
Bestemming /home/mdtutorials2/hello.txt bestaat niet
Een nieuwe regel invoegen na/voor een patroon
We willen niet altijd dat de regel wordt ingevoegd tot de EOF. De lineinfile module geeft de mogelijkheid om de regel na een patroon of voor een patroon in te voegen. We kunnen hiervoor respectievelijk de parameters insertafter en insertbefore gebruiken.
In het onderstaande voorbeeld wil ik de regel invoegen vóór de ” regel in ansible.cfg bestand. Ik heb de ” ge-escaped omdat het speciale regex tekens zijn.
- name: Ansible lineinfile insert after example lineinfile: dest: /etc/ansible/ansible.cfg line: 'inventory = /home/fedora/inventory.ini' insertafter: '\'
Als u een regel voor een patroon wilt invoegen, kunt u de parameter insertbefore gebruiken. Het volgende voorbeeld voegt de regel in voor het patroon ‘#library’ in ansible.cfg.
- name: Ansible lineinfile insertbefore example lineinfile: dest: /etc/ansible/ansible.cfg line: 'inventory = /home/mdtutorials/inventory.ini' insertbefore: '#library'
Verwijderen van een regel
U kunt de parameter state op absent zetten, om de gespecificeerde regels te verwijderen. Alle occurrences van die regel zullen worden verwijderd.
- hosts: loc tasks: - name: Ansible lineinfile remove line example lineinfile: dest: /home/mdtutorials2/remote_server.txt line: Removed lines. state: absent
Verwijderen van een regel met Ansible regexp
U kunt ook een regexp opgeven om een regel te verwijderen. Zo kunt u zeggen verwijder alle regels die beginnen met het woord ‘hello’ etc.
We geven de reguliere expressie met behulp van lineinfile regexp parameter. Het volgende voorbeeld verwijdert alle regels die beginnen met DevOps.
- hosts: loc tasks: - name: Ansible lineinfile regexp example lineinfile: dest: /home/mdtutorials2/remote_server.txt regexp: '^DevOps' state: absent
Vervangen/wijzigen van een regel met Regex
Om een regel te wijzigen moeten we de Ansible backrefs parameter gebruiken samen met de regexp parameter. Dit moet worden gebruikt met state=present.
Als de regexp met geen enkele regel overeenkomt, dan wordt het bestand niet gewijzigd. Als de regexp overeenkomt met een regel/meerdere regels, dan wordt de laatst overeenkomende regel vervangen. Ook worden de gegroepeerde elementen in de regexp gevuld en kunnen worden gebruikt voor wijziging.
In het onderstaande voorbeeld geven we commentaar op een regel. De volledige regel wordt vastgelegd door ze binnen de haakjes te plaatsen op ‘#1’. De ‘#\1’ vervangt de regel door ‘#’ gevolgd door wat werd opgevangen.
U kunt meerdere opnames hebben en deze oproepen door ‘#\1’, ‘#\2’, ‘#\3’ enz. te gebruiken. Als u meer informatie wilt over groeperen, raadpleeg dan regular-expression.info.
Een regel becommentariëren met Ansible lineinfile backrefs
- name: Ansible lineinfile regexp replace example lineinfile: dest: /etc/ansible/ansible.cfg regexp: '(inventory = /home/fedora/inventory.ini.*)' line: '#' backrefs: yes
De regel uncommenten met lineinfile regexp
- name: Ansible lineinfile backrefs example lineinfile: dest: /etc/ansible/ansible.cfg regexp: '#(inventory = /home/fedora/inventory.ini.*)' line: '' backrefs: yes
We kunnen dezelfde regel uncommenten met kleine aanpassingen. Hier plaats ik de becommentarieerde regel met de ‘#’ buiten de groepering. Dus nu wordt alleen het gedeelte na ‘#’ opgevangen in #. En na het uitvoeren van het script, kunt u zien dat de regel ongecommentarieerd is.
Lineinfile meerdere regels
Dit gedeelte is voor het vervangen van meerdere lineinfile taken door een enkele taak en with_items. Als het de bedoeling is om meerdere regels aan een bestand toe te voegen, moet u de module blockinfile gebruiken.
U kunt with_items gebruiken om een lijst met hashes te doorlopen. U kunt de dest, regel, regexp enz. voor elke taak in de lijst opgeven. In principe kun je het gebruiken in plaats van meerdere taken te schrijven.
Het volgende voorbeeld zal twee bestanden veranderen: ansible.cfg en 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'}