Ansible LINEINFLE复制行
我在/etc/foo.txt有一个简单的文件。该文件包含以下内容:Ansible LINEINFLE复制行,ansible,Ansible,我在/etc/foo.txt有一个简单的文件。该文件包含以下内容: #bar bar bar bar 我有以下ansible playbook任务来取消上面这行的注释: - name: test lineinfile lineinfile: backup=yes state=present dest=/etc/foo.txt regexp='^#bar' line='bar' 当我第一次运行ansible playbook时,该
#bar
bar
bar
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
bar
bar
bar
但是,如果我再次运行ansible playbook,我会得到以下结果:
#bar
bar
bar
bar
如果我再次运行它,那么/etc/foo.txt文件将如下所示:
bar
bar
bar
如何避免这种重复行?我只想取消对“#条”的注释并完成它。请参见
解决方案是不替换注释掉的行,而是添加一个附加行,同时保留原来的行。问题是任务的正则表达式只匹配注释掉的行,
\bar
。要成为幂等的,lineinfile任务需要匹配行的已注释和未注释状态。这样,它将取消注释#bar
,但将通过bar
而不会改变
此任务应执行您想要的操作:
- name: test lineinfile
lineinfile:
backup=yes
state=present
dest=/etc/foo.txt
regexp='^#?bar'
line='bar'
注意,唯一的更改是在正则表达式中添加“?”。如果不想更改正则表达式,则需要添加backrefs=yes
- name: test lineinfile
lineinfile: backup=yes state=present dest=/etc/foo.txt
regexp='^#bar' backrefs=yes
line='bar'
这将从以下位置更改的行为:
致:
换句话说,这使得操作幂等。但这总是会更改文件。我的理解是,只有当regexp匹配时才会插入(文件修改)行。只要每次文件都是相同的,任务就是幂等的。这才是最重要的。我发现,如果将
insertafter
与此结合使用,最终会再次出现重复行insertafter
会破坏此公式。用于“只需取消对“#条”的注释,就可以使用它了”
”。