blockinfile ansible

ansible blockinfile



Ansible lineinfile duplica lĂ­nea (3)

El problema es que la expresión regular de la tarea solo coincide con la línea comentada, #bar . Para ser idempotente, la tarea linefile debe coincidir tanto con el estado comentado como sin comentar de la línea. De esta forma descomentará #bar pero pasará la bar sin cambios.

Esta tarea debe hacer lo que quieras:

- name: test lineinfile lineinfile: backup=yes state=present dest=/etc/foo.txt regexp=''^#?bar'' line=''bar''

Tenga en cuenta que el único cambio fue agregar un "?" para la expresión regular

Tengo un archivo simple en /etc/foo.txt. El archivo contiene lo siguiente:

#bar

Tengo la siguiente tarea ansible playbook para descomentar la línea anterior:

- name: test lineinfile lineinfile: backup=yes state=present dest=/etc/foo.txt regexp=''^#bar'' line=''bar''

Cuando ejecuto por primera vez ansible-playbook, la línea se descomenta y el /etc/foo.txt ahora contiene lo siguiente:

bar

Sin embargo, si ejecuto ansible-playbook nuevamente, obtengo lo siguiente:

bar bar

Si lo vuelvo a ejecutar, el archivo /etc/foo.txt se verá así:

bar bar bar

¿Cómo evitar esta duplicación de líneas? Solo quiero descomentar la ''barra #'' y terminar con esto.


Necesita agregar backrefs = yes si no desea cambiar su expresión regular.

- name: test lineinfile lineinfile: backup=yes state=present dest=/etc/foo.txt regexp=''^#bar'' backrefs=yes line=''bar''

Esto cambia el comportamiento de lineinfile desde:

find if found replace line found else add line

a:

find if found replace line found

En otras palabras, esto hace que la operación sea idempotente.