Ansible LINEINFLE复制行

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时,该

我在/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时,该行没有注释,/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
会破坏此公式。用于“
只需取消对“#条”的注释,就可以使用它了”
”。