如何用Ansible blockinfile替换特殊块以外的全部文件内容
原生 blockinfile 模块无法直接实现你的需求,该模块的标记(marker)仅支持固定字符串匹配,既不支持正则表达式,也不支持将EOF设为结束标记。
推荐使用更简单的方案实现需求,不需要依赖blockinfile:
因为你已经明确特殊块固定在文件开头,只需要先提取出开头的特殊块,再将「特殊块+你要替换的配置内容」整体覆盖写入原文件即可,任务示例如下:
- name: 读取目标文件内容 slurp: path: /tmp/testfile register: file_content - name: 提取开头固定的特殊块 set_fact: special_block: "{{ file_content.content | b64decode | regex_search('^# BEGIN SPECIAL[\\s\\S]*?# END OF SPECIAL', multiline=True) }}" - name: 写入最终文件内容 copy: path: /tmp/testfile content: | {{ special_block }} [MY REPLACED CONFIGS]
如果必须使用blockinfile实现,也可以采用变通方案,先手动给文件添加可识别的结束标记,再执行替换:
- name: 在文件末尾插入自定义结束标记 lineinfile: path: /tmp/testfile line: "# CUSTOM_EOF_MARKER" insertafter: EOF - name: 替换特殊块之后的所有内容 blockinfile: path: /tmp/testfile marker: "{mark}" marker_begin: "# END OF SPECIAL" marker_end: "# CUSTOM_EOF_MARKER" block: "[MY REPLACED CONFIGS]" state: present - name: 清理自定义结束标记 lineinfile: path: /tmp/testfile line: "# CUSTOM_EOF_MARKER" state: absent
注意该变通方案存在限制:如果原文件内容中存在和自定义结束标记相同的字符串,会导致匹配错误,稳定性不如第一种方案。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

