Cómo reemplazar una cadena en un archivo usando Ansible

Ansible tiene módulos ‘replace’, ‘blockinfile’ y ‘lineinfile’ para manejar líneas en un archivo. Cada uno de ellos se utiliza para un propósito específico. La elección de elegir uno entre ellos depende de la situación.

¿Qué cubriremos?

En esta publicación, exploraremos cómo reemplazar cualquier cadena en un archivo usando Ansible. Ansible tiene un módulo ‘ansible.builtin.replace’ para el mismo propósito. Exploremos el módulo de reemplazo a continuación.

La sintaxis general para el módulo Reemplazar es la siguiente:

- name: Name of the task

ansible.builtin.replace:

path: path of the file that needed to be changed

regexp: regex expression for old string to be replaced

replace: new string that needs to be added to file

Veamos algunos example libros de jugadas a continuación. El siguiente libro de jugadas verificará el archivo de hosts en la ruta proporcionada y reemplazará el nombre de host anterior (managed1.anslab.com) con el nuevo nombre de host (linuxhint.com):

---

- hosts: managed1(Name of your target node)

gather_facts: no

become: true

tasks:

- name: Replace module demo

ansible.builtin.replace:

path: /etc/hosts

regexp: '(s+)managed1.anslab.com(s+.*)?$'

replace: '1linuxhint.com2'

Puede ver el resultado de este libro de jugadas a continuación. Reemplazó cada aparición de “managed1.anslab.com” en el archivo con “linuxhint.com”.

Estoy usando expresiones regulares aquí. regex ayuda a hacer coincidir varias cadenas o una sola cadena. Obtenga más información sobre las expresiones regulares de Python aquíhttps://docs.python.org/3/library/re.html.

Ahora, exploremos los otros parámetros de este módulo:

1. ‘después’

Cuando tenemos el parámetro ‘después’ junto con ‘reemplazar’, es el parámetro ‘después’ desde donde comenzará realmente el reemplazo del contenido y continúa hasta el final del archivo.

Para ser más claros, veamos el siguiente libro de jugadas. Aquí, tenemos el valor del parámetro ‘después’ como “PubkeyAuthentication”. Después de encontrar la cadena “PubkeyAuthentication”, reemplazará la palabra “sí” con “no”.

Sintaxis:

- name: Syntax for Replace module with the ?after? expression.

ansible.builtin.replace:

path: path of the file

after: word after which replacement starts

regexp: regular expression to match the word that needs to be changed

replace: string that will replace old word

En el libro de jugadas a continuación, observe el uso de la expresión ‘después’:

---

- hosts: managed1 (Name of your target node)

gather_facts: no

become: true

tasks:

- name: Replace module demo

ansible.builtin.replace:

path: /etc/ssh/sshd_config

regexp: 'yes'

after: 'PubkeyAuthentication'

replace: 'no'

Si revisa el resultado a continuación, puede notar después de la cadena “PubkeyAuthentication”. La cadena “sí” ahora se reemplaza por “no”. Estoy usando sed para obtener solo una línea del archivo para una fácil visibilidad.

2. 'antes'

‘antes’ es opuesto a ‘después’. Reemplazará cada cadena coincidente especificada para el parámetro ‘antes’.

Sintaxis:

- name: Syntax for Replace module with the ?before? expression.

ansible.builtin.replace:

path: path of the file that needs to be updated

before: before this word, it will match the regex and replace it with new word

regexp: regular expression to match the word to be changed

replace: string that will replace the old word

Veamos un example libro de jugadas para el mismo. El siguiente libro de jugadas utiliza la palabra clave ‘antes’:

---

- hosts: managed1(Name of your target node)

gather_facts: no

become: true

tasks:

- name: Replace module demo

ansible.builtin.replace:

path: /etc/hosts

before: 'managed1'

regexp: 'linuxhint.com'

replace: 'linuxways.net'

En el libro de jugadas anterior, antes de la palabra “managed1”, si hay una cadena como “linuxhint.com”, se reemplazará con “linuxways.net” por motivos de simplicidad. Aquí, no estoy usando ninguna expresión regular compleja. Puede ver el archivo antes y después de ejecutar la salida en la captura de pantalla anterior.

3. ‘antes y después’

También puede usar los parámetros anteriores y posteriores simultáneamente para reemplazar las palabras intermedias.

Sintaxis:

- name: Syntax for Replace module with the ?before? and ?after? expressions.

ansible.builtin.replace:

path: path of the file

after: after this word the word will be replaced

before: before this word the word will be replaced

regexp: regular expression to match the word to be replaced

replace: string that will replace old word

Ahora, echemos un vistazo a un simple example libro de jugadas a continuación que demuestra antes y después.

---

- hosts: managed1

gather_facts: no

become: true

tasks:

- name: Replace module demo

ansible.builtin.replace:

path: /etc/hosts

after: '127.0.2.1'

before: 'managed1'

regexp: 'linuxways.net'

replace: 'tecofers.com'

En el libro de jugadas anterior, puede observar claramente que la cadena antes de ‘managed1’ y después de la cadena “127.0.2.1” se reemplaza con la cadena “tecofers.com”.

Yendo más allá, hay algunos atributos más interesantes para este módulo, por example respaldo.

4. ‘copia de seguridad’

La propiedad ‘copia de seguridad’ tiene dos opciones que se pueden configurar como ‘sí’ o ‘no’. Si configura la copia de seguridad como sí, se creará un archivo de copia de seguridad del archivo original junto con su marca de tiempo. Entonces, en caso de que haya estropeado el archivo original, puede consultar el archivo de copia de seguridad (sugerido para sistemas de producción).

Conclusión

En esta guía, hemos visto el uso del módulo ‘reemplazar’ en Ansible para reemplazar una cadena en un archivo. Además, puede consultar el documento oficial de ansible para conocer más parámetros que acompañan a este módulo.

Artículos Relacionados