2013-10-15 58 views
31

我在/etc/foo.txt有一個簡單的文件。該文件包含以下內容:Ansible lineinfile重複行

#bar 

我有以下ansible劇本任務以取消上述線路:

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

當我第一次運行ansible-劇本,行被取消註釋並在/ etc/foo.txt的現在包含以下內容:

bar 

但是,如果我再次運行ansible-劇本,我得到如下:

bar 
bar 

如果我再次運行它,那麼/etc/foo.txt文件看起來是這樣的:

bar 
bar 
bar 

如何避免線路重複這個?我只想取消註釋'#bar'並完成它。

回答

50

問題是任務的正則表達式只匹配註釋掉的行#bar。爲了冪等,lineinfile任務需要匹配該行的註釋未註釋狀態。通過這種方式,它將取消#bar的註釋,但將不會改變bar

這個任務應該做你想要什麼:「?」

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

注唯一的變化是增加了到正則表達式。

+0

但是總是改變文件。我的理解是,只有匹配正則表達式時纔會插入(文件修改)行。 – jdevora

+0

只要文件每次出來都一樣,任務就是冪等的。這就是關鍵所在。 – joemaller

+0

我發現了一個難題,即如果將'insertafter'與此結合使用,那麼最終會再次出現重複行。 'insertafter'打破這個公式。 –

55

如果您不想更改正則表達式,則需要添加backrefs =是

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

這改變的lineinfile從行爲:

find 
if found 
    replace line found 
else 
    add line 

到:

find 
if found 
    replace line found 

換句話說,這使得操作冪等。

+5

這是最好的答案。 –