My Daily Tutorials

Modul Ansible lineinfile poate fi utilizat pentru a introduce o linie, a modifica o linie existentă, a elimina o linie existentă sau a înlocui o linie.

Inserarea unei linii

În primul rând, vom vedea cum să scriem o linie într-un fișier, în cazul în care acesta nu este prezent.

Potem seta calea fișierului care urmează să fie modificat folosind parametrul path(>Ansible 2.3)/dest. Și vom seta linia care urmează să fie inserată folosind parametrul line.

Exemplul următor va scrie linia ‘Inserarea unei linii într-un fișier’ în fișierul ‘remote_server.txt’. Noua linie va fi adăugată la EOF. Dacă linia există deja, atunci nu va fi adăugată.

Noua linie va fi adăugată la EOF. Dacă linia există deja, atunci nu va fi adăugată.

Am setat, de asemenea, parametrul create, care spune că dacă fișierul nu este prezent, atunci creați un fișier nou. Valoarea implicită pentru starea este prezentă. Dar o adaug oricum pentru claritate.

Valoarea implicită pentru stare este prezentă. Dar o adaug oricum pentru claritate.

- 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

Imprejurare1:

Dacă primiți următoarea eroare,

lineinfile unsupported parameter for module: path

Este probabil din cauza problemei cu parametrul path. Până la ansible 2.3 acest parametru era ‘dest’. Deci, dacă versiunea dvs. ansible este mai mică de 2.3, atunci schimbați parametrul în ‘dest’. Aceasta ar trebui să rezolve problema.

Problema 2:

Dacă fișierul de destinație nu există, atunci Ansible va arunca o eroare ca mai jos. Puteți fie să vă asigurați că fișierul există în fișierul de la distanță, fie să setați parametrul ‘create’ la yes pentru a rezolva această problemă.

Destination /home/mdtutorials2/hello.txt does not exist

Inserting a new line after/before a pattern

Nu dorim întotdeauna ca linia să fie inserată până la EOF. Modulul lineinfile oferă opțiunea de a insera linia după un model sau înainte de un model. Pentru aceasta, putem folosi parametrii insertafter și, respectiv, insertbefore.

În exemplul de mai jos, vreau să inserez linia înainte de linia ” în fișierul ansible.cfg. Am scăpat ” deoarece sunt caractere speciale regex.

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

Dacă aveți nevoie să inserați o linie înaintea unui model, puteți utiliza parametrul insertbefore. Următorul exemplu va insera linia înainte de modelul ‘#library’ în ansible.cfg.

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

Îndepărtarea unei linii

Puteți seta parametrul state la absent, pentru a elimina liniile specificate. Toate aparițiile acelei linii vor fi eliminate.

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

Îndepărtarea unei linii folosind Ansible regexp

De asemenea, puteți specifica o regexp pentru a elimina o linie. Astfel, puteți spune să eliminați toate liniile care încep cu cuvântul „hello” etc.

Dăm expresia regulată folosind parametrul regexp lineinfile. Următorul exemplu va elimina toate liniile care încep cu DevOps.

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

Înlocuirea/modificarea unei linii folosind Regex

Pentru a modifica o linie trebuie să folosim parametrul Ansible backrefs împreună cu parametrul regexp. Acesta trebuie utilizat cu state=present.

Dacă regexp nu se potrivește cu nicio linie, atunci fișierul nu este modificat. Dacă regexp-ul se potrivește cu o linie/multe linii, atunci ultima linie care se potrivește va fi înlocuită. De asemenea, elementele grupate în regexp sunt populate și pot fi utilizate pentru modificare.

În exemplul de mai jos comentăm o linie. Linia completă este linia capturată prin plasarea ei în interiorul parantezei la „\1”. ‘#\1’ înlocuiește linia cu ‘#’ urmat de ceea ce a fost capturat.

Puteți avea mai multe capturi și să le apelați folosind ‘\1’, ‘\2’, ‘\3’ etc. Dacă aveți nevoie să aflați mai multe informații despre grupare, consultați regular-expression.info.

Comentarea unei linii cu Ansible lineinfile backrefs

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

Descomentarea liniei cu lineinfile regexp

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

Putem decomenta aceeași linie cu mici modificări. Aici am plasat linia comentată cu „#” în afara grupării. Astfel, acum doar porțiunea de după ‘#’ este capturată în \1. Și după rularea scriptului, puteți vedea că linia este decomentată.

Lineinfile linii multiple

Această secțiune este pentru înlocuirea mai multor sarcini lineinfile cu o singură sarcină și with_items. Dacă intenția dumneavoastră este de a adăuga mai multe linii la un fișier, ar trebui să folosiți modulul blockinfile.

Puteți folosi with_items pentru a parcurge în buclă o listă de hașuri. Puteți specifica dest, linie, regexp etc. pentru fiecare sarcină din listă. Practic, îl puteți folosi în loc să scrieți mai multe sarcini.

Exemplul următor va modifica două fișiere: ansible.cfg și 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'}

Lasă un comentariu