Ansible lineinfile重复行

时间:2013-10-15 20:38:48

标签: ansible

我在/etc/foo.txt有一个简单的文件。该文件包含以下内容:

#bar

我有以下ansible playbook任务取消注释上面的行:

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

当我第一次运行ansible-playbook时,该行被取消注释,而/etc/foo.txt现在包含以下内容:

bar

但是,如果我再次运行ansible-playbook,我会得到以下内容:

bar
bar

如果我再次运行它,那么/etc/foo.txt文件将如下所示:

bar
bar
bar

如何避免重复这些行?我只是想取消注释'#bar'并完成它。

3 个答案:

答案 0 :(得分:67)

如果您不想更改正则表达式,则需要添加 backrefs = yes

- 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

换句话说,这使操作具有幂等性。

答案 1 :(得分:54)

问题是任务的正则表达式只匹配注释掉的行#bar。要成为幂等,lineinfile任务需要匹配行的注释未注释状态。这样它将取消注释#bar,但会保持bar不变。

此任务应该按照您的要求执行:

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

请注意,唯一的变化是添加“?”到正则表达式。

答案 2 :(得分:3)

请参阅https://github.com/ansible/ansible/issues/4531

解决方案是不要替换注释掉的行,而是添加额外的行,同时保留原始行。