我在/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'并完成它。
答案 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。
解决方案是不要替换注释掉的行,而是添加额外的行,同时保留原始行。