一、前言:
lineinfile模块,功能有点类似sed
常用功能:对文件的行替换、插入、删除
解析:
替换/插入:如果有重复的,都是匹配最后一个 ,
如果不加backrefs项, 替换/插入如无匹配者,则将line所指定的行插入到文件的末尾
删除:如果有重复的,全部删除
二、常用参数:
path/dest: 目标文件绝对路径+文件名,必须参数
line: 替换/插入的内容
regexp: 待匹配内容
insertbefore: 匹配行前面插入
insertafter: 匹配行面插入
state: 删除匹配行,需要将值设为absent,默认值present。
backup: 是否在修改文件之前对文件进行备份。 yes/no
create: 当要操作的文件并不存在时,是否创建对应的文件。yes/no
backrefs:yes/no
1.backrefs为no时,如果没有匹配,则添加一行line。如果匹配了,则把匹配内容替被换为line内容。
2.backrefs为yes时,如果没有匹配,则文件保持不变。如果匹配了,把匹配内容替被换为line内容。
三、实验环境
ansible主机: node2 192.168.199.202
文件主机: node1 192.168.199.201
3.1 ansible设置
[root@node2 ~]# tail -n2 /etc/ansible/hosts
[node]
192.168.199.201
执行剧本命令:
ansible-playbook lineinfile.yml
3.2 node1 上实验文件如下:
[root@node1 ~]# cat line.txt
#*.* @@remote-host:514
1111111111111111111111
aaaaaaaaaaaaaaaaaaaaaa
cccccccccccccccccccccc
# ### end of the forwarding rule ###
5555555555555555555555
四、举个栗子:
4.1 编辑剧本(node2)
vim lineinfile.yml
---
- hosts: node
gather_facts: no
become: yes
become_method: sudo
4.2 备份文件
tasks:
- name: 'backup file'
lineinfile:
path: /root/line.txt
backup: yes
line: state=present
node1
结果如图:
解释:
- 这里的line.txt.115922才是原文件
- line.txt是新文件,并且在最后会多一行:
state=present
4.3 替换整行
tasks:
- name: 'replace'
lineinfile:
path: /root/line.txt
regexp: '#*.* @@remote-host:514'
line: '此行已被我替换了'
node1
结果如图:
4.4 在匹配行前面插入
tasks:
- name: '在匹配行前面插入'
lineinfile:
path: /root/line.txt
insertbefore: 'aaaaaaaaaaaaaaaaaaaaaa'
line: '成功在匹配行前面插入一行'
node1
结果如图:
4.5 在匹配行后面插入
tasks:
- name: "在匹配行后面插入"
lineinfile:
dest: /root/line.txt
insertafter: 'aaaaaaaaaaaaaaaaaaaaaa'
line: 成功在匹配行后面插入一行
node1
结果如图:
4.6 删除匹配行
这里临时在测试文件结尾追加一行:J+sZc_j!s@#x
用于验证在特殊符号下,需要转义
tasks:
- name: '删除匹配行'
lineinfile:
dest: /root/line.txt
regexp: 'J\+sZc\_j\!s\@\#x'
state: absent
node1
结果如图:
4.7 没有匹配行情况下添加一行
在没有匹配行add a line!
的情况下,添加行,并且添加在文件末尾
并且如果重复执行,追加的内容也只有一行,很适用于在文末追加一行内容
tasks:
- name: 'add a line'
lineinfile:
dest: /root/line.txt
regexp: 'add a line!'
line: '我出现代表没有匹配项'
node1
结果如图:
4.8 在4.7的基础上添加backrefs: yes,则不会在文末追加
tasks:
- name: 'backrefs'
lineinfile:
dest: /root/line.txt
backrefs: yes
regexp: 'add a line~~~'
line: '没有匹配项我不会出现在文件中'
node1
结果如图:(可以看到文件内容未变)
4.9 新建文件
tasks:
- name: 'create'
lineinfile:
dest: /root/test.txt
create: yes
line: state=present
node1
结果如图: