ansible常用模块学习之文本操作

1 blockinfile模块

path参数 :必须参数,指定要操作的文件。
block参数 :此参数用于指定我们想要操作的那"一段文本",此参数有一个别名叫"content",使用content或block的作用是相同的。
marker参数 :假如我们想要在指定文件中插入一段文本,ansible会自动为这段文本添加两个标记,一个开始标记,一个结束标记,默认情况下,开始标记为# BEGIN ANSIBLE MANAGED BLOCK,结束标记为# END ANSIBLE MANAGED BLOCK,我们可以使用marker参数自定义"标记",比如,marker=#{mark}test ,这样设置以后,开始标记变成了# BEGIN test,结束标记变成了# END test,没错,{mark}会自动被替换成开始标记和结束标记中的BEGIN和END,我们也可以插入很多段文本,为不同的段落添加不同的标记,下次通过对应的标记即可找到对应的段落。

state参数 : state参数有两个可选值,present与absent,默认情况下,我们会将指定的一段文本"插入"到文件中,如果对应的文件中已经存在对应标记的文本,默认会更新对应段落,在执行插入操作或更新操作时,state的值为

present,默认值就是present,如果对应的文件中已经存在对应标记的文本并且将state的值设置为absent,则表示从文件中删除对应标记的段落。

insertafter参数 :在插入一段文本时,默认会在文件的末尾插入文本,如果你想要将文本插入在某一行的后面,可以使用此参数指定对应的行,也可以使用正则表达式(python正则),表示将文本插入在符合正则表达式的行的后面,如果有多行文本都能够匹配对应的正则表达式,则以最后一个满足正则的行为准,此参数的值还可以设置为EOF,表示将文本插入到文档末尾。

insertbefore参数 :在插入一段文本时,默认会在文件的末尾插入文本,如果你想要将文本插入在某一行的前面,可以使用此参数指定对应的行,也可以使用正则表达式(python正则),表示将文本插入在符合正则表达式的行的前面,如果有多行文本都能够匹配对应的正则表达式,则以最后一个满足正则的行为准,此参数的值还可以设置为BOF,表示将文本插入到文档开头。

backup参数 :是否在修改文件之前对文件进行备份。

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

例子:
1.在文件末尾追加一段内容,不存在创建文件。

[root@ansible ansible]# ansible test -m blockinfile -a 'path=/root/devopstack block="this is test by suixiaofeng" create=yes' 
192.168.10.21 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "msg": "File created"
}
192.168.10.20 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "msg": "File created"
}

ansible常用模块学习之文本操作
2.自己定义输入的文本的开始结束标记(marker,用户 marker="#{mark}标记内容")
[root@ansible ansible]# ansible test -m blockinfile -a 'path=/root/devopstack block="this is marker test" marker="#{mark} this is marker test"'
192.168.10.21 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "msg": "Block inserted"
}
192.168.10.20 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "msg": "Block inserted"
}

ansible常用模块学习之文本操作
3.删除对应标记的文本块
 ansible test -m blockinfile -a 'path=/root/devopstack  marker="#{mark} this is marker test"  state=absent'

ansible常用模块学习之文本操作
4.将文本块插入到文档的开头
[root@ansible ansible]# ansible test -m blockinfile -a 'path=/root/devopstack block="thisis start" marker="#{mark}##########*********########" insertbefore=BOF'

ansible常用模块学习之文本操作
5.将文本块插入到文档的结尾
[root@ansible ansible]# ansible test -m blockinfile -a 'path=/root/devopstack block="this is end " marker="#{mark}***************" insertafter=EOF'
ansible常用模块学习之文本操作
6.在匹配的行下一行插入
[root@ansible ansible]# ansible test -m blockinfile -a 'path=/root/devopstack block="test test " marker="#{mark}######VVVVV#####" insertafter="^#!/bin/bash"  backup=yes'

