Ejemplos de Ansible lineinfile – Añadir, Modificar, Borrar, Reemplazar líneas

  • 0

El módulo Ansible lineinfile podría ser el salvador de tu día cuando quieras trabajar con archivos y especialmente modificar su contenido sobre la marcha, como añadir una nueva línea en el archivo o actualizar una línea en el archivo o reemplazar una línea en el archivo cuando se encuentra cierto texto y mucho más.

lineinfile tiene un conjunto variado de ejemplos y proporciona muchos parámetros para hacer su trabajo fácilmente. En este post, vamos a ver el módulo ansible lineinfile en acción con ejemplos.

Ejemplos de Ansible lineinfile

Table of Contents

El módulo Ansible lineinfile

El módulo Ansible lineinfile es útil cuando se quiere añadir, eliminar, modificar una sola línea en un archivo. También puede utilizar condiciones para hacer coincidir la línea antes de modificarla o eliminarla utilizando las expresiones regulares. Puede reutilizar y modificar la línea coincidente utilizando el parámetro de referencia posterior.

Considere que tiene alguno de estos requisitos

  1. Desea añadir una línea cuando no está ya presente.
  2. Desea cambiar el número de puerto en el archivo de configuración
  3. Desea desactivar el SSL cuando el SSL está activado
  4. Desea añadir una nueva entrada en el archivo /etc/hosts
  5. Desea quiere actualizar la versión del paquete cuando la versión instalada coincide con su expresión regular
  6. Quiere eliminar un nombre de usuario del archivo /etc/passwd usando regex

Espero que esto establezca el contexto. Antes de continuar con los ejemplos Algo a destacar.

Ansible Lineinfile sólo se puede utilizar para trabajar una sola línea en un archivo. Si quieres reemplazar múltiples líneas prueba el módulo replace o usa blockinfile si quieres insertar/actualizar/eliminar un bloque de líneas en un archivo.

Si quieres explorar más sobre el módulo Ansible Replace puedes consultar este post.

Ansible replace line in file – Ansible Replace Examples

Ejemplos de ansible lineinfile

Aquí hemos reunido varios ejemplos de ansible lineinfile. Estos son ejemplos que hemos cubierto en este post. usted puede elegir para leer todos o cualquier ejemplo específico.

  • Validar si una línea está presente sin ninguna modificación
  • Validar si una línea está presente en el fichero y añadirla si no existe
  • Reemplazar una línea en un fichero si se encuentra con ansible lineinfile
  • Quitar una línea del archivo si se encuentra – Todas las instancias
  • Insertar antes de una línea coincidente utilizando el parámetro insertbefore
  • Insertar después de la línea coincidente utilizando el parámetro insertafter
  • validar que los cambios son correctos antes de guardar

Ejemplo 1: Validar si una línea está presente en el archivo sin ninguna modificación

Esto es sólo para validar si una línea está presente en el archivo o no. No modificará el archivo independientemente de cuál sea el resultado. esto es como ejecutar el comando quick find

El Ejemplo dado a continuación es para encontrar si la Cadena «LogLevel debug» se encuentra o no en el archivo httpd.conf del servidor web apache remoto.

Como se mencionó anteriormente. No se tomaría ninguna acción

En este ejemplo vamos a comprobar si el LogLevel es Debug e imprimir el mensaje Si está ahí o no y no tomar ninguna acción. Esto se hace con la ayuda de checkmode=yes

--- - nombre: Ejemplos de lineinfile hosts: web tasks: - nombre: "Example1: Validar si una Cadena o línea está presente en el archivo" become: yes become_user: root tags: example1 lineinfile: path: /etc/httpd/conf/httpd.conf line: "LogLevel debug" state: present backup: yes check_mode: yes register: example1out

Aunque este playbook informaría de que hay un cambio realizado marcándolo como changed=1 pero esto no haría ninguna modificación en el fichero ya que ejecutamos la tarea en modo Check.

Aquí está el comando ad-hoc rápido para comprobar cuál es el LogLevel real en el archivo httpd.conf remoto

$ ansible web -m shell -a "grep -i LogLevel /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >># LogLevel: Controla el número de mensajes que se registran en el error_log.LogLevel warn

Se recomienda tener siempre el parámetro backup: yes en el playbook cuando se utiliza el lineinfile. Esto aseguraría que el archivo está respaldado antes de hacer cualquier cambio. Esto ayudaría en caso de querer hacer roll back.

Ejemplo2: Validar si una Cadena o línea está presente en el archivo y añadir si no existe

En el mismo playbook, acabamos de ver si quitamos el modo de comprobación sería un playbook válido que busca una línea y la añade cuando no hay coincidencias encontradas

