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.

34
demandé sur zupo 2013-10-16 00:38:47

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.

53
répondu joemaller 2013-10-18 14:25:27

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.

60
répondu anatoly techtonik 2014-02-21 12:24:50

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à.

3
répondu zupo 2013-10-15 21:05:00