Como Usar o Módulo lineinfile do Ansible para Gerenciar Arquivos de Texto

O Ansible é uma ferramenta de automação amplamente utilizada que pode gerenciar centenas de nós de uma só vez. O Ansible tem muitos recursos excelentes, e um deles é sua capacidade de gerenciar uma única linha dentro de um arquivo em nós remotos usando o módulo Ansible lineinfile.

O módulo Ansible lineinfile é um módulo que realiza várias ações em uma única linha de um arquivo, como substituir uma linha, atualizar uma linha ou adicionar uma linha específica.

Neste tutorial, você aprenderá o que é o módulo Ansible lineinfile, como ele funciona e como usá-lo para gerenciar arquivos de texto.

Pré-requisitos

Este post será um tutorial passo a passo sobre o módulo Ansible lineinfile. Se você deseja acompanhar, certifique-se de ter o seguinte em vigor:

  • A remote computer to run commands. You’ll need an inventory file set up and one or more hosts already configured to run Ansible command and playbooks on. The remote Linux computer will be called myserver, and the tutorial will use an inventory group called web.
  • O Apache já deve estar instalado no computador remoto se você quiser acompanhar exatamente o tutorial.

Modificando um Arquivo de Texto com o módulo lineinfile do Ansible.

Vamos começar este tutorial executando o módulo lineinfile do Ansible usando os comandos ad hoc. Comandos ad hoc são uma maneira rápida de testar ou executar um único comando em um host remoto.

Acesse o seu controlador Ansible e execute o seguinte comando. Este comando utiliza o módulo lineinfile (-m) para se conectar à máquina web e passa um argumento (-a) que é o comando a ser executado.

Neste exemplo, o módulo lineinfile atualiza a entrada localhost mapeando o endereço IP 127.0.0.1 com myapache no arquivo /etc/hosts. Ao mapear o 127.0.0.1 com myapache, você pode acessar a página de teste do apache localmente em HTTP://myapache:80

  • path denota a localização do arquivo.
  • regexp encontra a expressão regular, se houver, no arquivo e a atualiza com 127.0.0.1 myapache especificada no parâmetro line.
  • –become flag permite que você execute o comando como usuário privilegiado.
  • O web é o grupo de inventário que é uma coleção de todos os servidores.
  • ansible.builtin.lineinfile ou simplesmente lineinfile é o nome do módulo.
ansible web -m ansible.builtin.lineinfile -a "path=/etc/hosts regexp='^127\.0\.0\.1'  line='127.0.0.1 myapache' state=present" --become

Após executar o comando, você deverá ver uma mensagem ALTERADO que confirma que a linha foi atualizada com sucesso no host remoto.

Running the ad hoc command with ansible lineinfile module

Acesse o nó remoto usando um cliente SSH e verifique se o arquivo /etc/hosts foi atualizado com o novo valor usando o comando cat.

Como você pode ver abaixo, a entrada localhost foi atualizada com sucesso para 127.0.0.1 myapache na máquina remota.

Verifying the host file on remote machine

Modificando Múltiplos Arquivos de Texto Dentro de um Playbook

Trabalhar com um único comando ad hoc para gerenciar linhas em uma máquina remota pode ser viável, mas será difícil se você tiver linhas em vários arquivos ou múltiplas linhas em um arquivo para gerenciar. Em vez de usar comandos ad hoc, considere usar o módulo lineinfile do Ansible dentro do playbook usando o comando ansible-playbook.

Agora, vamos aprender como usar o módulo lineinfile do Ansible dentro do playbook e modificar algumas linhas.

Assumindo que você já está conectado ao host controlador do Ansible:

1. Crie um diretório chamado ansible_lineinfile_module_demo em seu diretório home. Este diretório conterá o playbook que você usará para invocar o módulo lineinfile.

mkdir ~/ansible_lineinfile_module_demo
cd ~/ansible_lineinfile_module_demo

2. Crie outro arquivo chamado my_playbook.yml no diretório ~/ansible_lineinfile_module_demo e cole o seguinte conteúdo do playbook YAML. Este playbook tem várias tarefas que usam o módulo Ansible lineinfile para gerenciar linhas de diferentes arquivos de configuração para o Apache na máquina remota.

O playbook abaixo contém as seguintes tarefas:

1. Verifica se ADMIN está presente no arquivo /etc/sudoers; se não estiver, a tarefa o adiciona.

2. Garante que o Apache padrão esteja ouvindo na porta 8080 dentro do arquivo /etc/apache2/ports.conf; se encontrar qualquer outra porta, o módulo lineinfile a atualiza para a porta 8080. Da mesma forma, no arquivo /etc/apache2/apache2.conf, ele atualiza o MaxKeepAliveRequests para 1000 e o KeepAliveTimeout para 100.

3. Adiciona a linha com o texto “Olá, esta é a minha página do Apache” no final da página index.html no servidor remoto sob o diretório /var/www/html.

Os playbooks do Ansible são escritos em YAML. Para saber mais sobre YAML, clique aqui

---
- name: Ansible lineinfile module example
# Definindo o servidor remoto onde o módulo lineinfile do Ansible terá efeito
  hosts: web
  remote_user: ubuntu   # Usando o host remoto como ubuntu
  become: true
  tasks:

# (Tarefa-1) Verificando o arquivo Sudoers se os administradores têm permissão para executar todas as operações
    - name: Validate the sudoers file before saving
      ansible.builtin.lineinfile:
         path: /etc/sudoers
         state: present
         regexp: '^%ADMIN ALL='
         line: '%ADMIN ALL=(ALL) NOPASSWD: ALL'

# (Tarefa-2) Atualizando a porta padrão do Apache para 8080
    - name: Ensure the default Apache port is 8080
      ansible.builtin.lineinfile:
         path: /etc/apache2/ports.conf
         regexp: '^Listen '
         insertafter: '^#Listen '
         line: Listen 8080

# (Tarefa-3) Adicionando a linha no final da página html Olá, esta é minha Página Apache
    - name: Add a line to a file if the file does not exist
      ansible.builtin.lineinfile:
         path: /var/www/html/index.html
         line: Hello This is my Apache Page
         create: yes

# (Tarefa-4) Verificando o arquivo Sudoers se os administradores têm permissão para executar todas as operações
    - name: Ensure MaxKeepAliveRequests is set to greater than 100
      ansible.builtin.lineinfile:
         path: /etc/apache2/apache2.conf
         regexp: '^MaxKeepAliveRequests'
         line: MaxKeepAliveRequests=1000

# (Tarefa-5) Verificando o arquivo Sudoers se os administradores têm permissão para executar todas as operações
    - name: Ensure KeepAliveTimeout is set to greater than 50
      ansible.builtin.lineinfile:
         path: /etc/apache2/apache2.conf
         regexp: '^KeepAliveTimeout'
         line: KeepAliveTimeout=100

3. Agora, invoque o playbook e execute as tarefas usando o comando ansible-playbook para adicionar ou atualizar todas as linhas definidas no playbook no host remoto.

ansible-playbook my_playbook.yml 
Invoking the ansible playbook

Abaixo, você pode ver que a TAREFA tem um status de alterado, o que significa que o host remoto não estava no estado adequado e foi modificado para executar o comando. Para aquela TAREFA que tem status OK, mostra que elas não requerem nenhuma alteração.

4. Em seguida, faça login SSH no host remoto usando seu cliente SSH favorito.

5. Por fim, verifique se todas as linhas definidas no meu_playbook.yml foram atualizadas ou adicionadas no host remoto usando o comando cat.

# Para verificar se o admin está presente com privilégios completos e, se não estiver, adicionar
cat /etc/sudoers
# Para verificar se o MaxKeepAliveRequests e o KeepAliveTimeout foram atualizados para 1000 e 100, respectivamente.
cat /etc/apache2/apache.config | grep Alive
# Para verificar se o Apache está ouvindo na porta 8080
cat /etc/apache2/ports.config

A captura de tela abaixo confirma que o admin já está adicionado no arquivo sudoers.

Verifying the sudoers file

Novamente, a captura de tela abaixo confirma que o Apache está ouvindo na Porta 8080 por padrão.

Verifying the ports for in the config file

Por fim, verifique o MaxKeepAliveRequests e o KeepAliveTimeout se foram atualizados para 1000 e 100, respectivamente.

Verifying the MaxKeepAliveRequests and KeepAliveTimeout in the config file

Conclusão

O módulo lineinfile do Ansible é uma ótima maneira de modificar arquivos de texto em hosts remotos. O módulo oferece uma ótima maneira de adicionar, remover e modificar linhas em arquivos de texto dentro dos seus playbooks.

Quais outros casos de uso você vê que se beneficiariam do módulo lineinfile do Ansible?

Source:
https://adamtheautomator.com/ansible-lineinfile/