ansible的lineinfile模块

摘要

该模块用于从一个文件中搜索一行,确保该行存在或删除该行。lineinfile模块主要用于改变一个文件的一行。如果想要改变文件中相似的多行,可以使用replace模块。如果想要插入/更新/删除一个行块,可以使用blockinfile模块。其他情形,可以使用copytemplate模块。


常用选项

  • backrefs
    state=present一起使用。如果打开这个标记,那么在line参数中可以使用 位置分组 和 命名分组,lineinfile模块会使用regexp所捕获的分组填充它们。backrefs会改变模块的一些操作:insertbeforeinsertafter参数会被忽略。当regexp不匹配文件中的任何行时,文件不会做任何修改,否则 使用扩展的line参数 替换 最后一个匹配正则表达式的行。
    (Choices: yes, no)[Default: no]
  • backup
    用于创建一个包含时间戳信息的备份文件。以便在错误的修改了文件的时候,能够找回原始的文件。
    (Choices: yes, no)[Default: no]
  • create
    state=present一起使用。如果指定了这个参数,当要修改的文件不存在的时候,会创建它。否则会报错。
  • dest
    要修改的文件
  • insertbefore
    不能与backrefs=yes一起使用。当regexp不匹配文件中的任何行的时候,会将line参数所指定的行,插入到insertbefore所指定的正则表达式匹配的行中的最后一行的前面,当insertbefore所指定的正则表达式不匹配任何行时,会插入到文件的末尾,同时insertbefore还可以是一个特殊的值:BOF(代表文件的开始);否则,会使用line参数所指定的行 替换 regexp所匹配的行中的最后一行。
  • insertafter
    insertbefore类似,不同的是,insertbefore会将新行插入到其所指定的正则表达式匹配的行中的最后一行的前面,而insertafter是插入到后面。insertafter也支持一个特殊的值:EOF(代表文件的末尾)
  • line
    要插入或者替换的行。如果设置了backrefs参数,那么line中可以包含 位置分组 或 命名分组,lineinfile模块会使用regexp捕获的分组填充它们。
  • mode
    用来指定文件的权限,比如mode=0644mode='a+x'
  • ownergroup
    用来指定文件的属主 和 属组。(可能需要使用-b提权)
  • regexp
    用于搜索文件中的每一行的正则表达式。对于state=present,这个正则表达式所匹配的行中的最后一行会被替换;对于state=present,会删除所有匹配的行。
  • state
    用于设置 新增或替换一行,还是删除行。
    (Choices: present, absent)[Default: present]
  • validate
    用来设置在保存文件之前要执行的校验命令。待校验的文件的路径是通过%s来传递的,并且在validate中必须包含%s。在校验命令中,不能使用shell的一些特性,比如扩展,管道等。

例子:

下面是来自于官方文档的例子:

# 将 /etc/selinux/config 文件中所有匹配 ^SELINUX= 正则表达式的行中的最后一行使用 SELINUX=enforcing 替换;如果regexp不匹配文件中的任何一行,则将line所指定的行插入到文件的末尾 
- lineinfile: dest=/etc/selinux/config regexp=^SELINUX= line=SELINUX=enforcing

# 将 /etc/sudoers 文件中,所有匹配 ^%wheel 的行删除
- lineinfile: dest=/etc/sudoers state=absent regexp="^%wheel"

# 将 /etc/hosts 文件中,所有匹配 ^127\.0\.0\.1 正则表达式的行中的最后一行,替换成 127.0.0.1 localhost,当 ^127\.0\.0\.1 不匹配文件中的任何一行的时候,则将line所指定的行插入到文件的末尾。并将文件的属主设置成root,属组设置成root,将文件的权限设置为0644。
- lineinfile: dest=/etc/hosts regexp='^127\.0\.0\.1' line='127.0.0.1 localhost' owner=root group=root mode=0644

- lineinfile: dest=/etc/httpd/conf/httpd.conf regexp="^Listen " insertafter="^#Listen " line="Listen 8080"

- lineinfile: dest=/etc/services regexp="^# port for http" insertbefore="^www.*80/tcp" line="# port for http by default"

# Add a line to a file if it does not exist, without passing regexp
- lineinfile: dest=/tmp/testfile line="192.168.1.99 foo.lab.net foo"

# Fully quoted because of the ': ' on the line. See the Gotchas in the YAML docs.
- lineinfile: "dest=/etc/sudoers state=present regexp='^%wheel' line='%wheel ALL=(ALL) NOPASSWD: ALL'"

- lineinfile: dest=/opt/jboss-as/bin/standalone.conf regexp='^(.*)Xms(\d+)m(.*)$' line='\1Xms${xms}m\3' backrefs=yes

# Validate the sudoers file before saving
- lineinfile: dest=/etc/sudoers state=present regexp='^%ADMIN ALL\=' line='%ADMIN ALL=(ALL) NOPASSWD:ALL' validate='visudo -cf %s'

说明

  • 本文是在ansible 2.2.1.0下测试的

感谢浏览tim chow的作品!

如果您喜欢,可以分享到: 更多

如果您有任何疑问或想要与tim chow进行交流

可点此给tim chow发信

如有问题,也可在下面留言: