Skip to content
章节导航

lineinfile 模块

lineinfile 模块用于管理文本文件中的行。

该模块用于确保一个特定的行在一个文件中或者使用一个正则表达式替换一个现有的行。

  • 如果想要改变文件中相似的多行,可以使用 replace 模块。
  • 如果想要插入、更新、删除一个行块,可以使用 blockinfile 模块。

常用参数

参数名是否必须参数类型默认值说明
path必须path/string要修改的文件,也可以使用 destdestfilename
regexpstring用于搜索文件中的每一行的正则表达式。对于 state=present 所匹配的行中的最后一行会被替换;对于 state=present 会删除所有匹配的行
statestringpresent用于设置 新增或替换一行,还是删除行
groupstring设置文件/目录的所属组
ownerstring设置文件/目录的所属
linestring要插入或者替换的行。如果设置了backrefs参数,那么line中可以包含位置分组或命名分组,lineinfile模块会使用regexp捕获的分组填充它们
mode设置文件权限,模式实际上是八进制数字(如0644),少了前面的零可能会有意想不到的结果。从版本1.8开始,可以将模式指定为符号模式(例如 u+rwxu=rw,g=r,o=r
createbooleanno与state=present一起使用。如果指定了这个参数,当要修改的文件不存在的时候,会创建它。否则会报错。

更多参数可以使用命令 ansible-doc -s lineinfile 获取更多使用相关的文档或者查看官方文档

一些示例

文件存在则添加行

/etc/hosts 里添加一行 127.0.0.1 curder.com(多次执行,不会重复添加),示例如下:

bash
ansible all -i src/inventory.yml -m lineinfile -a "path=/etc/hosts line='127.0.0.1 curder.com'"

修改匹配行

确保 SELinux 设置为禁用模式

bash
ansible all -i src/inventory.yml -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line=SELINUX=disabled"

删除匹配行

确保 wheel 组不在 sudoers 配置中

bash
ansible all -i src/inventory.yml -m lineinfile -a "path=/etc/sudoers regexp='^%wheel' state=absent"

匹配行前或后添加内容

假如有 /etc/httpd.conf 文件内容如下:

txt
Listen 127.0.0.1:80
Listen 80
Port

在匹配行前添加行

在文件的 Listen 80 前面添加一行 Listen 8080,示例如下:

bash
ansible all -i src/inventory.yml -m lineinfile -a "path=/etc/httpd.conf insertbefore='Listen 80' line='Listen 8080'"

在匹配行后添加

Port 后面添加一行 just for test.,示例如下:

bash
ansible all -i src/inventory.yml -m lineinfile -a "path=/etc/httpd.conf insertafter='Port' line='just for test.'"

修改文件内容及权限

假如服务器上 /etc/hosts 文件内容如下:

txt
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

将以 127.0.0.1 开头的行替换为 127.0.0.1 localhost,并将文件的属主和属组都修改为 root,权限改为 644,如下:

bash
ansible all -i src/inventory.yml -m lineinfile -a "path=/etc/hosts regexp='^127\.0\.0\.1' line='127.0.0.1 localhost' owner=root group=root mode='0644'"

删除一行内容

假如服务器上 /etc/hosts 文件内容如下:

txt
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

删除以 ::1 开头的行:

bash
ansible all -i src/inventory.yml -m lineinfile -a "path=/etc/hosts regexp='^::1' state=absent"

存在匹配行时修改否则添加

示例原文件 /tmp/test.txt 内容如下:

txt
# %wheel   ALL=(ALL)   ALL

匹配以 %wheel 开头的行,匹配到,则执行替换,未匹配,则添加。因为原文件中,没有以 %wheel 开头的行,所以会添加一行:

bash
ansible all -i src/inventory.yml -m lineinfile -a "path=/tmp/test.txt regexp='^%wheel' line='%wheel  ALL=(ALL)       NOPASSWD: ALL'"

执行完上面的命令后,得到修改后的文件是:

txt
# %wheel  ALL=(ALL)       NOPASSWD: ALL
%wheel  ALL=(ALL)       NOPASSWD: ALL