Ansible blockinfile 替换除块之外的所有内容

Ansible blockinfile replace everything except a block

我正在尝试使用 Ansible blockinfile 替换除特殊块之外的所有内容。可以安全地假设这个特殊块位于文件的开头。

ansible之前的文件内容运行:

# BEGIN SPECIAL
blah
# END OF SPECIAL
... bunch of configs

ansible 后的预期文件内容运行:

# BEGIN SPECIAL
blah
# END OF SPECIAL
[MY REPLACED CONFIGS]

使用 blockinfile 标记有两个问题。

  1. marker_startmarker_end 不支持正则表达式
  2. 无法将 EOF 指定为 marker_end

我的任务:

- name: testing replacing file
  blockinfile:
    path: /tmp/testfile
    marker: "{mark}"
    marker_begin: "# END OF SPECIAL" 
    marker_end: EOF
    block: "[MY REPLACED CONFIGS]"
    state: present

这似乎并不能解决问题。有没有办法用 blockinfile 实现这个?

问:"有没有办法用 blockinfile 实现这个?"

A: 不行。模块blockinfile不能改变块外的内容。相反,一个简单的模板就可以完成这项工作。例如,给定变量

    begin: "# BEGIN SPECIAL"
    end: "# END OF SPECIAL"
    block2: "[MY REPLACED CONFIGS]"

读块

    - command: "sed -n '/{{ begin }}/,/{{ end }}/p' tmp/testfile"
      register: result
    - set_fact:
        block1: "{{ result.stdout_lines[1:-1]|join('\n') }}"

给予

  block1: blah

现在,将所有元素放在一起

    - copy:
        dest: tmp/testfile
        content: |
          {{ begin }}
          {{ block1 }}
          {{ end }}
          {{ block2 }}

给予

shell> cat tmp/testfile
# BEGIN SPECIAL
blah
# END OF SPECIAL
[MY REPLACED CONFIGS]