• Ansible常用模块之文件操作


    Ansible模块的基本使用博文中,我们已经介绍了怎样使用模块,而且我们知道,ansible有很多模块,每个模块都有自己的功能,模块涉及到的方向比较多,所以对于个人来说,并没有必要了解所有的模块,我们只需要根据实际的业务场景了解相应的模块即可,而且ansible比较贴心,ansible根据模块的功能对这些模块进行了大致的分类,比如,如果某些模块都是操作文件的,就把它们分类到文件类模块中,如果某些模块都是操作数据库的,就把他们分类到数据库类模块中,那么,ansible把模块分为了哪些类呢?你可以参考官方手册,找到答案,模块的分类目录参考2.4版本中模块分类该链接不仅对模块进行了分类,还给出了每个模块的使用示例,不过这些示例都是编写剧本(playbook)的示例,我们还没有介绍过怎样编写剧本,所以暂时不会参考这些示例,前文的示例中,我们一直以命令的方式运行ansible,通过命令的方式调用模块,这种直接在命令行中运行的ansible命令被称作为ad-hoc命令,我们可以通过ad-hoc命令的方式,快速的了解一个模块。

    Ansible模块的基本使用博文的示例中,我们已经了解了ping模块与fetch模块,那么这篇文章中,我们来了解一些新的模块,这些模块都是常用的操作文件的模块,不过这篇文章写得并不全面,后续有空会继续补充总结!

    一、copy模块

    见名知义,copy模块的作用就是拷贝文件,它与之前介绍的fetch模块类似,不过,fetch模块是从远程主机中拉取文件到ansible主机,而copy模块是将ansible主机上的文件拷贝到远程主机中。

    此处我们介绍一些copy模块的常用参数,然后再给出对应示例。

    • src参数:用于指定需要copy的文件或目录;
    • dest参数:用于指定文件将被拷贝到远程主机的哪个目录中,dest为必须参数;
    • content参数:当不使用src指定拷贝的文件时,可以使用content直接指定文件内容,src与content两个参数必有其一,否则会报错;
    • force参数:当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否强制覆盖,可选值有yes和no,默认值为yes,表示覆盖,如果设置为no,则不会执行覆盖拷贝操作,远程主机中的文件保持不变;
    • backup参数:当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否对远程主机的文件进行备份,可选值有yes和no,当设置为yes时,会先备份远程主机中的文件,然后再将ansible主机中的文件拷贝到远程主机;
    • owner参数:指定文件拷贝到远程主机后的属主,但是远程主机上必须有对应的用户,否则会报错;
    • group参数:指定文件拷贝到远程主机后的属组,但是远程主机上必须有对应的组,否则会报错;
    • mode参数:指定文件拷贝到远程主机后的权限,如果你想将权限设置为rw-r–r–,则可以使用mode=0644表示,如果你想要在user对应的权限位上添加执行权限,则可以使用mode=u+x表示;

    1.1 示例命令

    将ansible主机中/testdir/copytest文件复制到远程主机的/opt目录下,注意,如果copytest文件已经存在于远程主机的/opt目录中,并且远程主机中的copytest与ansible主机中copytest文件内容不同,那么使用如下命令时,远程主机中的copytest文件将被覆盖。

    $ ansible test181 -m copy -a "src=/testdir/copytest dest=/opt/"
    

    在远程主机的/opt目录下生成文件test,test文件中有两行文本,第一行文本为aaa,第二行为bbb,当使用content指定文件内容时,dest参数对应的值必须是一个文件,而不能是一个路径。

    $ ansible test181 -m copy -a 'content="aaa\nbbb\n" dest=/opt/test'
    

    将ansible主机中/testdir/copytest文件复制到远程主机的/opt目录中时,如果远程主机中已经存在/opt/copytest文件,并且文件内容与ansible主机中的copytest文件的内容不一致,则不执行拷贝操作,远程主机中的/opt/copytest文件内容不会被改变。

    $ ansible test181 -m copy -a "src=/testdir/copytest dest=/opt/ force=no"
    

    将ansible主机中/testdir/copytest文件复制到远程主机的/opt目录中时,如果远程主机中已经存在/opt/copytest文件,并且文件内容与ansible主机中的copytest文件的内容不一致,会执行拷贝操作,但是在执行拷贝操作之前,会将远程主机中的原文件重命名,以作备份,然后再进行拷贝操作。

    $ ansible test181 -m copy -a "src=/testdir/copytest dest=/opt/ backup=yes"
    

    拷贝文件时,指定文件的属主,需要注意,远程主机上必须存在对应的用户。

    $ ansible test181 -m copy -a "src=/testdir/copytest dest=/opt/ owner=lvzhenjiang"
    

    拷贝文件时,指定文件的属组,需要注意,远程主机上必须存在对应的组。

    $ ansible test181 -m copy -a "src=/testdir/copytest dest=/opt/ group=lvzhenjiang"
    

    拷贝文件时,指定文件的权限。

    $ ansible test181 -m copy -a "src=/testdir/copytest dest=/opt/ mode=0640"
    

    二、file模块

    file模块可以帮助我们完成一些对文件的基本操作,比如,创建文件或目录、删除文件或目录、修改文件权限等!

    此处我们介绍一些file模块的常用参数,然后再给出对应示例:

    • path参数:必须参数,用于指定要操作的文件或目录,在之前版本的ansible中,使用dest参数或者name参数指定要操作的文件或目录,为了兼容之前的版本,使用dest或name也可以;
    • state参数:此参数非常灵活,此参数对应的值需要根据情况设定,比如,当我们需要在远程主机中创建一个目录的时候,我们需要使用path参数指定对应的目录路径,假设,我想要在远程主机上创建/testdir/a/b目录,那么我则需要设置path=/testdir/a/b,但是,我们无法从/testdir/a/b这个路径看出b是一个文件还是一个目录,ansible也同样无法单单从一个字符串就知道你要创建文件还是目录,所以,我们需要通过state参数进行说明,当我们想要创建的/testdir/a/b是一个目录时,需要将state的值设置为directory,directory为目录之意,当它与path结合,ansible就能知道我们要操作的目标是一个目录,同理,当我们想要操作的/testdir/a/b是一个文件时,则需要将state的值设置为touch,当我们想要创建软链接文件时,需将state设置为link,想要创建硬链接文件时,需要将state设置为hard,当我们想要删除一个文件时(删除时不用区分目标是文件、目录、还是链接),则需要将state的值设置为absent,absent为缺席之意,当我们想让操作的目标”缺席”时,就表示我们想要删除目标;
    • src参数:当state设置为link或者hard时,表示我们想要创建一个软链或者硬链,所以,我们必须指明软链或硬链链接的哪个文件,通过src参数即可指定链接源;
    • force参数:当state=link的时候,可配合此参数强制创建链接文件,当force=yes时,表示强制创建链接文件,不过强制创建链接文件分为两种情况,情况一:当你要创建的链接文件指向的源文件并不存在时,使用此参数,可以先强制创建出链接文件。情况二:当你要创建链接文件的目录中已经存在与链接文件同名的文件时,将force设置为yes,回将同名文件覆盖为链接文件,相当于删除同名文件,创建链接文件。情况三:当你要创建链接文件的目录中已经存在与链接文件同名的文件,并且链接文件指向的源文件也不存在,这时会强制替换同名文件为链接文件;
    • owner参数:用于指定被操作文件的属主,属主对应的用户必须在远程主机中存在,否则会报错;
    • group参数:用于指定被操作文件的属组,属组对应的组必须在远程主机中存在,否则会报错;
    • mode参数:用于指定被操作文件的权限,比如,如果想要将文件权限设置为rw-r-x—,则可以使用mode=650进行设置,或者使用mode=0650,效果也是相同的,如果你想要设置特殊权限,比如为二进制文件设置suid,则可以使用mode=4700,很方便吧;
    • recurse参数:当要操作的文件为目录,将recurse设置为yes,可以递归的修改目录中文件的属性;

    2.1 示例命令

    在test181主机上创建一个名为testfile的文件,如果testfile文件已经存在,则会更新文件的时间戳,与touch命令的作用相同。

     $ ansible test181 -m file -a "path=/testdir/testfile state=touch"
    

    在test181主机上创建一个名为testdir的目录,如果testdir目录已经存在,则不进行任何操作。

    $ ansible test181 -m file -a "path=/testdir/testdir state=directory"
    

    在test181上为testfile文件创建软链接文件,软链接名为linkfile,执行下面命令的时候,testfile已经存在。

    $ ansible test181 -m file -a "path=/testdir/linkfile state=link src=/testdir/testfile"
    

    在test181上为testfile文件创建硬链接文件,硬链接名为hardfile,执行下面命令的时候,testfile已经存在。

    $ ansible test181 -m file -a "path=/testdir/hardfile state=hard src=/testdir/testfile"
    

    在创建链接文件时,如果源文件不存在,或者链接文件与其他文件同名时,强制覆盖同名文件或者创建链接文件,参考上述force参数的解释。

    $ ansible test181 -m file -a "path=/testdir/linkfile state=link src=sourcefile force=yes"
    

    删除远程机器上的指定文件或目录。

    $ ansible test181 -m file -a "path=/testdir/testdir state=absent"
    

    在创建文件或目录的时候指定属主,或者修改远程主机上的文件或目录的属主。

    $ ansible test181 -m file -a "path=/testdir/abc state=touch owner=lvzhenjiang"
    
    $ ansible test181 -m file -a "path=/testdir/abc owner=lvzhenjiang"
    
    $ ansible test181 -m file -a "path=/testdir/abc state=directory owner=lvzhenjiang"
    

    在创建文件或目录的时候指定属组,或者修改远程主机上的文件或目录的属组。

    $ ansible test181 -m file -a "path=/testdir/abb state=touch group=lvzhenjiang"
    
    $ ansible test181 -m file -a "path=/testdir/abb group=lvzhenjiang"
    
    $ ansible test181 -m file -a "path=/testdir/abb state=directory group=lvzhenjiang"
    

    在创建文件或目录的时候指定权限,或者修改远程主机上的文件或目录的权限。

    $ ansible test181 -m file -a "path=/testdir/abb state=touch mode=0644"
    
    $ ansible test181 -m file -a "path=/testdir/abb mode=0644"
    
    $ ansible test181 -m file -a "path=/testdir/binfile mode=4700"
    
    $ ansible test181 -m file -a "path=/testdir/abb state=directory mode=0644"
    

    当操作远程主机中的目录时,同时递归的将目录中的文件的属主属组都设置为lvzhenjiang。

    $ ansible test181 -m file -a "path=/testdir/abd state=directory owner=lvzhenjiang group=lvzhenjiang recurse=yes"
    

    三、blockinfile模块

    blockinfile模块可以帮助我们在指定的文件中插入一段文本,这段文本是被标记过的,换句话说就是,我们在这段文本上做了记号,以便在以后的操作中可以通过标记找到这段文本,然后修改或者删除它,单单这样描述不是特别容易理解,结合下面的小例子动手做做立马就能够明白了。

    此处我们介绍一些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参数:当要操作的文件并不存在时,是否创建对应的文件;

    3.1 示例命令

    为了方便举例,我们将/etc/rc.d/rc.local文件复制到/testdir目录中,以做测试!

    假如,我们想要在test181主机中的/testdir/rc.local文件尾部插入如下两行:

    systemctl start mariadb
    systemctl start httpd
    

    可以使用如下命令:

    $ ansible test181 -m blockinfile -a 'path=/testdir/rc.local block="systemctl start mariadb\nsystemctl start httpd" '
    

    使用path参数指定要操作的文件,使用block参数指定文本块内容,由于我们使用了ad-hoc命令,所以我们使用\n表示换行,在写ansible剧本时则可以直接将文本块写在多行中,但是我们还没有介绍剧本的编写,所以此处不用在意,当执行上述命令后,/testdir/rc.local的文件尾部会多出如下文本块:

    # BEGIN ANSIBLE MANAGED BLOCK
    systemctl start mariadb
    systemctl start httpd
    # END ANSIBLE MANAGED BLOCK
    

    正如之前所说,blockinfile模块的作用就是在文件中添加、更新、或者删除被标记的文本块,而上述被标记的文本块就是我们添加进文件的,# BEGIN ANSIBLE MANAGED BLOCK# END ANSIBLE MANAGED BLOCK就是blockinfile模块自动为我们添加的文本块标记,一个是开始标记,一个是结束标记。

    我们也可以自定义标记,但是自定义的标记仍然要成对出现,需要有开始标记和结束标记,示例如下:

    $ ansible test181 -m blockinfile -a 'path=/testdir/rc.local block="systemctl start mariadb\nsystemctl start httpd" marker="#{mark} serivce to start" '
    

    使用marker可以自定义文本块的标记, 上例中的{mark}会自动被替换成开始标记中的BEGIN 和结束标记中的 END,如果文件中不存在同名标记的文本块,那么文件的末尾将会出现如下文本块。

    #BEGIN serivce to start
    systemctl start mariadb
    systemctl start httpd
    #END serivce to start
    

    在执行完上述命令的基础上,执行如下命令:

    $ ansible test181 -m blockinfile -a 'path=/testdir/rc.local block="systemctl start mariadb" marker="#{mark} serivce to start" '
    

    因为在执行此命令时,#{mark} serivce to start标记对应的文本块已经存在于文件中,而同时,block参数对应的内容又与之前文本块的内容不同,所以,这种情况下,对应文本块中的内容会被更新,而不会再一次插入新的文本块,这种用法相当于更新原来文本块中的内容,执行上述命令后,文本块的内容被更新为如下文本。

    #BEGIN serivce to start
    systemctl start mariadb
    #END serivce to start
    

    在执行完上述命令的基础上,执行如下命令:

    $ ansible test181 -m blockinfile -a 'path=/testdir/rc.local block="" marker="#{mark} serivce to start" '
    

    因为在执行此命令时,#{mark} serivce to start标记对应的文本块已经存在于文件中,而同时,block参数对应的内容为空,这时,blockinfile模块会删除对应标记的文本块,我们还可以使用如下命令删除对应的文本块,它们的效果是相同的。

    $ ansible test181 -m blockinfile -a 'path=/testdir/rc.local  marker="#{mark} serivce to start" state=absent'
    

    是的,使用将state的值设置为absent,表示删除对应标记的文本块!

    默认情况下,文本块插入在文件的尾部,我们也可以将文本块插入指定的位置,比如,插入在文件开头,或者根据正则表达式去匹配对应的行,然后将文本块插入到匹配到的行的前头或者后头,示例如下:

    如果想要将文本块插入到文档的开头,可以使用insertbefore参数,将其值设置为BOF,BOF表示Begin Of File:

    $ ansible test181 -m blockinfile -a 'path=/testdir/rc.local block="####blockinfile test####"  marker="#{mark} test" insertbefore=BOF'
    

    如果使用如下命令,表示将文本块插入到文档的结尾,与默认操作相同,将insertafter参数设置为EOF表示End Of File:

    $ ansible test181 -m blockinfile -a 'path=/testdir/rc.local block="####blockinfile test####"  marker="#{mark} test" insertafter=EOF'
    

    使用如下命令表示使用正则表达式匹配行,将文本块插入到以#!/bin/bash开头的行之后:

    $ ansible test181 -m blockinfile -a 'path=/testdir/rc.local block="####blockinfile test####"  marker="#{mark} test reg" insertafter="^#!/bin/bash" '
    

    使用backup参数,可以在操作修改文件之前,对文件进行备份,备份的文件会在原文件名的基础上添加时间戳:

    $ ansible test181 -m blockinfile -a 'path=/testdir/rc.local marker="#{mark} test" state=absent backup=yes'
    

    使用create参数,如果指定的文件不存在,则创建它,示例如下:

    $ ansible test181 -m blockinfile -a 'path=/testdir/test block="test" marker="#{mark} test" create=yes'
    

    四、lineinfile模块

    我们可以借助lineinfile模块,确保”某一行文本”存在于指定的文件中,或者确保从文件中删除指定的文本(即确保指定的文本不存在于文件中),还可以根据正则表达式,替换”某一行文本”。

    此处我们介绍一些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参数:当要操作的文件并不存在时,是否创建对应的文件;

    4.1 示例命令

    为了方便举例,我们使用/testdir/test文件作为被操作的文件,test文件内容如下:

    $ cat /testdir/test
    Hello ansible,Hiiii
    lineinfile -
    Ensure a particular line is in a file,
    lineinfile -
    or replace an existing line using a back-referenced regular expression.
    

    确保指定的”一行文本”存在于文件中,如果指定的文本本来就存在于文件中,则不做任何操作,如果不存在,默认在文件的末尾插入这行文本,如下命令表示确保test lineinfile这行文本存在于/testdir/test文件中。

    $ ansible test181 -m lineinfile -a 'path=/testdir/test line="test text"'
    

    如下命令表示根据正则表达式替换某一行,如果不止一行能够匹配正则,那么只有最后一个匹配正则的行才会被替换,被匹配行会被替换成line参数指定的内容,但是如果指定的表达式没有匹配到任何一行,那么line中的内容会被添加到文件的最后一行。

    $ ansible test181 -m lineinfile -a 'path=/testdir/test regexp="^line" line="test text" '
    

    如下命令表示根据正则表达式替换某一行,如果不止一行能够匹配正则,那么只有最后一个匹配正则的行才会被替换,被匹配行会被替换成line参数指定的内容,但是如果指定的表达式没有匹配到任何一行,那么则不对文件进行任何操作。

    $ ansible test181 -m lineinfile -a 'path=/testdir/test regexp="^line" line="test text" backrefs=yes '
    

    根据line参数的内容删除行,如果文件中有多行都与line参数的内容相同,那么这些相同的行都会被删除。

    $ ansible test181 -m lineinfile -a 'path=/testdir/test line="lineinfile -" state=absent'
    

    根据正则表达式删除对应行,如果有多行都满足正则表达式,那么所有匹配的行都会被删除。

    $ ansible test181 -m lineinfile -a 'path=/testdir/test regexp="^lineinfile" state=absent'
    

    默认情况下,lineinfile模块不支持后向引用(如果对后向引用不是特别了解,可以参考本站中的另一片文章 Linux正则之分组与后向引用

    如果将backrefs设置为yes,表示开启支持后向引用,使用如下命令,可以将test示例文件中的Hello ansible,Hiiii替换成Hiiii,如果不设置backrefs=yes,则不支持后向引用,那么Hello ansible,Hiiii将被替换成”\2

    $ ansible test181 -m lineinfile -a 'path=/testdir/test regexp="(H.{4}).*(H.{4})" line="\2" backrefs=yes'
    

    insertafterinsertbeforebackupcreate等参数就不再举例赘述了,可参考blockinfile模块,都是类似的!

    五、find模块

    find模块可以帮助我们在远程主机中查找符合条件的文件,就像find命令一样。

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

    • paths参数:必须参数,指定在哪个目录中查找文件,可以指定多个路径,路径间用逗号隔开,此参数有别名,使用别名path或者别名name可以代替paths;
    • recurse参数:默认情况下,只会在指定的目录中查找文件,也就是说,如果目录中还包含目录,ansible并不会递归的进入子目录查找对应文件,如果想要递归的查找文件,需要使用recurse参数,当recurse参数设置为yes时,表示在指定目录中递归的查找文件;
    • hidden参数:默认情况下,隐藏文件会被忽略,当hidden参数的值设置为yes时,才会查找隐藏文件;
    • file_type参数:默认情况下,ansible只会根据条件查找文件,并不会查找目录软链接等文件类型,如果想要指定查找的文件类型,可以通过file_type指定文件类型,可指定的文件类型有anydirectoryfilelink四种;
    • 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校验码,如果要查找的文件比较大,那么生成校验码的时间会比较长;

    5.1 示例命令

    在test181主机的/testdir目录中查找文件内容中包含abc字符串的文件,隐藏文件会被忽略,不会进行递归查找。

    $ ansible test181 -m find -a 'paths=/testdir contains=".*abc.*" '
    

    在test181主机的/testdir目录以及其子目录中查找文件内容中包含abc字符串的文件,隐藏文件会被忽略。

    $ ansible test181 -m find -a 'paths=/testdir contains=".*abc.*" recurse=yes '
    

    在test181主机的/testdir目录中查找以.sh结尾的文件,包括隐藏文件,但是不包括目录或其他文件类型,不会进行递归查找。

    $ ansible test181 -m find -a 'paths=/testdir patterns="*.sh" hidden=yes'
    

    在test181主机的/testdir目录中查找以.sh结尾的文件,包括隐藏文件,包括所有文件类型,比如文件、目录、或者软链接,但是不会进行递归查找。

    $ ansible test181 -m find -a 'paths=/testdir patterns="*.sh" file_type=any hidden=yes'
    

    在test181主机的/testdir目录中查找以.sh结尾的文件,包括隐藏文件,包括所有文件类型,比如文件、目录、或者软链接,但是不会进行递归查找。

    $ ansible test181 -m find -a 'paths=/testdir patterns="*.sh" file_type=any hidden=yes'
    

    在test181主机的/testdir目录中查找以.sh结尾的文件,只不过patterns对应的表达式为正则表达式,查找范围包括隐藏文件,包括所有文件类型,但是不会进行递归查找,不会对/testdir目录的子目录进行查找。

    $ ansible test181 -m find -a 'paths=/testdir patterns=".*\.sh" use_regex=yes file_type=any hidden=yes'
    

    在test181主机的/testdir目录中以及其子目录中查找mtime在4天以内的文件,不包含隐藏文件,不包含目录或软链接文件等文件类型。

    $ ansible test181 -m find -a "path=/testdir age=-4d recurse=yes"
    

    在test181主机的/testdir目录中以及其子目录中查找atime在2星期以内的文件,不包含隐藏文件,不包含目录或软链接文件等文件类型。

    $ ansible test181 -m find -a "path=/testdir age=-2w age_stamp=atime recurse=yes"
    

    在test181主机的/testdir目录中以及其子目录中查找大于2G的文件,不包含隐藏文件,不包含目录或软链接文件等文件类型。

    $ ansible test181 -m find -a "paths=/testdir size=2g recurse=yes"
    

    在test181主机的/testdir目录中以及其子目录中查找以.sh结尾的文件,并且返回符合条件文件的sha1校验码,包括隐藏文件

    $ ansible test181 -m find -a "paths=/testdir patterns=*.sh get_checksum=yes  hidden=yes recurse=yes"
    

    六、replace模块

    replace模块可以根据我们指定的正则表达式替换文件中的字符串,文件中所有被正则匹配到的字符串都会被替换。

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

    • path参数:必须参数,指定要操作的文件,2.3版本之前,只能使用dest, destfile, name指定要操作的文件,2.4版本中,仍然可以使用这些参数名,这些参数名作为path参数的别名使用;
    • regexp参数:必须参数,指定一个python正则表达式,文件中与正则匹配的字符串将会被替换;
    • replace参数:指定最终要替换成的字符串;
    • backup参数:是否在修改文件之前对文件进行备份,最好设置为yes;

    6.1 示例命令

    把test181主机中的/testdir/test文件中的所有ASM替换成asm

    $ ansible test181 -m replace -a 'path=/testdir/test regexp="ASM" replace=asm'
    

    把test181主机中的/testdir/test文件中的所有ASM替换成asm,但是在操作文件之前进行备份。

    $ ansible test181 -m replace -a 'path=/testdir/test regexp="ASM" replace=asm backup=yes'
    
  • 相关阅读:
    jquery选择器[转]
    asp.net调用exe并传递参数然后关闭exe[转]
    JS操作JSON总结[转]
    Newtonsoft.Json序列化和反序列[转]
    jQuery EasyUI自定义DataGrid的Editor【转】
    【转】jquery easy UI datagrid新增一行,columns中editor下拉框之间的联动。
    jquery 表单序列化 转换json
    Jquery组合form元素为json格式,asp.net反序列化[转]
    什么是BOM头,及PHP解决办法
    PHP中去除字符串中的换行的方法
  • 原文地址:https://www.cnblogs.com/lvzhenjiang/p/16061592.html
Copyright © 2020-2023  润新知