在同一个文件上执行多个 ansible.builtin.blockinfile 任务?

tom*_*_ny 4 ansible

我发现,如果单个文件有多个 ansible.builtin.blockinfile 任务,则最后一个 blockinfile 任务将覆盖单个# BEGIN ANSIBLE MANAGED BLOCK {mark} # END ANSIBLE MANAGED BLOCK. 我期望它像 lineinfile 一样工作,可以在文件的多个区域中执行多次替换。

有没有解决的办法?

初始文件:

ini.foo=bar

ini.bar=foo
Run Code Online (Sandbox Code Playgroud)

任务文件:

- blockinfile:
   path: /my/file
   block: |
    block1
    block1
    block1
   insertbefore: '^ini.foo=bar'

- blockinfile:
   path: /my/file
   block: |
    block2
    block2
    block2
   insertbefore: '^ini.bar=foo'
Run Code Online (Sandbox Code Playgroud)

预期结果:

# BEGIN ANSIBLE MANAGED BLOCK
    block1
    block1
    block1
# END ANSIBLE MANAGED BLOCK
ini.foo=bar

# BEGIN ANSIBLE MANAGED BLOCK
    block2
    block2
    block2
# END ANSIBLE MANAGED BLOCK
ini.bar=foo
Run Code Online (Sandbox Code Playgroud)

实际结果:

# BEGIN ANSIBLE MANAGED BLOCK
    block2
    block2
    block2
# END ANSIBLE MANAGED BLOCK
ini.foo=bar

ini.bar=foo
Run Code Online (Sandbox Code Playgroud)

请注意第二个任务如何替换第一个替换的内容,并且不尊重其自己的insertbefore参数。

任何帮助表示赞赏。

小智 5

您可以使用marker来分隔块消息。你的代码应该是这样的:

- blockinfile:
   path: /my/file
   marker: "{mark} block1"
   block: |
    block1
    block1
    block1
   insertbefore: '^ini.foo=bar'

- blockinfile:
   path: /my/file
   marker: "{mark} block2"
   block: |
    block2
    block2
    block2
   insertbefore: '^ini.bar=foo'
Run Code Online (Sandbox Code Playgroud)