Pero hay un problema aquí la línea que está mencionando para ser añadida se añadiría sólo al final del archivo o última línea. Esto se puede controlar con las directivas insert_before e insert_before que se discutirán más adelante en este artículo.

Ahora el playbook

--- - name: Examples of lineinfile hosts: web tasks: - name: "Example2: Add the line if it does not exist" become: yes become_user: root tags: example2 lineinfile: path: /etc/httpd/conf/httpd.conf line: "LogLevel debug" state: present backup: yes register: example2out

El resultado de esto sería un archivo de configuración inválido ya que la entrada se añadiría al final del archivo.

$ ansible web -m shell -a "grep -in LogLevel /etc/httpd/conf/httpd.conf" mwiweb02 | CHANGED | rc=0 >>185:# LogLevel: Controla el número de mensajes que se registran en el error_log.189:LogLevel warn354:LogLevel debug

Que se puede controlar con Insert after e insert before que veremos más adelante en este post.

Ejemplo3: Reemplazar una línea en un archivo con ansible lineinfile.

En el ejemplo2 hemos visto cómo añadir una nueva línea con el módulo lineinfile. Ahora vamos a ver cómo reemplazar una línea cuando se encuentra una línea determinada.

Aunque se puede utilizar el módulo ansible replace para reemplazar. El módulo Lineinfile también se puede utilizar para reemplazar una línea.

Ahora en este ejemplo, vamos a cambiar el LogLevel debug a LogLevel Debug con una D mayúscula

Vamos a utilizar el Ansible Lineinfile con Regular Expressions para buscar una línea y el elemento de línea contendría el argumento line contendría la línea para reemplazar con

Mira el siguiente Playbook y podrás entenderlo fácilmente.

--- - nombre: Ejemplos de archivos de línea hosts: tareas web: - nombre: "Ejemplo1: Validar si una Cadena o línea está presente en el archivo" become: yes become_user: root tags: example1 lineinfile: path: /etc/httpd/conf/httpd.conf # La cadena a buscar regexp: "LogLevel warn" # La cadena a reemplazar line: "LogLevel debug" state: present backup: yes register: example1out

El resultado del archivo sería algo así

$ ansible web -m shell -a "grep -in LogLevel /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>185:# LogLevel: Controla el número de mensajes que se registran en el error_log.189:LogLevel debug

¿Reemplazará todas las líneas coincidentes? Qué pasa si hay más de una coincidencia

Si hay más de una coincidencia en el archivo. Ansible Lineinfile reemplazaría sólo la última línea coincidente o encontrada.

Si desea reemplazar todas las ocurrencias, debe considerar usar el módulo replace y no lineinfile.

Ejemplo 4: Eliminar una línea del fichero, si se encuentra ( Todas las Instancias )

Ahora quiero eliminar la Línea LogLevel Debug que hemos añadido anteriormente ya que está en el lugar equivocado y además ya tenemos laLogLevel warn presente en el mismo fichero.

Aquí está el playbook de ansible para eliminar la Línea del archivo y podemos usar algunas expresiones Regulares aquí para encontrar tanto debug como Debug

--- - name: Examples of lineinfile hosts: web tasks: - name: "Example1: Validar si una Cadena o línea está presente en el archivo" become: yes become_user: root tags: example1 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: absent backup: yes register: example1out

Aquí estamos configurando el parámetro state como absent que eliminará si la Búsqueda es Exitosa. el parámetro line no se utiliza ya que no es necesario

Como se ha mencionado anteriormente, esto eliminaría todas las líneas coincidentes del archivo, es decir, toda la apariencia de una Línea de Búsqueda.

Ejemplo5: Insertar después de una línea coincidente usando el parámetro insertafter

Dado que hemos tomado el archivo httpd.conf como nuestro archivo base en este post, vamos a tomar algunos requisitos que solíamos hacer a menudo en Apache, que es la adición de un nuevo listener

Primero vamos a ver lo que hay en el archivo ya

$ ansible web -m shell -a "grep -in Listen /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>34:# Listen: Le permite enlazar Apache a direcciones IP específicas y/o38:# Cambie esto a Listen en direcciones IP específicas como se muestra a continuación a 41:#Listen 12.34.56.78:8042:Listen 80

aquí 42 es el número de línea y puede ver que sólo tenemos una declaración/directiva Listen a partir de ahora. Ahora para hacer que Apache escuche a 443 tenemos que añadir Listen 443 justo debajo de la Listen 80
Veamos cómo Insertar después de alguna línea usando el parámetro insertafter.

Aquí está el playbook.

