Ansible lineinfile duplique la ligne
J'ai un fichier simple dans /etc / foo.txt. Le fichier contient les éléments suivants:
#bar
J'ai la tâche de playbook ansible suivante pour décommenter la ligne ci-dessus:
- name: test lineinfile
lineinfile: backup=yes state=present dest=/etc/foo.txt
regexp='^#bar'
line='bar'
Lorsque je lance ansible-playbook pour la première fois, la ligne est décommentée et le /etc/foo.txt contient maintenant les éléments suivants:
bar
Cependant, si je lance à nouveau ansible-playbook, j'obtiens ce qui suit:
bar
bar
Si je l'exécute encore une fois, alors le/etc / foo.le fichier txt ressemblera à ceci:
bar
bar
bar
Comment éviter cette duplication de lignes? Je veux juste décommenter le '# bar ' et en avoir fini avec.
3 réponses
Le problème est que l'expression rationnelle de la tâche ne correspond qu'à la ligne commentée, #bar
. Pour être idempotent, la tâche lineinfile doit correspondre à la fois à l'état commenté et à l'état non commenté de la ligne. De cette façon il décommentez #bar
mais passera bar
inchangé.
Cette tâche devrait faire ce que vous voulez:
- name: test lineinfile
lineinfile:
backup=yes
state=present
dest=/etc/foo.txt
regexp='^#?bar'
line='bar'
Notez que le seul changement était l'ajout d'un"?"pour l'expression rationnelle.
Vous avez besoin d'ajouter backrefs=oui si vous ne voulez pas changer votre expression régulière.
- name: test lineinfile
lineinfile: backup=yes state=present dest=/etc/foo.txt
regexp='^#bar' backrefs=yes
line='bar'
, Cela modifie le comportement de lineinfile à partir de:
find
if found
replace line found
else
add line
À:
find
if found
replace line found
En d'autres termes, cela rend l'opération idempotente.
Voir https://github.com/ansible/ansible/issues/4531.
La solution est de ne pas remplacer la ligne commentée, mais d'ajouter une ligne supplémentaire, tout en gardant l'original là.