Modul Ansible lineinfile lze použít k vložení řádku, úpravě existujícího řádku, odstranění existujícího řádku nebo k nahrazení řádku.
Vložení řádku
Nejprve si ukážeme, jak zapsat řádek do souboru, pokud není přítomen.
Pomocí parametru path(>Ansible 2.3)/dest můžeme nastavit cestu k souboru, který chceme upravit. A řádek, který se má vložit, nastavíme pomocí parametru line.
Následující příklad zapíše řádek ‚Vložení řádku do souboru‘ do souboru ‚remote_server.txt‘. Nový řádek bude přidán do EOF. Pokud řádek již existuje, nebude přidán.
Nový řádek bude přidán do EOF. Pokud řádek již existuje, pak nebude přidán.
Nastavili jsme také parametr create, který říká, že pokud soubor není přítomen, pak vytvořte nový soubor. Výchozí hodnota pro stav je přítomný. Ale pro přehlednost ji stejně přidávám.
Výchozí hodnota pro stav je přítomna. Ale stejně ji pro přehlednost přidávám.
- 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
Problém1:
Pokud se zobrazí následující chyba,
lineinfile nepodporovaný parametr pro modul: cesta
Je to pravděpodobně způsobeno problémem s parametrem cesta. Do verze ansible 2.3 byl tento parametr ‚dest‘. Pokud je tedy vaše verze ansible nižší než 2.3, změňte parametr na ‚dest‘. To by mělo problém vyřešit.
Problém 2:
Pokud cílový soubor neexistuje, pak Ansible vyhodí chybu, jak je uvedeno níže. Buď se můžete ujistit, že soubor existuje ve vzdáleném souboru, nebo můžete nastavit parametr ‚create‘ na hodnotu ano, čímž tento problém vyřešíte.
Cíl /home/mdtutorials2/hello.txt neexistuje
Vkládání nového řádku za/před vzor
Nechceme vždy vkládat řádek do EOF. Modul lineinfile dává možnost vložit řádek za vzor nebo před vzor. K tomu můžeme použít parametry insertafter, resp. insertbefore.
V níže uvedeném příkladu chci vložit řádek před řádek “ v souboru ansible.cfg. Znaky “ jsem escapoval, protože se jedná o speciální regexové znaky.
- name: Ansible lineinfile insert after example lineinfile: dest: /etc/ansible/ansible.cfg line: 'inventory = /home/fedora/inventory.ini' insertafter: '\'
Pokud potřebujete vložit řádek před vzor, můžete použít parametr insertbefore. Následující příklad vloží řádek před vzor ‚#library‘ v ansible.cfg.
- name: Ansible lineinfile insertbefore example lineinfile: dest: /etc/ansible/ansible.cfg line: 'inventory = /home/mdtutorials/inventory.ini' insertbefore: '#library'
Odstranění řádku
Můžete nastavit parametr state na absent, abyste odstranili zadané řádky. Budou odstraněny všechny výskyty daného řádku.
- hosts: loc tasks: - name: Ansible lineinfile remove line example lineinfile: dest: /home/mdtutorials2/remote_server.txt line: Removed lines. state: absent
Odstranění řádku pomocí regexpu Ansible
K odstranění řádku můžete také zadat regexp. Můžete tedy říci, že odstraníte všechny řádky, které začínají slovem ‚ahoj‘ atd.
Pomocí parametru regexp lineinfile zadáme regulární výraz. Následující příklad odstraní všechny řádky začínající slovem DevOps.
- hosts: loc tasks: - name: Ansible lineinfile regexp example lineinfile: dest: /home/mdtutorials2/remote_server.txt regexp: '^DevOps' state: absent
Záměna/úprava řádku pomocí regexu
Pro úpravu řádku musíme spolu s parametrem regexp použít parametr Ansible backrefs. Ten by měl být použit se state=present.
Pokud regexp neodpovídá žádnému řádku, soubor se nezmění. Pokud regexp odpovídá řádku/více řádkům, pak bude nahrazen poslední odpovídající řádek. Také seskupené prvky v regexpu jsou vyplněny a lze je použít k úpravě.
V níže uvedeném příkladu komentujeme řádek. Celý řádek je zachycen tak, že je umístíme do závorky na ‚\1‘. ‚#\1‘ nahradí řádek s ‚#‘ následovaný tím, co bylo zachyceno.
Můžete mít více zachycení a vyvolat je pomocí ‚\1‘, ‚\2‘, ‚\3‘ atd. Pokud se potřebujete dozvědět více informací o seskupování, podívejte se na stránky regular-expression.info.
Komentování řádku pomocí zpětných odkazů Ansible lineinfile
- name: Ansible lineinfile regexp replace example lineinfile: dest: /etc/ansible/ansible.cfg regexp: '(inventory = /home/fedora/inventory.ini.*)' line: '#' backrefs: yes
Odkomentování řádku pomocí regexpů lineinfile
- name: Ansible lineinfile backrefs example lineinfile: dest: /etc/ansible/ansible.cfg regexp: '#(inventory = /home/fedora/inventory.ini.*)' line: '' backrefs: yes
S malými úpravami můžeme stejný řádek odkomentovat. Zde umísťuji zakomentovaný řádek s ‚#‘ mimo seskupení. Takže nyní je v \1 zachycena pouze část za ‚#‘. A po spuštění skriptu je vidět, že řádek je odkomentován.
Víceřádkový souborLineinfile
Tato část slouží k nahrazení více úloh lineinfile jedinou úlohou a s_položkami. Pokud je vaším záměrem přidat do souboru více řádků, měli byste použít modul blockinfile.
Můžete použít with_items pro procházení seznamu hashů. Pro každou úlohu v seznamu můžete zadat dest, řádek, regexp atd. V podstatě jej můžete použít místo zápisu více úloh.
Následující příklad změní dva soubory: ansible.cfg a 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'}
.