如何使用Ansible向文件开头幂等性添加多行文本?
如何幂等性地向文件顶部添加Ansible管理注释?
需要向文件顶部添加以下内容:
# # Ansible managed #
试过的方法都有问题
1. lineinfile模块
能添加内容,但每次执行都会重复插入,不具备幂等性:
- ansible.builtin.lineinfile: path: /some/file regexp: "^#\\n# Ansible managed\\n#\\n" line: "#\\n# Ansible managed\\n#\\n" insertbefore: BOF
2. blockinfile模块
内容被莫名加到文件中间,同样会重复添加:
- ansible.builtin.blockinfile: path: /some/file marker: "" marker_begin: "" marker_end: "" insertbefore: "^#\\n# Ansible managed\\n#\\n" block: | # # Ansible managed #
3. replace模块
直接搞坏文件,把注释块加到了每一行前面:
- ansible.builtin.replace: path: /some/file regexp: "^(?:#\\n# Ansible managed\\n#\\n)?(.*)$" replace: '#\\n# Ansible managed\\n#\\n\\1'
正确的实现方式
方法一:用replace模块实现幂等添加
推荐用这个方法,通过正则负向前瞻判断文件开头是否已有目标注释,只有不存在时才添加,保证幂等性:
- ansible.builtin.replace: path: /some/file regexp: '^(?!#\n# Ansible managed\n#\n)' replace: | # # Ansible managed # \0
原理:正则^(?!#\n# Ansible managed\n#\n)会匹配不以目标注释块开头的文件起始位置,替换时把注释块放在最前面,\0代表原文件的全部内容,这样只会在首次执行时添加,后续执行不会重复操作。
方法二:用lineinfile逐行处理(繁琐但直观)
逐行检查并插入注释的每一行,确保每行只存在一次:
- name: 添加Ansible管理注释第一行 ansible.builtin.lineinfile: path: /some/file regexp: '^#$' line: '#' insertbefore: BOF - name: 添加Ansible管理注释第二行 ansible.builtin.lineinfile: path: /some/file regexp: '^# Ansible managed$' line: '# Ansible managed' insertafter: '^#$' - name: 添加Ansible管理注释第三行 ansible.builtin.lineinfile: path: /some/file regexp: '^#$' line: '#' insertafter: '^# Ansible managed$'
内容的提问来源于stack exchange,提问作者lonix
相关产品推荐
相关产品推荐

