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’
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'
Al ejecutar el libro de jugadas, el nombre del nombre de dominio cambia en consecuencia, como se muestra:
# ansible-playbook change_hostname.yml
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
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
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]'
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
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