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.
Ver https://github.com/ansible/ansible/issues/4531 .
La solución es no reemplazar la línea comentada, sino agregar una línea adicional, manteniendo el original allí.