Cómo utilizar el módulo lineinfile de Ansible para gestionar archivos de texto

Ansible es una herramienta de automatización ampliamente utilizada que puede gestionar cientos de nodos de una vez. Ansible tiene muchas características excelentes, y una de ellas es su capacidad para gestionar una sola línea dentro de un archivo en nodos remotos utilizando el módulo lineinfile de Ansible.

El módulo lineinfile de Ansible es un módulo que realiza diversas acciones en una sola línea de un archivo, como reemplazar una línea, actualizar una línea o agregar una línea particular.

En este tutorial, aprenderás qué es el módulo lineinfile de Ansible, cómo funciona y cómo usarlo para gestionar archivos de texto.

Requisitos previos

Esta publicación será un tutorial paso a paso sobre el módulo lineinfile de Ansible. Si deseas seguirlo, asegúrate de tener lo siguiente:

  • 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.
  • Apache ya debería estar instalado en la computadora remota si deseas seguir el tutorial exactamente.

Modificando un archivo de texto con el módulo lineinfile de Ansible.

Comencemos este tutorial ejecutando el módulo lineinfile de Ansible mediante comandos ad hoc. Los comandos ad hoc son una forma rápida de probar o ejecutar un solo comando en un host remoto.

Inicia sesión en tu controlador de Ansible y ejecuta el siguiente comando. Este comando utiliza el módulo lineinfile (-m) para conectarse a la máquina web y pasar un argumento (-a) que es el comando a ejecutar.

En este caso, el módulo lineinfile actualiza la entrada localhost mapeando la dirección IP 127.0.0.1 con myapache en el archivo /etc/hosts. Al mapear 127.0.0.1 con myapache, puedes acceder a la página de prueba de Apache localmente en HTTP://myapache:80

  • path denota la ubicación del archivo.
  • regexp encuentra la expresión regular, si existe, en el archivo y actualiza con 127.0.0.1 myapache especificado en el parámetro line.
  • –become permite ejecutar el comando como usuario privilegiado.
  • El grupo de inventario web es una colección de todos los servidores.
  • ansible.builtin.lineinfile o simplemente lineinfile es el nombre del 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

Después de ejecutar el comando, deberías ver un mensaje CHANGED que confirma que la línea se ha actualizado correctamente en el host remoto.

Running the ad hoc command with ansible lineinfile module

Inicie sesión en el nodo remoto utilizando un cliente SSH y verifique si el archivo /etc/hosts ha sido actualizado con el nuevo valor utilizando el comando cat.

Como puede ver a continuación, la entrada de localhost se ha actualizado correctamente con 127.0.0.1 myapache en la máquina remota.

Verifying the host file on remote machine

Modificando múltiples archivos de texto dentro de un libro de jugadas

Trabajar con un comando ad hoc único para administrar líneas en una máquina remota puede estar bien, pero será difícil si tiene líneas en varios archivos o múltiples líneas en un archivo para administrar. En lugar de usar comandos ad hoc, considere usar el módulo lineinfile de Ansible dentro del libro de jugadas utilizando el comando ansible-playbook.

Ahora, aprendamos cómo usar el módulo lineinfile de Ansible dentro del libro de jugadas y modificar algunas líneas.

Suponiendo que ya haya iniciado sesión en el host controlador de Ansible:

1. Cree un directorio llamado ansible_lineinfile_module_demo en su directorio de inicio. Este directorio contendrá el libro de jugadas que utilizará para invocar el módulo lineinfile.

mkdir ~/ansible_lineinfile_module_demo
cd ~/ansible_lineinfile_module_demo

2. Crea otro archivo llamado my_playbook.yml en el directorio ~/ansible_lineinfile_module_demo y pega el siguiente contenido del playbook YAML. Este playbook tiene varias tareas que utilizan el módulo lineinfile de Ansible para gestionar líneas de diferentes archivos de configuración para Apache en la máquina remota.

El playbook a continuación contiene las siguientes tareas:

1. Verifica si ADMIN está presente en el archivo /etc/sudoers; si no lo encuentra, la tarea lo añade.