--- - nombre: Ejemplos de hosts lineinfile: web tasks: - nombre: "Example1: Validar si una Cadena o línea está presente en el archivo" become: yes become_user: root tags: lineinfileexample lineinfile: path: /etc/httpd/conf/httpd.conf insertafter: "^Listen +" line: "Listen 443" firstmatch: yes state: present register: lineinfileexample

Aquí puedes notar que no hay ningún parámetro REGEX. No es necesario ya que el propio parámetro insertafter puede tener la cadena de búsqueda con la sintaxis de expresión regular

$ ansible web -m shell -a "grep -in Listen /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>34:# Listen: Le permite enlazar Apache a direcciones IP específicas y/o38:# Cambie esto a Escuchar en direcciones IP específicas como se muestra a continuación a 41:#Escuchar 12.34.56.78:8042:Escuchar 8043:Escuchar 443

Si se fija en los números de línea en la salida, puede ver que el Listen 443 se ha añadido justo debajo del Listen 80

Cuando hay múltiples entradas de la línea de búsqueda está presente en el archivo. Se considerará la última línea coincidente.

Ejemplo6: Insertar antes de una línea coincidente utilizando el parámetro insertbefore

Para probar el parámetro insert before, tomemos el mismo archivo httpd.conf como archivo base y esta vez vamos a actualizar el ServerAdmin ID de correo electrónico del predeterminado ServerAdmin a Server Admin

Antes de cualquier modificación

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: Su dirección, donde los problemas con el servidor debe ser87:ServerAdmin root@localhost

Pero tenemos que Desactivar/Comentar la línea ServerAdmin existente y añadir una nueva entrada, Aquí está el libro de jugadas para hacer estas dos tareas.

--- - nombre: Ejemplos de lineinfile hosts: web tareas: - nombre: "Example6: Comment the Exisiting ServerAdmin Line" become: 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 insertbefore: '# ServerAdmin .*' line: "ServerAdmin " state: present register: lineinfileexample6_2

El resultado esperado sería algo así.

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: Su dirección, donde deben estar los problemas con el servidor87:ServerAdmin [email protected]:# ServerAdmin root@localhost

Puede ver que se ha comentado la línea número 88 que era el antiguo Server Admin y la línea número 87 es nuestro nuevo ServerAdmin

Ejemplo 7: Validar los cambios antes de guardar/comitir

Esta es una buena característica de Ansible lineinfile que le permitirá ejecutar un comando de shell para validar si el archivo modificado está realmente bien o si hay algún problema. Dado que nuestro archivo base es un archivo de configuración httpd.conf tiene cierta sintaxis y si no nos adherimos a ella, dejaremos todo el sitio web/infra en juego.

Así que vamos a validarlo antes de guardar el archivo.

El servidor HTTPD de Apache tiene un comando para realizar la comprobación de sintaxis en el archivo httpd.conf que es httpd -t

Cuando se invoca y sin problemas de sintaxis. Imprimirá el mensaje Syntax OK como se indica a continuación y devolverá un código de retorno cero, que es todo lo que le importa a Ansible. Ansible se basa en el código de retorno del comando de validación.

$ httpd -t Syntax OK

Si es NON-ZERO los cambios no se confirmarían y la tarea fallaría.

Aquí está el playbook para Actualizar la Directiva ServerName de Apache.

--- - nombre: Ejemplos de lineinfile hosts: web tasks: - nombre: "Example7: Update the ServerName" become: yes become_user: root lineinfile: path: /etc/httpd/conf/httpd.conf insertafter: '#NombreServidor www.example.com:80' línea: "ServerName www.middlewareinventory.com:80" state: present # Command to Validate the Configuration and %s is a working copy of the file validate: "httpd -t -f %s"

Aquí el %s es la copia de trabajo del archivo real. Ansible siempre copiaría el archivo y lo mantendría como copia de trabajo y haría los cambios y finalmente lo copiaría a la ubicación Destinada y reemplazaría el archivo original.

Comando rápido ad hoc para validar

$ ansible web -m shell -a "grep -in ServerName /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>92:# ServerName da el nombre y el puerto que el servidor utiliza para identificarse.98:#ServerName www.example.com:8099:ServerName www.middlewareinventory.com:80 

Puedes ver que la directiva ServerName ha sido añadida.

Hemos llegado al final del artículo.

Espero que te sirva de ayuda

Califica este artículo

Salud
Sarav AK

Compárame un café en ko-fi.com

Síguenos en Facebook o TwitterPara más vídeos prácticos y tutoriales. Suscríbete a nuestro canalEncuéntrame en Linkedin Mi PerfilPara cualquier Consulta o para contratarnos Si te gusta este artículo. ¡Muestra tu apoyo! Invítame un café.

Suscríbete para obtener contenido exclusivo «sólo para suscriptores»