Ansible lineinfile examples – Add, Modify, Delete, Replace lines
- 0
Ansible lineinfile module could be the saviour of your day when you want to work with files and especially modify their content on the run, como adicionar uma nova linha no arquivo ou atualizar uma linha no arquivo ou substituir uma linha no arquivo quando determinado texto é encontrado e muito mais.
lineinfile tem um conjunto de vários exemplos e fornece muitos parâmetros para fazer seu trabalho facilmente. Neste post, vamos ver o módulo ansible lineinfile em ação com exemplos.
Table of Contents
- O módulo Ansible lineinfile
- Ansible lineinfile examples
- Exemplo 1: Validar se uma linha está presente no arquivo sem qualquer modificação
- Example2: Valide se uma String ou linha está presente no arquivo e adicione se ela não existir
- Example3: Substitua uma linha em um arquivo por um possível lineinfile.
- Substituiria todas as linhas de correspondência? E se houver mais de uma correspondência
- Exemplo 4: Remova uma linha do arquivo, se ela for encontrada ( All the Instances )
- Exemplo5: Insert After a matching line using inserttafter parameter
- Exemplo6: Inserir Antes de uma linha correspondente usando insert antes do parâmetro
- Example 7: Validar as alterações antes de salvar/comprometer
O módulo Ansible lineinfile
Módulo ansible lineinfile é útil quando você quer adicionar, remover, modificar uma única linha em um arquivo. Você também pode usar condições para combinar a linha antes de modificar ou remover usando as expressões regulares. Você pode reutilizar e modificar a linha correspondente usando o parâmetro de referência de retorno.
Considerar que você mesmo tem algum destes requisitos
- Você quer adicionar uma linha quando ela ainda não está presente.
- Você quer alterar o número da porta no arquivo de configuração
- Você quer desabilitar o SSL quando o SSL estiver habilitado
- Você quer adicionar uma nova entrada no arquivo /etc/hosts
- Você quer actualizar a versão do pacote quando a versão instalada está a corresponder à sua expressão normal
- Pode remover um nome de utilizador do ficheiro /etc/passwd usando regex
Espera que isto defina o contexto. Antes de prosseguirmos com os exemplos Algo a ser destacado.
O ficheiro Lineinfile possível só pode ser usado para trabalhar uma única linha num ficheiro. Se você quiser substituir linhas múltiplas tente substituir o módulo ou use blockinfile se quiser inserir/atualizar/remover um bloco de linhas em um arquivo.
Se você quiser explorar mais sobre o módulo Ansible Replace, você pode consultar este post.
Ansible replace line in file – Ansible Replace Examples
Ansible lineinfile examples
Reúnimos vários exemplos de ansible lineinfile aqui. Estes são exemplos que abordamos neste post. você pode escolher ler todos ou qualquer exemplo específico.
- Validar se uma linha está presente sem qualquer modificação
- Validar se uma linha está presente no arquivo e adicionar se ela não existe
- Substituir uma linha em um arquivo Se ela for encontrada por uma possível lineinfile
- Remover uma linha do arquivo se for encontrado – Todas as instâncias
- Inserir antes de uma linha de correspondência usando insert antes do parâmetro
- Inserir depois da linha de correspondência usando insert depois do parâmetro
- validar as alterações estão corretas antes de salvar
Exemplo 1: Validar se uma linha está presente no arquivo sem qualquer modificação
Isso é apenas para validar se uma linha está presente no arquivo ou não. Ele não modificará o arquivo independentemente do resultado. isto é exatamente como executar o comando quick find
O exemplo dado abaixo é para descobrir se a String “LogLevel debug” é ou não encontrada no arquivo httpd.conf do servidor web apache remoto.
Como mencionado anteriormente. Não haveria qualquer acção tomada
Neste exemplo vamos verificar se o LogLevel é Debug e imprimir a mensagem Se ele está lá ou não e não tomar qualquer acção. Isto está sendo feito com a ajuda de checkmode=yes
--- - nome: Exemplos de hosts de arquivos de linha: tarefas web: - nome: "Exemplo1: Validate if a String or line is present in the file" torna-se: yes become_user: root tags: exemplo1 lineinfile: path: /etc/httpd/conf/httpd.conf line: estado "LogLevel debug": present backup: yes check_mode: yes register: example1out
Though this playbook would report that there is a change made by marking it as changed=1
but this would not do any modification on the file as we ran the task in Check mode.
Aqui está o comando Quick ad-hoc para verificar qual é o verdadeiro LogLevel no ficheiro remoto httpd.conf
$ ansible web -m shell -a "grep -i LogLevel /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >># LogLevel: Controle o número de mensagens registradas no error_log.LogLevel warn
É recomendado ter sempre o parâmetro
backup: yes
no seu playbook quando você estiver usando o arquivo lineinfile. Isto asseguraria o backup do arquivo antes que qualquer alteração seja feita. Isso ajudaria no caso de você querer fazer o backup.
Example2: Valide se uma String ou linha está presente no arquivo e adicione se ela não existir
No mesmo playbook, acabamos de ver se removermos o modo de verificação, ele seria um playbook válido que procura por uma linha e a adiciona quando não há correspondências encontradas
Mas há um problema aqui a linha que você está mencionando para ser adicionada seria adicionada somente na linha End Of File ou Last. Isto pode ser controlado com insert_before e insert_before diretivas que serão discutidas mais tarde neste artigo.
Agora o playbook
--- - nome: Exemplos de lineinfile hosts: web tasks: - nome: "Example2: Add the line if it does not exist" torna-se: yes become_user: root tags: example2 lineinfile: path: /etc/httpd/conf/httpd.conf line: estado "LogLevel debug": present backup: yes register: example2out
O resultado disto resultaria num ficheiro de configuração inválido pois a entrada seria adicionada no End Of File.
$ ansible web -m shell -a "grep -in LogLevel /etc/httpd/conf/httpd.conf" mwiweb02 | CHANGED | rc=0 >>185:# LogLevel: Controle o número de mensagens registradas no log_log.189:LogLevel avisa354:LogLevel debug
Que pode ser controlado com Insert after e Insert before, que será mais tarde neste post.
Example3: Substitua uma linha em um arquivo por um possível lineinfile.
No exemplo2 vimos como adicionar uma nova linha com o módulo lineinfile. Agora vamos ver como substituir uma linha quando uma determinada linha for encontrada.
Embora você possa usar o módulo de substituição possível para substituir. O módulo Lineinfile também pode ser usado para substituir uma linha.
Agora neste exemplo, vamos mudar o LogLevel debug
para LogLevel Debug
com um D
Vamos usar o Ansible Lineinfile com Regular Expressions
para Pesquisar uma linha e o elemento de linha conteria o argumento line
manteria a linha a substituir por
Veja o seguinte Playbook e você pode facilmente entendê-lo.
--- - nome: Exemplos de hosts de arquivos de linha: tarefas web: - nome: "Exemplo1: Validate if a String or line is present in the file" torna-se: yes become_user: root tags: exemplo1 lineinfile: path: /etc/httpd/conf/httpd.conf # The String to Search regexp: "LogLevel warn" # The String to Replace line: estado "LogLevel debug": present backup: yes register: example1out
The Result of the file would be something like this
$ ansible web -m shell -a "grep -in LogLevel /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >4361>185:# LogLevel: Controlar o número de mensagens registadas no error_log.189:LogLevel debug
Substituiria todas as linhas de correspondência? E se houver mais de uma correspondência
Se houver mais de uma correspondência no arquivo. Um possível Lineinfile substituiria apenas a última linha encontrada ou encontrada.
Se você quiser substituir todas as ocorrências, você deve considerar o uso do módulo de substituição e não do Lineinfile.
Exemplo 4: Remova uma linha do arquivo, se ela for encontrada ( All the Instances )
Agora eu quero remover a Linha LogLevel Debug
que adicionamos anteriormente pois ela está no lugar errado e também já temos aLogLevel warn
presente no mesmo arquivo.
Aqui está o playbook possível para remover a Linha do arquivo e podemos usar algumas expressões regulares aqui para encontrar tanto debug
como Debug
--- - nome: Exemplos de hospedeiros de arquivos de linha: tarefas web: - nome: "Exemplo1: Validate if a String or line is present in the file" torna-se: yes become_user: root tags: exemplo1 lineinfile: path: /etc/httpd/conf/httpd.conf # String to Search regexp: "LogLevel ebug" # State is set to Absent to remove if the Searching Line is found state: absence backup: yes register: example1out
Here estamos definindo o parâmetro state como ausente que será removido se a busca for bem sucedida. o parâmetro line
não é usado porque não é necessário
Como mencionado anteriormente, isto removeria todas as linhas correspondentes do arquivo, em outras palavras, toda a aparência de uma Linha de Busca.
Exemplo5: Insert After a matching line using inserttafter parameter
Desde que tenhamos tomado o Apache httpd.conf como nosso arquivo base neste post, Vamos pegar algum requisito que costumávamos fazer com frequência no Apache, que é adicionar um novo ouvinte
Primeiro Vamos ver o que já existe no arquivo
$ ansible web -m shell -a "grep -in Listen /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>34:# Listen: Permite-lhe ligar o Apache a endereços IP específicos e/ou38:# Mude isto para Ouvir em endereços IP específicos como mostrado abaixo para 41:#Ouvir 12.34.56.78:8042:Ouvir 80
>
aqui 42 é o número da linha e pode ver que temos apenas uma declaração/directivo de Ouvir a partir de agora. Agora para fazer o Apache Ouvir 443 precisamos adicionar Listen 443
logo abaixo do parâmetro Listen 80
Deixe-nos ver como Inserir após alguma linha usando o parâmetro Inserttafter.
Aqui está o playbook.
--- - nome: Exemplos de hosts de arquivos de linha: tarefas web: - nome: "Exemplo1: Validate if a String or line is present in the file" torna-se: yes become_user: root tags: lineinfileexample lineinfile: path: /etc/httpd/conf/httpd.conf inserttafter: linha "^Ouvir +": "Listen 443" firstmatch: yes state: present register: lineinfileexample
Aqui você pode notar que não há parâmetro REGEX. Não é necessário, pois o próprio parâmetro inserido após pode ter a String de Pesquisa com a sintaxe de expressão regular
$ ansible web -m shell -a "grep -in Listen /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>34:# Listen: Permite-lhe ligar o Apache a endereços IP específicos e/ou38:# Mude isto para Ouvir em endereços IP específicos como mostrado abaixo para 41:#Ouvir 12.34.56.78:8042:Ouvir 8043:Ouvir 443
>
Se reparar nos números de linha no output, pode ver que o Listen 443
foi adicionado logo abaixo do Listen 80
>
>
Quando existem múltiplas entradas da linha de pesquisa está presente no ficheiro. A última linha correspondente seria considerada.
Exemplo6: Inserir Antes de uma linha correspondente usando insert antes do parâmetro
Para testar o insert antes do parâmetro, vamos pegar o mesmo httpd.conf como um arquivo base e desta vez vamos atualizar o arquivo ServerAdmin
Email ID do padrão ServerAdmin
para Server Admin
Antes de qualquer modificação
aksarav@middlewareinventory:/apps/vagrant/webinfra$ ansible web -m shell -a "grep -in ServerAdmin /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>83:# ServerAdmin: Seu endereço, onde os problemas com o servidor devem ser87:ServerAdmin root@localhost
Mas precisamos desativar/comentário a linha ServerAdmin existente e adicionar uma nova entrada, Aqui está o playbook para fazer ambas estas tarefas.
--- - nome: Exemplos de lineinfile hosts: tarefas web: - nome: "Example6: Comment the Exisiting ServerAdmin Line" torna-se: yes become_user: root tags: lineinfileexample6_1 lineinfile: path: /etc/httpd/conf/httpd.conf regexp: '(^ServerAdmin .*)' line: '# \1' backrefs: yes state: present register: lineinfileexample6_1 - name: "Example6: Add a New ServerAdmin Before the Commented Line" become: yes become_user: root tags: lineinfileexample6_2 lineinfile: path: /etc/httpd/conf/httpd.conf inserir antes: linha '# ServerAdmin .*': estado "ServerAdmin ": present register: lineinfileexample6_2
O resultado esperado seria algo como segue.
aksarav@middlewareinventory:/apps/vagrant/webinfra$ ansible web -m shell -a "grep -in ServerAdmin /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>83:# ServerAdmin: O seu endereço, onde os problemas com o servidor devem ser87:ServerAdmin [email protected]:# ServerAdmin root@localhost
Você pode ver que a linha número 88 foi comentada, que era a antiga Server Admin e a linha número 87 é a nossa nova ServerAdmin
Example 7: Validar as alterações antes de salvar/comprometer
Esta é uma funcionalidade agradável do Ansible lineinfile que lhe permitirá executar um comando shell para validar se o arquivo modificado está realmente OK ou se há algum problema. Como o nosso ficheiro base é um ficheiro de configuração httpd.conf
tem alguma sintaxe e se falharmos em aderir a ele, deixaremos todo o website/infra em jogo.
Então vamos validá-lo antes de guardar o ficheiro.
O servidor HTTPD do Apache tem um comando para executar a verificação de sintaxe no ficheiro httpd.conf que é httpd -t
Quando invocado e sem problemas de sintaxe. Ele imprimiria a mensagem Sintaxe OK como dada abaixo e retornaria um Código de Retorno Zero, que é tudo o que importa para o Ansible. Ansible conta com o código de retorno do comando de validação.
$ httpd -t Syntax OK
Se fosse NON-ZERO as alterações não seriam comprometidas e a tarefa falharia.
Aqui está o playbook para atualizar a diretiva ServerName do Apache.
--- - nome: Exemplos de hosts de arquivos de linha: tarefas web: - nome: "Example7: Update the ServerName" torna-se: yes become_user: root lineinfile: path: /etc/httpd/conf/httpd.conf inserttafter: linha '#ServidorNome www.example.com:80': estado "ServerName www.middlewareinventory.com:80": present # Command to Validate the Configuration and %s is a working copy of the file validate: "httpd -t -f %s"
Here o %s
é a cópia de trabalho do ficheiro actual. Ansible sempre copiaria o arquivo e o manteria como uma cópia de trabalho e faria as alterações e finalmente o copiaria para o local de destino e substituiria o arquivo original.
Quick Ad Hoc command to validate
$ ansible web -m shell -a "grep -in ServerName /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>92:# ServerName dá o nome e a porta que o servidor usa para se identificar.98:#ServerName www.example.com:8099:ServerName www.middlewareinventory.com:80
Pode ver que a diretiva ServerName foi adicionada.
Vimos ao Final do Artigo.
Espera que ajude
Avalie este artigo
Cheers
Sarav AK
Siga-nos no Facebook ou TwitterPara vídeos e tutoriais mais práticos. Subscreva o nosso canalConheça-me no Linkedin Meu PerfilPara qualquer Consulta ou para nos contratar Se gostou deste artigo. Mostre seu Suporte! Compre-me um Café.
Signup para Conteúdo Exclusivo “Somente Assinante”