My Daily Tutorials

Módulo Ansible lineinfile pode ser usado para inserir uma linha, modificar uma linha existente, remover uma linha existente ou para substituir uma linha.

Inserindo uma linha

Primeiro, veremos como escrever uma linha em um arquivo, se não estiver presente.

Podemos definir o caminho do arquivo a ser modificado usando o parâmetro path(>Ansible 2.3)/dest. E iremos definir a linha a ser inserida usando o parâmetro de linha.

O exemplo seguinte irá escrever a linha ‘Inserindo uma linha num ficheiro’ para o ficheiro ‘remote_server.txt’. A nova linha será adicionada ao EOF. Se a linha já existir, então ela não será adicionada.

A nova linha será adicionada ao EOF. Se a linha já existe, então ela não será adicionada.

Também definimos o parâmetro criar, que diz se o arquivo não está presente, então crie um novo arquivo. O valor padrão para o estado está presente. Mas eu estou adicionando-o de qualquer forma para maior clareza.

O valor padrão para o estado está presente. Mas estou adicionando-o de qualquer forma por clarity.

- 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:

Se você obtiver o seguinte erro,

lineinfile unsupported parameter for module: path

É provavelmente devido ao problema com o parâmetro path. Até 2.3 este parâmetro era ‘dest’. Portanto, se a sua versão possível for inferior a 2.3, então mude o parâmetro para ‘dest’. Ele deve resolver o problema.

Issue 2:

Se o arquivo de destino não existir, então o Ansible lançaria um erro como abaixo. Você pode ter certeza que o arquivo existe no arquivo remoto ou pode definir o parâmetro ‘criar’ para sim para resolver este problema.

Destination /home/mdtutorials2/hello.txt não existe

Inserir uma nova linha depois/antes de um padrão

Nem sempre queremos que a linha seja inserida no EOF. O módulo lineinfile dá a opção de inserir a linha depois de um padrão ou antes de um padrão. Podemos usar os parâmetros inserttafter e insertbefore respectivamente para isto.

No exemplo abaixo, eu quero inserir a linha antes da linha ” no arquivo ansible.cfg. Eu escapei do ” já que eles são caracteres regex especiais.

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

Se você precisar inserir uma linha antes de um padrão, você pode usar o parâmetro insertbefore. O exemplo seguinte irá inserir a linha antes do padrão ‘#library’ em ansible.cfg.

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

Removendo uma linha

Pode definir o parâmetro de estado como ausente, para remover as linhas especificadas. Todas as ocorrências dessa linha serão removidas.cfg.

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

Remover uma linha usando Ansible regexp

Você também pode especificar uma regexp para remover uma linha. Então você pode dizer remover todas as linhas que começam com a palavra ‘olá’ etc.

Damos a expressão regular usando o parâmetro lineinfile regexp. O exemplo seguinte irá remover todas as linhas que começam com DevOps.

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

Substituir/ Modificar uma linha usando Regex

Para modificar uma linha precisamos usar o parâmetro Ansible backrefs junto com o parâmetro regexp. Isto deve ser usado com state=present.

Se a regexp não corresponder a nenhuma linha, então o ficheiro não é alterado. Se a regexp corresponder a uma linha/multiplas linhas, então a última linha correspondente será substituída. Além disso, os elementos agrupados na regexp são preenchidos e podem ser usados para modificação.

No exemplo abaixo, estamos comentando uma linha. A linha completa é capturada colocando-as dentro do parêntese para ‘\1’. O ‘#\1’ substitui a linha por ‘#’ seguido pelo que foi capturado.

Você pode ter múltiplas capturas e chamá-las usando ‘\1’, ‘\2’, ‘\3’ etc. Se você precisa aprender mais informações sobre agrupamento, consulte regular-expression.info.

Comentando uma linha com Ansible lineinfile backrefs

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

Descomentando a linha com lineinfile regexp

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

Nós podemos descomentar a mesma linha com pequenas modificações. Aqui eu estou colocando a linha comentada com o ‘#’ fora do agrupamento. Então agora apenas a parte após o ‘#’ é capturada no \1. E depois de executar o script, você pode ver que a linha está descomentada.

Lineinfile multiple lines

Esta seção é para substituir múltiplas tarefas de lineinfile por uma única tarefa e com_items. Se sua intenção é adicionar múltiplas linhas a um arquivo, você deve usar o módulo blockinfile.

Você pode usar com_items para fazer um loop através de uma lista de hashes. Você pode especificar o dest, line, regexp, etc. para cada tarefa da lista. Basicamente, você pode usá-lo ao invés de escrever múltiplas tarefas.

O seguinte exemplo mudará dois arquivos: ansible.cfg e 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'}

Deixe um comentário