2. Asegura que el predeterminado de Apache esté escuchando en el puerto 8080 dentro del archivo /etc/apache2/ports.conf; si encuentra algún otro puerto, el módulo lineinfile lo actualiza a 8080. De manera similar, en el archivo /etc/apache2/apache2.conf, actualiza MaxKeepAliveRequests a 1000 y KeepAliveTimeout a 100.

3. Añade la línea con el texto “Hello This is my Apache Page” al final de la página index.html en el servidor remoto bajo el directorio /var/www/html.

Los playbooks de Ansible están escritos en YAML. Para obtener más información sobre YAML, haz clic aquí

---
- name: Ansible lineinfile module example
# Definición del servidor remoto donde el módulo lineinfile de Ansible tendrá efecto
  hosts: web
  remote_user: ubuntu   # Usando el host remoto como ubuntu
  become: true
  tasks:

# (Tarea-1) Comprobando el archivo Sudoers si los administradores tienen permiso para realizar todas las operaciones
    - name: Validate the sudoers file before saving
      ansible.builtin.lineinfile:
         path: /etc/sudoers
         state: present
         regexp: '^%ADMIN ALL='
         line: '%ADMIN ALL=(ALL) NOPASSWD: ALL'

# (Tarea-2) Actualizando el puerto predeterminado de Apache a 8080
    - name: Ensure the default Apache port is 8080
      ansible.builtin.lineinfile:
         path: /etc/apache2/ports.conf
         regexp: '^Listen '
         insertafter: '^#Listen '
         line: Listen 8080

# (Tarea-3) Agregando la línea al final de la página html Hola, esta es mi página de 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

# (Tarea-4) Comprobando el archivo Sudoers si los administradores tienen permiso para realizar todas las operaciones
    - name: Ensure MaxKeepAliveRequests is set to greater than 100
      ansible.builtin.lineinfile:
         path: /etc/apache2/apache2.conf
         regexp: '^MaxKeepAliveRequests'
         line: MaxKeepAliveRequests=1000

# (Tarea-5) Comprobando el archivo Sudoers si los administradores tienen permiso para realizar todas las operaciones
    - name: Ensure KeepAliveTimeout is set to greater than 50
      ansible.builtin.lineinfile:
         path: /etc/apache2/apache2.conf
         regexp: '^KeepAliveTimeout'
         line: KeepAliveTimeout=100

3. Ahora, invoca el playbook y ejecuta las tareas usando el comando ansible-playbook para agregar o actualizar todas las líneas definidas en el playbook en el host remoto.

ansible-playbook my_playbook.yml 
Invoking the ansible playbook

A continuación, puedes ver que la TAREA tiene un estado de cambiado, lo que significa que el host remoto no estaba en el estado adecuado y fue modificado para ejecutar el comando. Para esa TAREA que tiene un estado OK, muestra que no requieren ningún cambio.

4. A continuación, conéctate por SSH al host remoto usando tu cliente SSH favorito.

5. Finalmente, verifica si todas las líneas definidas en el mi_playbook.yml están actualizadas o agregadas en el host remoto usando el comando cat.

# Para verificar si el administrador está presente con todos los privilegios y, si no lo está, agregarlo
cat /etc/sudoers
# Para verificar que MaxKeepAliveRequests y KeepAliveTimeout se hayan actualizado a 1000 y 100, respectivamente.
cat /etc/apache2/apache.config | grep Alive
# Para verificar si Apache está escuchando en el puerto 8080
cat /etc/apache2/ports.config

La captura de pantalla a continuación confirma que el usuario admin ya está agregado en el archivo sudoers.

Verifying the sudoers file

Nuevamente, la captura de pantalla a continuación confirma que Apache está escuchando en el Puerto 8080 por defecto.

Verifying the ports for in the config file

Finalmente, verifica si MaxKeepAliveRequests y KeepAliveTimeout se han actualizado a 1000 y 100, respectivamente.

Verifying the MaxKeepAliveRequests and KeepAliveTimeout in the config file

Conclusión

El módulo lineinfile de Ansible es una excelente manera de modificar archivos de texto en hosts remotos. El módulo proporciona una excelente manera de agregar, eliminar y modificar líneas en archivos de texto dentro de tus playbooks.

¿Qué otros casos de uso consideras que se beneficiarían del módulo lineinfile de Ansible?

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