Ansible lineinfile 模块:精准修改配置文件
lineinfile 对配置文件做外科手术式修改:正则定位行、存在性保证(幂等)、改参数/加条目/注释弃用项。本文覆盖基础操作、正则技巧、实战示例与最佳实践。
直接回答:lineinfile 是 Ansible 的精准修改模块——确保某行以特定形式存在(或不存在),用正则定位、只动目标行、保留文件其余内容。改配置参数、加 hosts 条目、注释弃用项这类"改动要小且准"的场景是它的主场;幂等性天然内置,重复执行不重复添加。
工作机制
按正则搜匹配行:找到 → 默认替换最后一个匹配行为指定内容;没找到 → 插入(默认文件末尾,insertafter/insertbefore 控制位置)。state: absent 则反向删除。
基础操作
- name: 确保配置项存在且值正确
ansible.builtin.lineinfile:
path: /etc/ssh/sshd_config
regexp: '^#?PasswordAuthentication'
line: 'PasswordAuthentication no'
backup: true
validate: '/usr/sbin/sshd -t -f %s'
- name: 加 hosts 条目
ansible.builtin.lineinfile:
path: /etc/hosts
line: '192.168.1.50 db.internal'
- name: 删除弃用配置
ansible.builtin.lineinfile:
path: /etc/app/config.ini
regexp: '^legacy_mode='
state: absent
执行 SSH 配置变更前,先以公钥新开第二个会话验证可登录,保留当前连接并准备带外控制台/回退。上述是任务片段,需提权;Match 块、Include 文件及重复项会影响最终生效值,应用前检查 sshd -T(存在 Match 时带相应 -C 条件),验证后才重载服务。
注意 sshd_config 例子的 ^#?——匹配可能被注释掉的现有行,否则会在文件末尾新插一行而旧注释行还在。
进阶技巧
backrefs: true+ 捕获组:只改值保留行内其他内容- insertafter 只决定插入位置,不限制 regexp 搜索范围;多节同名键优先使用 community.general.ini_file
- validate 使用 %s 指代临时文件,如 /usr/sbin/sshd -t -f %s;语法通过不代表不会失去登录权限
最佳实践
- 正则尽量锚定行首行尾(
^...$),防误匹配 - 整文件归你管时用 template 而非 lineinfile——lineinfile 适合"与系统/其他工具共享的文件"
- 改前
backup: true留后路
常见问题(FAQ)
Q:lineinfile 和 template 怎么分工?
A:文件完全由你管理 → template(整体渲染,一致性最强);文件被系统/包管理器/其他工具共同维护 → lineinfile(只动你的那一行)。
Q:重复执行会插入重复行吗?
A:不会——幂等是核心设计:正则匹配到目标行就替换而不是新增。前提是 regexp 能匹配你写入的 line。
Q:一个文件要改多处怎么办?
A:多处修改用 loop 循环多个 lineinfile 任务;改动超过 3-5 处,是时候考虑 template 了。
官方参考
本文依据官方文档整理,示例未在本文中进行运行验证。生产部署需按所用版本、权限和实际负载验证。