Cómo reemplazar cadenas y líneas con Ansible

Ansible proporciona múltiples formas que puede usar para reemplazar una cadena, una línea completa o palabras que coincidan con un patrón determinado. Hay dos módulos que puede usar para lograr esto: el módulo de reemplazo y el módulo en línea. Vamos a profundizar y echar un vistazo a algunos ejemplos de cómo se pueden usar estos módulos en un libro de jugadas para reemplazar cadenas y líneas.

Reemplazar una cadena de un archivo con Ansible

El módulo de reemplazo reemplaza todas las instancias de una cadena definida dentro de un archivo.

Si la cadena no existe, no se hará nada y no se mostrará ningún error. Ansible simplemente devuelve que no se ha cambiado nada. Para reemplazar con éxito cadenas en un archivo, se requieren tres parámetros:

  • La ubicación del archivo indicada por la directiva ‘ruta’.
  • La directiva ‘regexp’: la cadena que se reemplazará o cambiará. Además, puede pasar cualquier expresión Python regular.
  • La directiva ‘reemplazar’: esta es la palabra o cadena de reemplazo.

Así es como se ve la sintaxis con el módulo de reemplazo:

- replace:
    path: /path/to/file
    regexp: 'string or regular expression for search'
    replace: 'word to replace the search string'
    backup: yes

Tengo un archivo de texto de muestra llamado sample.txt que tiene el contenido a continuación.

Unix es un sistema gratuito y de código abierto utilizado por desarrolladores y amantes del escritorio. Gracias a los esfuerzos de Linux Torvalds, Unix creció hasta convertirse en el sistema de código abierto más popular.

El objetivo es reemplazar la cadena ‘Unix’ con ‘Linux’. Para lograr eso, vamos a crear un archivo de libro de jugadas como se muestra.

- hosts: 127.0.0.1
  tasks:
  - name: Ansible replace string example
    replace:
      path: /etc/ansible/sample.txt
      regexp: 'Unix'
      replace: "Linux"

Luego vamos a ejecutar el libro de jugadas.

# ansible-playbook sample.txt

Desde la salida, puede ver claramente que la cadena ‘Unix’ ha sido reemplazada por ‘Linux’

Ansible-Playbook-replace-strings

Tomemos otro ejemplo.

Nuestro segundo objetivo es cambiar una entrada de nombre de host en mi archivo /etc/hosts de server.myubuntu.com a server.linuxtechi.info

Crearemos un archivo de libro de jugadas change_hostname.yml que tendrá el siguiente aspecto:

- hosts: 127.0.0.1
  tasks:
  - name: Ansible replace string example
    replace:
      path: /etc/hosts
      regexp:  '(s+)server.myubuntu.com(s+.*)?$'
      replace: '1server.linuxtechi.info2'

Cambiar-nombre-de-host-con-ansible

Al ejecutar el libro de jugadas, el nombre del nombre de dominio cambia en consecuencia, como se muestra:

# ansible-playbook change_hostname.yml

Run-Playbook-to-change-hostname-Ansible

Módulo de archivo de línea de Ansible

El módulo en línea de Ansible se puede utilizar de varias formas. Se puede utilizar para insertar una nueva línea, eliminar o modificar una línea existente del archivo. Vamos a echar un vistazo más de cerca a cada uno de estos.

Insertar una línea al final del archivo (EOF)

Para comenzar, comenzaremos aprendiendo cómo crear una línea si no está presente en un archivo. Comience especificando la ruta del archivo donde va a agregar la línea usando el atributo de ruta. Esto reemplazó la opción dest que se usaba en Ansible 2.3 y versiones anteriores.

Luego especifique la línea que se agregará en EOF. En este caso, agregaremos una nueva entrada al archivo /etc/hosts. Si la línea ya existe, Ansible omitirá agregarla y no se realizarán cambios.

El parámetro de estado le indica a Ansible que escriba la línea en el archivo y el parámetro de creación le dice a Ansible que cree el archivo si aún no está allí. Este es el archivo del libro de jugadas update_ip.yml.

- hosts: 127.0.0.1
  tasks:
    - name: Ansible update IP address
      lineinfile:
        path: /etc/hosts
        line: '173.82.56.150 wwww.linuxtechi.io'
        state: present
        create: yes

Ansible-playbook-inline-uso

Cuando se ejecuta el archivo del libro de jugadas, observe que se ha agregado la nueva entrada o línea.

# ansible-playbook update_ip.yml

Resultado de ejecución de Playbook en línea

Insertar una línea antes o después

A veces, es posible que desee insertar una nueva línea justo antes o después de una sección de un archivo y no siempre al final de la línea. Para esto, necesita usar las directivas insertafter e insertbefore.

En el libro de jugadas a continuación, estamos agregando una línea para especificar nuestro archivo de inventario preferido justo después del [defaults] sección en el archivo ansible.cfg. hemos escapado de la [] ya que son caracteres regex.

- hosts: 127.0.0.1
  tasks:
    - name: Ansible update IP address
      lineinfile:
        path: /etc/ansible/ansible.cfg
        line: 'inventory  = /home/linuxtechi/hosts'
        insertafter: '[defaults]'

Insertar-línea-después-de-patrón-coincidente-con-ansible

Para agregar una línea justo antes de un parámetro, use el parámetro ‘insertbefore’. En el siguiente ejemplo, agregamos la misma línea justo antes del patrón #library en el archivo de configuración de Ansible.

- hosts: 127.0.0.1
  tasks:
    - name: Ansible update IP address
      lineinfile:
        path: /etc/ansible/ansible.cfg
        line: 'inventory  = /home/linuxtechi/hosts'
        insertbefore: ‘#library’

Eliminar una línea usando el módulo lineinfile

Esto es exactamente lo contrario de agregar una línea. Una forma sencilla de lograr esto es establecer el parámetro de estado en absent . Por ejemplo, para eliminar la entrada en el archivo, asegúrese de que el parámetro de estado tenga el valor ausente

- hosts: 127.0.0.1
  tasks:
    - name: Ansible update IP address
      lineinfile:
        path: /etc/hosts
        line: ‘173.82.56.150 wwwwlinuxtechi.io’
        state: absent

Remove-Line-with-Ansible-playbook-execution

Otra forma de eliminar una línea es usando el parámetro regexp. Por ejemplo, el siguiente libro de jugadas elimina todas las líneas de un archivo que comienzan con la palabra Unix.

- hosts: 127.0.0.1
  tasks:
    - name: Ansible lineinfile regexp example
      lineinfile:
        dest: /etc.ansible/sample.txt
        regexp: '^Unix'
        state: absent

Eso es todo de este artículo, espero que ayude a comprender cómo reemplazar una cadena y líneas con Ansible.

Leer también: 9 ejemplos de comandos tee en Linux

Entradas relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *