在Ansible中使用lineinfile新增行时如何保留原有行的注释?
正确配置示例
你可以修改任务为以下写法即可实现需求:
- name: 新增行且保留原有注释 lineinfile: path: "/tmp/file" backrefs: yes regexp: "^{{ item | regex_escape }}(.*)" line: '{{ item }}\1' state: present create: yes insertafter: EOF unmatched: append loop: "{{ varlist }}"
改动说明
- 新增
regex_escape过滤器:避免行内容包含正则特殊字符(比如.、*)时匹配逻辑异常 - 新增
unmatched: append参数:这是解决问题的核心配置。开启backrefs: yes时默认匹配不到对应行就不执行任何操作,加这个参数后匹配不到的行会自动追加到文件末尾 - 新增
insertafter: EOF:确保所有新增的行都放在文件结尾,符合常规追加行的使用习惯
原写法问题说明
- 第一次写法没有开启
backrefs,匹配到以对应内容开头的行后会直接整行覆盖,所以注释会被删除 - 第二次写法开启了
backrefs但没加unmatched: append,匹配不到的line4、line5不会被自动新增到文件,无法完成新增行的需求
低版本Ansible兼容方案
如果你使用的Ansible版本低于2.11(无unmatched参数),可以拆分为两个任务实现相同效果:
# 保留现有带注释的行不修改 - name: 保留现有带注释的行 lineinfile: path: "/tmp/file" regexp: "^{{ item | regex_escape }}(.*)" line: '{{ item }}\1' backrefs: yes state: present loop: "{{ varlist }}" # 追加不存在的新行 - name: 追加不存在的新行 lineinfile: path: "/tmp/file" line: "{{ item }}" state: present create: yes insertafter: EOF regexp: "^{{ item | regex_escape }}" loop: "{{ varlist }}"
内容的提问来源于stack exchange,提问作者user9984443
相关产品推荐
相关产品推荐

