You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 23:24:09