ansible常用模块学习之文本操作
7.在匹配行的后面加一行,并且加注释(注释可以是#或者其他)
[root@ansible roles]# ansible test -m blockinfile -a 'path=/root/baimingdan2 block="nihao" marker="****thisismark****" insertafter="world" '
ansible常用模块学习之文本操作

2 lineinfile模块

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参数 :当要操作的文件并不存在时,是否创建对应的文件。 例子如下:
1.插入一行文本到文件中
[root@ansible roles]# ansible  test -m lineinfile -a 'path=/root/baimingdan line="thisis lineinfile test"'

ansible常用模块学习之文本操作
2.替换匹配行内容
[root@ansible roles]# ansible  test -m lineinfile -a 'path=/root/baimingdan regexp="thisis" line="TEST" '

ansible常用模块学习之文本操作
3.替换匹配行,如果有多行,替换最后一行,没有的话不提换。
[root@ansible roles]# ansible test -m lineinfile -a 'path=/root/baimingdan regexp="bejingjinka" line="hellow world" backrefs=yes'
ansible常用模块学习之文本操作
4.根据line内容进行删除(必须是整行内容),多行匹配到的话都会被删除
[root@ansible roles]# ansible test -m lineinfile -a 'path=/root/baimingdan line="TEST" state=absent'

ansible常用模块学习之文本操作
5.根据正则表达式匹配删除,多行匹配的话都会被删除
[root@ansible roles]# ansible test -m lineinfile -a 'path=/root/baimingdan regexp="allow" state=absent'

ansible常用模块学习之文本操作
6.在匹配的行前加入一行
[root@ansible roles]# ansible test -m lineinfile -a 'path=/root/baimingdan line="thiihhh" insertbefore="world"'

ansible常用模块学习之文本操作

3 find模块

paths参数 :必须参数,指定在哪个目录中查找文件,可以指定多个路径,路径间用逗号隔开,此参数有别名,使用别名path或者别名name可以代替paths。
recurse参数 :  默认情况下,只会在指定的目录中查找文件,也就是说,如果目录中还包含目录,ansible并不会递归的进入子目录查找对应文件,如果想要递归的查找文件,需要使用recurse参数,当recurse参数设置为yes时,表示在指定目录中递归的查找文件。
hidden参数 :默认情况下,隐藏文件会被忽略,当hidden参数的值设置为yes时,才会查找隐藏文件。
file_type参数 :  默认情况下,ansible只会根据条件查找"文件",并不会查找"目录"或"软链接"等文件类型,如果想要指定查找的文件类型,可以通过file_type指定文件类型,可指定的文件类型有any、directory、file、link 四种。
patterns参数 : 使用此参数指定需要查找的文件名称,支持使用shell(比如通配符)或者正则表达式去匹配文件名称,默认情况下,使用shell匹配对应的文件名,如果想要使用python的正则去匹配文件名,需要将use_regex参数的值设置为yes。
use_regex参数:默认情况下,find模块不会使用正则表达式去解析patterns参数中对应的内容,当use_regex设置为yes时,表示使用python正则解析patterns参数中的表达式,否则,使用glob通配符解析patterns参数中的表达式。
contains参数:使用此参数可以根据文章内容查找文件,此参数的值为一个正则表达式,find模块会根据对应的正则表达式匹配文件内容。
age参数 :使用此参数可以根据时间范围查找文件,默认以文件的mtime为准与指定的时间进行对比,比如,如果想要查找mtime在3天之前的文件,那么可以设置age=3d,如果想要查找mtime在3天以内的文件,可以设置age=-3d,这里所说的3天是按照当前时间往前推3天,可以使用的单位有秒(s)、分(m)、时(h)、天(d)、星期(w)。
age_stamp参数 :文件的时间属性中有三个时间种类,atime、ctime、mtime,当我们根据时间范围查找文件时,可以指定以哪个时间种类为准,当根据时间查找文件时,默认以mtime为准。
size参数 :使用此参数可以根据文件大小查找文件,比如,如果想要查找大于3M的文件,那么可以设置size=3m,如果想要查找小于50k的文件,可以设置size=-50k,可以使用的单位有t、g、m、k、b。
get_checksum参数 :当有符合查找条件的文件被找到时,会同时返回对应文件的sha1校验码,如果要查找的文件比较大,那么生成校验码的时间会比较长。

例子:
1.匹配包含特定字符串的文件,不匹配隐藏文件及不会递归匹配
}
[root@ansible roles]# ansible test -m find -a 'paths=/root contains="HHH"' |grep path
            "path": "/root/baimingdan2", 
            "path": "/root/baimingdan", 
            "path": "/root/baimingdan", 
2.匹配包含特殊字符的文件,不匹配隐藏文件,匹配递归
[root@ansible roles]# ansible test -m find -a 'paths=/root contains="HHHH"  recurse=yes'  |grep path
            "path": "/root/baimingdan", 
            "path": "/root/baimingdan2", 
            "path": "/root/baimingdan", 
            "path": "/root/test/baimingdan", 
3.查找以.sh结尾的文件名,匹配隐藏文件,匹配递归目录。(支持shell和正则表达式[需结合use_regex])
[root@ansible roles]# ansible test -m find -a 'paths=/root patterns="*sh" hidden=yes recurse=yes ' |egrep "path|SUCCESS"
192.168.10.21 | SUCCESS => {
            "path": "/root/1.sh", 
            "path": "/root/.1.sh", 
            "path": "/root/harbor/install.sh", 
            "path": "/root/harbor/common.sh", 
            "path": "/root/adserver/ad-script-datafix/hit_fix.sh", 
192.168.10.20 | SUCCESS => {
            "path": "/root/gitlab/bin/pkgr_before_precompile.sh", 
            "path": "/root/gitlab/lib/support/deploy/deploy.sh", 
            "path": "/root/gitlab/scripts/create_postgres_user.sh", 
            "path": "/root/gitlab/scripts/lint-conflicts.sh", 
            "path": "/root/gitlab/scripts/lint-doc.sh", 
            "path": "/root/gitlab/scripts/prepare_build.sh", 
            "path": "/root/gitlab/scripts/prepare_postgres_fdw.sh", 
            "path": "/root/gitlab/scripts/schema_changed.sh", 
            "path": "/root/gitlab/scripts/utils.sh", 
            "path": "/root/gitlab/scripts/frontend/check_dependencies.sh", 
            "path": "/root/gitlab/scripts/review_apps/review-apps.sh", 
4.匹配以.sh结尾的文件名,patterns对应的表达式为正则表达式,包含所有文件类型,包含隐藏文件
[root@ansible roles]# ansible test -m find -a 'paths=/root patterns=".*\.sh" use_regex=yes file_type=any hidden=yes' |egrep  "SUCCESS|path"
192.168.10.21 | SUCCESS => {
            "path": "/root/1.sh", 
            "path": "/root/.1.sh", 

5.匹配以.sh结尾的文件名,patterns对应的表达式为正则表达式,包含所有文件类型,包含隐藏文件,递归查询
[root@ansible roles]# ansible test -m find -a 'paths=/root patterns=".*\.sh$" use_regex=yes file_type=any hidden=yes recurse=yes' |egrep  "SUCCESS|path"
192.168.10.21 | SUCCESS => {
            "path": "/root/1.sh", 
            "path": "/root/.1.sh", 
            "path": "/root/harbor/install.sh", 
            "path": "/root/harbor/common.sh", 
            "path": "/root/adserver/ad-script-datafix/hit_fix.sh", 
192.168.10.20 | SUCCESS => {
            "path": "/root/gitlab/bin/pkgr_before_precompile.sh", 
            "path": "/root/gitlab/lib/support/deploy/deploy.sh", 
            "path": "/root/gitlab/scripts/create_postgres_user.sh", 
            "path": "/root/gitlab/scripts/lint-conflicts.sh", 
            "path": "/root/gitlab/scripts/lint-doc.sh", 
            "path": "/root/gitlab/scripts/prepare_build.sh", 
            "path": "/root/gitlab/scripts/prepare_postgres_fdw.sh", 
            "path": "/root/gitlab/scripts/schema_changed.sh", 
            "path": "/root/gitlab/scripts/utils.sh", 
            "path": "/root/gitlab/scripts/frontend/check_dependencies.sh", 
            "path": "/root/gitlab/scripts/review_apps/review-apps.sh", 
6.查询一天以内创建的文件,递归查询
[root@ansible roles]# ansible test -m find -a 'paths=/root age=-1d recurse=yes' |egrep "SUCCESS|path"
192.168.10.21 | SUCCESS => {
            "path": "/root/baimingdan2", 
            "path": "/root/1.sh", 
            "path": "/root/baimingdan", 
            "path": "/root/test/baimingdan", 
            "path": "/root/.ansible/tmp/ansible-tmp-1597132061.83-55202-82288430793942/AnsiballZ_find.py", 
192.168.10.20 | SUCCESS => {
            "path": "/root/baimingdan", 
            "path": "/root/.ansible/tmp/ansible-tmp-1597132061.83-55203-32629676691815/AnsiballZ_find.py", 
7.查询当前目录下两天以内变更的文件
[root@ansible roles]# ansible test -m find -a 'paths=/root age=-2d' |egrep "SUCC|path"
192.168.10.20 | SUCCESS => {
            "path": "/root/baimingdan", 
192.168.10.21 | SUCCESS => {
            "path": "/root/baimingdan2", 
            "path": "/root/1.sh", 
            "path": "/root/baimingdan", 
8.查询当前目录下大于200M的目录
[root@ansible roles]# ansible test -m find -a "paths=/root size=200m  file_type=directory" | egrep "SUCC|path"
192.168.10.21 | SUCCESS => {
            "path": "/root/harbor", 
            "path": "/root/LuajIT", 
            "path": "/root/redis", 
            "path": "/root/test", 
            "path": "/root/adserver", 
192.168.10.20 | SUCCESS => {
            "path": "/root/gitlab", 
9.查询符合条件的文件的sha1校验码
[root@ansible roles]# ansible test -m find -a 'paths=/root patterns="*.sh"   get_checksum=yes  hidden=yes recurse=yes ' | egrep "SUCC|path|checksum"
192.168.10.21 | SUCCESS => {
            "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", 
            "path": "/root/1.sh", 
            "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", 
            "path": "/root/.1.sh", 
            "checksum": "d36588b24e4d1a1ab5da3509fa898e331b076fab", 
            "path": "/root/harbor/install.sh", 
            "checksum": "971552c01392712cd5c5a1cb955a5337c84adaca", 
            "path": "/root/harbor/common.sh", 
            "checksum": "37bf04f348118ac9d61207b5dfef26356feb2e10", 
            "path": "/root/adserver/ad-script-datafix/hit_fix.sh", 

4 replace模块

replace模块可以根据我们指定的正则表达式替换文件中的字符串,文件中所有被正则匹配到的字符串都会被替换。
path参数 :必须参数,指定要操作的文件,2.3版本之前,只能使用dest, destfile, name指定要操作的文件,2.4版本中,仍然可以使用这些参数名,这些参数名作为path参数的别名使用。
regexp参数 :  必须参数,指定一个python正则表达式,文件中与正则匹配的字符串将会被替换。
replace参数 : 指定最终要替换成的字符串。
backup参数 :是否在修改文件之前对文件进行备份,最好设置为yes。
例子:
替换文本中被匹配到的字符串
[root@ansible roles]# ansible test -m replace -a 'path=/root/baimingdan regexp="bejing"  replace="HHHHHH" backup=yes'

ansible常用模块学习之文本操作

5 user模块

user模块可以帮助我们管理远程主机上的用户,比如创建用户、修改用户、删除用户、为用户创建密钥对等操作。

此处我们介绍一些user模块的常用参数,你可以先对这些参数有一个大概了解,然后再看小示例。

name参数:必须参数,用于指定要操作的用户名称,可以使用别名user。

group参数:此参数用于指定用户所在的基本组

gourps参数:此参数用于指定用户所在的附加组,注意,如果说用户已经存在并且已经拥有多个附加组,那么如果想要继续添加新的附加组,需要结合append参数使用,否则在默认情况下,当再次使用groups参数设置附加组时,用户原来的附加组会被覆盖。

append参数:如果用户原本就存在多个附加组,那么当使用groups参数设置附加组时,当前设置会覆盖原来的附加组设置,如果不想覆盖原来的附加组设置,需要结合append参数,将append设置为yes,表示追加附加组到现有的附加组设置,append默认值为no。

shell参数:此参数用于指定用户的默认shell

uid参数:此参数用于指定用户的uid号

expires参数:此参数用于指定用户的过期时间,相当于设置/etc/shadow文件中的的第8列,比如,你想要设置用户的过期日期为2018年12月31日,那么你首先要获取到2018年12月31日的unix时间戳,使用命令"date -d 2018-12-31 +%s"获取到的时间戳为1546185600,所以,当设置expires=1546185600时,表示用户的过期时间为2018年12月31日0点0分,设置成功后,查看远程主机的/etc/shadow文件,对应用户的第八列的值将变成17895(表示1970年1月1日到2018年12月31日的天数,unix时间戳的值会自动转换为天数,我们不用手动的进行换算),目前此参数只支持在Linux和FreeBSD系统中使用。

comment参数:此参数用于指定用户的注释信息

state参数:此参数用于指定用户是否存在于远程主机中,可选值有present、absent,默认值为present,表示用户需要存在,当设置为absent时表示删除用户。

remove参数:当state的值设置为absent时,表示要删除远程主机中的用户,但是在删除用户时,不会删除用户的家目录等信息,这是因为remoove参数的默认值为no,如果设置为yes,在删除用户的同时,会删除用户的家目录,当state=absent并且remove=yes时,相当于执行"userdel --remove"命令

password参数:此参数用于指定用户的密码,但是这个密码不能是明文的密码,而是一个对明文密码"加密后"的字符串,相当于/etc/shadow文件中的密码字段,是一个对明文密码进行哈希后的字符串,你可以在python的命令提示符下输入如下命令,生成明文密码对应的加密字符串。

import crypt; crypt.crypt('666666')

输入上述命令后,即可得到明文密码666666对应的加密字符串。

update_password参数:此参数有两个值可选,always和on_create,当此参数的值设置为always时表示,如果password参数设置的值与用户当前的加密过的密码字符串不一致,则直接更新用户的密码,默认值即为always,但是当此参数设置为on_create时,如果password参数设置的值与用户当前的加密过的密码字符串不一致,则不会更新用户的密码字符串,保持之前的密码设定,如果是新创建的用户,即使此参数设置为on_create,也会将用户的密码设置为password参数对应的值。

generate_ssh_key参数:此参数默认值为no,如果设置为yes,表示为对应的用户生成ssh密钥对,默认在用户家目录的./ssh目录中生成名为id_rsa的私钥和名为id_rsa.pub的公钥,如果同名的密钥已经存在与对应的目录中,原同名密钥并不会被覆盖(不做任何操作).

ssh_key_file参数:当generate_ssh_key参数的值为yes时,使用此参数自定义生成ssh私钥的路径和名称,对应公钥会在同路径下生成,公钥名以私钥名开头,以".pub"结尾。

ssh_key_comment参数:当generate_ssh_key参数的值为yes时,在创建证书时,使用此参数设置公钥中的注释信息,但是如果同名的密钥对已经存在,则并不会修改原来的注释信息,即不做任何操作,当不指定此参数时,默认的注释信息为"ansible-generated on 远程主机的主机名"

ssh_key_passphrase参数:当generate_ssh_key参数的值为yes时,在创建证书时,使用此参数设置私钥的密码,但是如果同名的密钥对已经存在,则并不会修改原来的密码,即不做任何操作

ssh_key_type参数:当generate_ssh_key参数的值为yes时,在创建证书时,使用此参数设置密钥对的类型,默认密钥类型为rsa,但是如果同名的密钥对已经存在,并不会对同名密钥做任何操作

例子:
创建用户设置用户密码
[root@ansible ansible]# python
Python 2.7.5 (default, Apr  2 2020, 13:16:51) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import crypt
>>> crypt.crypt('666666')
'$6$x3kOyQqWK1ahUTGu$GS2QCtqbiIf5yc.7NBzW8Nr26Jk8ffxzIGuF8DQ7i8sKuY/wg/aH60YibEcLVS93ELnLRYBIW/T5mfp.I4/GV1'
>>> crypt.crypt('suixiaofeng')
'$6$ycRj6fCWrNO8B5x9$lVeIZ9NWVw9obZMB69vkq4/R6FLBe/Y9pCdvGxs4VfjPiDSCBeF2Gp0kDvHjUXIL7OF9L4LJvdMbmbiF/OyBR/'
>>> 
[root@ansible ansible]# ansible test -m user -a 'name=gtj password="$6$ycRj6fCWrNO8B5x9$lVeIZ9NWVw9obZMB69vkq4/R6FLBe/Y9pCdvGxs4VfjPiDSCBeF2Gp0kDvHjUXIL7OF9L4LJvdMbmbiF/OyBR/" '
192.168.10.21 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "comment": "", 
    "create_home": true, 
    "group": 1000, 
    "home": "/home/gtj", 
    "name": "gtj", 
    "password": "NOT_LOGGING_PASSWORD", 
    "shell": "/bin/bash", 
    "state": "present", 
    "system": false, 
    "uid": 1000
}

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin
avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: