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 possui 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 lineinfile do Ansible.

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

Neste tutorial, você aprenderá o que é o módulo lineinfile do Ansible, 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 lineinfile do Ansible. 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ê deseja seguir exatamente o tutorial.

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

Vamos começar este tutorial executando o módulo Ansible lineinfile usando 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 conectar-se à máquina web e passar um argumento (-a), que é o comando a ser executado.

Neste exemplo, o módulo lineinfile atualiza a entrada do 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 atualiza com 127.0.0.1 myapache especificado no parâmetro line.
  • –become 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

Depois de executar o comando, você deve 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 pode ser visto abaixo, a entrada do 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 várias 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.

Supondo que você já esteja logado no 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 de playbook YAML. Este playbook possui várias tarefas que utilizam o módulo lineinfile do Ansible 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; caso contrário, 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 MaxKeepAliveRequests para 1000 e KeepAliveTimeout para 100.

3. Adiciona a linha com o texto “Hello This is my Apache Page” 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 Ansible lineinfile 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 realizar 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 ao final da página html: "Olá, esta é a 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 realizar 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 realizar 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, significando que o host remoto não estava no estado adequado e foi modificado para executar o comando. Para aquela TAREFA que tem o status OK, mostra que não requerem alterações.

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

5. Finalmente, 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 administrador está presente com privilégios completos e, caso contrário, adicioná-lo
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 se o MaxKeepAliveRequests e o KeepAliveTimeout 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 de seus playbooks.

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

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