【问题标题】:Ansible blockinfile replace everything except a blockAnsible blockinfile 替换除块之外的所有内容
【发布时间】:2021-11-27 19:41:15
【问题描述】:

我正在尝试使用 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 实现这一点?

【问题讨论】:

    标签: ansible ansible-template


    【解决方案1】:

    问:有没有办法使用 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]
    

    【讨论】:

      猜你喜欢
      • 2013-12-26
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      • 2017-08-26
      • 2012-07-31
      • 2018-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多