2013-10-15 8 views
31

Ich habe eine einfache Datei bei/etc/foo.txt. Die Datei enthält folgende Komponenten:Ansible lineinfile duplicates Linie

#bar 

ich folgende ansible Textbuch Aufgabe haben, die Zeile oben Kommentar-:

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

Als ich das erste ansible-Playbook laufen, wird die Linie unkommentiert und die/etc/foo.txt enthält nun die folgende:

bar 

wenn ich jedoch wieder ansible-Playbook laufen, erhalte ich folgendes:

bar 
bar 

Wenn ich es noch einmal laufen, dann ist die /etc/foo.txt Datei wird wie folgt aussehen:

bar 
bar 
bar 

Wie diese Vervielfältigungen von Linien zu vermeiden? Ich möchte nur die '#bar' auskommentieren und damit fertig sein.

Antwort

50

Das Problem ist, dass der Regex der Aufgabe nur der auskommentierten Zeile #bar entspricht. Damit die Line-In-Datei idempotent ist, muss sie sowohl dem kommentierten als auch dem unkommentierten Status der Zeile entsprechen. Auf diese Weise wird #bar auskommentiert, aber unverändert bar übergeben.

sollte diese Aufgabe tun, was Sie wollen:

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

Hinweis die einzige Änderung wurde ein Zusatz "?" in die Regex.

+0

Aber das ändert immer die Datei. Mein Verständnis war, dass die Zeile nur eingefügt wird (Datei geändert), wenn die Regexp übereinstimmte. – jdevora

+0

Solange die Datei jedes Mal gleich ist, ist die Aufgabe idempotent. Das ist alles was zählt. – joemaller

+0

Ich fand den harten Weg heraus, dass, wenn Sie 'insertafter' in Kombination damit verwenden, Sie wieder mit doppelten Zeilen enden. 'insertafter' bricht diese Formel. –

55

Sie müssen backrefs = yes hinzufügen, wenn Sie Ihren regulären Ausdruck nicht ändern möchten.

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

Dies ändert das Verhalten von lineinfile aus:

find 
if found 
    replace line found 
else 
    add line 

zu:

find 
if found 
    replace line found 

Mit anderen Worten, dies macht die Bedienung idempotent.

+5

Dies ist die beste Antwort. –

Verwandte Themen