Ansible 在sudo 配置中的运用lineinfile

Ansible 确实在大量机器管理和运维中发挥了重大效率:

先学习一下概念:

常用参数

path参数 :必须参数,指定要操作的文件。

line参数 : 使用此参数指定文本内容。

regexp参数 :使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。

state参数:当想要删除对应的文本时,需要将state参数的值设置为absent,absent为缺席之意,表示删除,state的默认值为present。

backrefs参数:默认情况下,当根据正则替换文本时,即使regexp参数中的正则存在分组,在line参数中也不能对正则中的分组进行引用,除非将backrefs参数的值设置为yes。backrefs=yes表示开启后向引用,这样,line参数中就能对regexp参数中的分组进行后向引用了,这样说不太容易明白,可以参考后面的示例命令理解。backrefs=yes除了能够开启后向引用功能,还有另一个作用,默认情况下,当使用正则表达式替换对应行时,如果正则没有匹配到任何的行,那么line对应的内容会被插入到文本的末尾,不过,如果使用了backrefs=yes,情况就不一样了,当使用正则表达式替换对应行时,同时设置了backrefs=yes,那么当正则没有匹配到任何的行时,则不会对文件进行任何操作,相当于保持原文件不变。

insertafter参数:借助insertafter参数可以将文本插入到“指定的行”之后,insertafter参数的值可以设置为EOF或者正则表达式,EOF为End Of File之意,表示插入到文档的末尾,默认情况下insertafter的值为EOF,如果将insertafter的值设置为正则表达式,表示将文本插入到匹配到正则的行之后,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略。

insertbefore参数:借助insertbefore参数可以将文本插入到“指定的行”之前,insertbefore参数的值可以设置为BOF或者正则表达式,BOF为Begin Of File之意,表示插入到文档的开头,如果将insertbefore的值设置为正则表达式,表示将文本插入到匹配到正则的行之前,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略。

backup参数:是否在修改文件之前对文件进行备份。(这一点很重要且高效)

create参数 :当要操作的文件并不存在时,是否创建对应的文件。
 

先来看看ansible 的lineinfile 这个模块

1: 先来看一个测试:(Adding Line)

  Client 端: cd /root/david,

cat sudo.cfg 查看一下里面的内容:

显示只有sheng,OK, 下面开始实验:

 step1: 先备份; ansible all -m shell -a 'cp -pi  /root/david/sudo.cfg /root/david/sudo.cfg_20190404'

step2: 在最后增加一行:

ansible all -m lineinfile -a 'path=/root/david/sudo.cfg line="This is very useful command in sudo configration task"'

step3: 查看一下:ansible all -m shell -a 'cat /root/david/sudo.cfg'

test1 | CHANGED | rc=0 >>
david

This is very useful command in sudo configration task

测试完成。

 ---

好,下面来说说ansible 的lineinfile 的其他应用:

下面来测试一下替换关键字是: regexp:

Step1: 先备份:ansible all -m shell -a 'cp -pi  /root/david/sudo.cfg /root/david/sudo.cfg_20190404'

Step2: 替换:

[root@oc2246430752 ~]# ansible all -m lineinfile -a 'path=/root/david/sudo.cfg regexp="^sudo" line="Studying is an ability"'
test1 | CHANGED => {
    "backup": "",
    "changed": true,
    "msg": "line added"
}

结果是: line added: 因为没有找到以sudo 开头的line, 上面的sudo 是在中间,查看一下内容:

step3:

[root@oc2246430752 ~]# ansible all -m shell -a 'cat /root/david/sudo.cfg'
test1 | CHANGED | rc=0 >>
david

This is very useful command in sudo configration task
Studying is an ability

step4: 继续测试:

[root@oc2246430752 ~]# ansible all -m lineinfile -a 'path=/root/david/sudo.cfg regexp="^This" line="Script makes working easy"'test1 | CHANGED => {
    "backup": "",
    "changed": true,
    "msg": "line replaced"
}

Step5: 查看一下结果:

[root@oc2246430752 ~]# ansible all -m shell -a 'cat /root/david/sudo.cfg'
test1 | CHANGED | rc=0 >>
david

Script makes working easy
Studying is an ability

-----

说完了lineinfile 的增加和替换,下面来说说有特殊要求的增加:

删除一行,并且对原文件进行备份:

[root@oc2246430752 ~]# ansible all -m lineinfile -a 'path=/root/david/sudo.cfg regexp="^david" state=absent backup=yes'
test1 | CHANGED => {
    "backup": "/root/david/sudo.cfg.9880.2019-04-04@03:36:11~",
    "changed": true,
    "found": 1,
    "msg": "1 line(s) removed"
}

好,测试成功,下面进行特殊的行的增加:

ansible all -m lineinfile -a 'path=/root/david/sudo.cfg insertbefore='^Study' line="hello 2019" '
test1 | CHANGED => {
    "backup": "",
    "changed": true,
    "msg": "line added"

检查一下内容:

 ansible all -m shell -a 'cat /root/david/sudo.cfg'
test1 | CHANGED | rc=0 >>

Script makes working easy
hello 2019
Studying is an ability

可以结合regexp参数和insertbefore参数达到条件判断。修改某个文件,如果文件中没有此行,则在某行前/后插入。如果有,则修改为新内容。

猜你喜欢

转载自blog.csdn.net/shenghuiping2001/article/details/89022834
今日推荐