• ansible笔记(3)-文件操作模块(上)


    ansible的模块非常多,每个模块都有自己独特的功能。我们只需要了解常用的一些模块即可。asnible已经对模块进行了分类,想了解具体信息需要先
    清楚自己使用的ansible版本:

    [root@myhost ~]# ansible --version
    ansible 2.8.2
      config file = /etc/ansible/ansible.cfg
      configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
      ansible python module location = /usr/lib/python2.7/site-packages/ansible
      executable location = /usr/bin/ansible
      python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]

    官网地址:https://docs.ansible.com/ansible/2.8/modules/modules_by_category.html

    点击FIles modules,出现如下图信息,表示对文件操作的模块有下面这些,简单介绍几个较为常用的,后续用到继续补充:

    copy模块

    copy模块的作用就是拷贝文件,fetch模块是将被控端文件拉取到控制端,copy模块与其相反。

    常用参数:

    举例说明:

      将控制端的install.log发送到被控端的/opt目录下,若install.log已经存在在被控端的/opt目录下且内容不同时,文件将会被覆盖。

    [root@tlur31drk8wk ~]# ansible test -m copy -a "src=install.log dest=/opt"
    192.168
    .161.42 | SUCCESS => { "changed": true, "checksum": "d0452b67691fcfef0af906d9da6a620448042976", "dest": "/opt/install.log", "gid": 0, "group": "root", "md5sum": "6cd7a73963dc2096010eafe2cb013880", "mode": "0644", "owner": "root", "size": 50968, "src": "/root/.ansible/tmp/ansible-tmp-1565587637.23-170868835783972/source", "state": "file", "uid": 0 }

      使用content参数在被控主机上生成文本文件,当使用connect参数时,dest必须为文件路径。

    [root@tlur31drk8wk ~]# ansible test -m copy -a "content='aaa
    bbb
    ' dest=/opt/test"
    192.168.161.42 | SUCCESS => {
        "changed": true,
        "checksum": "90c206af0bfefa95541d3e724efe1dbc1ed3877f",
        "dest": "/opt/test",
        "gid": 0,
        "group": "root",
        "md5sum": "8b652b8c79f357694a04bd793f533c96",
        "mode": "0644",
        "owner": "root",
        "size": 8,
        "src": "/root/.ansible/tmp/ansible-tmp-1565588360.47-46298404825784/source",
        "state": "file",
        "uid": 0
    }

      将控制端的install.log发送到被控端的/opt目录下,若install.log已经存在在被控端的/opt目录下且内容不同时,使用force参数,被控端文件内容将不改变。

    [root@tlur31drk8wk ~]# ansible test -m copy -a "src=install.log dest=/opt force=no"
    192.168.161.42 | SUCCESS => {
        "changed": false,
        "dest": "/opt",
        "src": "/root/install.log"
    }

      将控制端的install.log发送到被控端的/opt目录下,若install.log已经存在在被控端的/opt目录下且内容不同时,使用backup参数会执行拷贝操作,但是会在操作前将原文件备份。

    [root@tlur31drk8wk ~]# ansible test -m copy -a "src=install.log dest=/opt backup=yes"
    192.168.161.42 | SUCCESS => {
        "changed": false,
        "checksum": "d0452b67691fcfef0af906d9da6a620448042976",
        "dest": "/opt/install.log",
        "gid": 0,
        "group": "root",
        "mode": "0644",
        "owner": "root",
        "path": "/opt/install.log",
        "size": 50968,
        "state": "file",
        "uid": 0
    }

      拷贝文件时,指定被控端文件的属主、属组和权限。远程主机必须存在对应的用户。

    [root@tlur31drk8wk ~]# ansible test -m copy -a "src=install.log dest=/opt owner=www group=www mode=0644"
    192.168.161.42 | SUCCESS => {
        "changed": true,
        "checksum": "d0452b67691fcfef0af906d9da6a620448042976",
        "dest": "/opt/install.log",
        "gid": 501,
        "group": "www",
        "mode": "0644",
        "owner": "www",
        "path": "/opt/install.log",
        "size": 50968,
        "state": "file",
        "uid": 501
    }

    file模块

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

    常用参数:

      path参数 :必须参数,用于指定要操作的文件或目录,在之前版本的ansible中,使用dest参数或者name参数指定要操作的文件或目录,为了兼容之前的版本,使用dest或name也可以。

      state参数 :此参数非常灵活,其对应的值需要根据情况设定。比如,我们想要在远程主机上创建/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,可以递归的修改目录中文件的属性。

    举例说明:

      在test主机上创建testfile文件,若testfile文件存在,则更新文件的时间戳,与touch命令相同。

    [root@tlur31drk8wk ~]# ansible test -m file -a "path=/opt/testfile state=touch"
    192.168.161.42 | SUCCESS => {
        "changed": true,
        "dest": "/opt/testfile",
        "gid": 0,
        "group": "root",
        "mode": "0644",
        "owner": "root",
        "size": 0,
        "state": "file",
        "uid": 0
    }

      在test主机上创建testdir目录,若testdir文件存在,则不进行任何操作。

    [root@tlur31drk8wk ~]# ansible test -m file -a "path=/opt/testdir state=directory"
    192.168.161.42 | SUCCESS => {
        "changed": true,
        "gid": 0,
        "group": "root",
        "mode": "0755",
        "owner": "root",
        "path": "/opt/testdir",
        "size": 4096,
        "state": "directory",
        "uid": 0
    }

      在test主机上为testfile(已经存在)创建软链接,链接名为linkfile。

    [root@tlur31drk8wk ~]# ansible test -m file -a "path=/opt/linkfile state=link src=/opt/testfile"
    192.168.161.42 | SUCCESS => {
        "changed": true,
        "dest": "/opt/linkfile",
        "gid": 0,
        "group": "root",
        "mode": "0777",
        "owner": "root",
        "size": 13,
        "src": "/opt/testfile",
        "state": "link",
        "uid": 0
    }

      在test主机上为testfile(已经存在)创建硬链接,链接名为hardlink。

    [root@tlur31drk8wk ~]# ansible test -m file -a "path=/opt/hardlink state=hard src=/opt/testfile"
    192.168.161.42 | SUCCESS => {
        "changed": true,
        "dest": "/opt/hardlink",
        "gid": 0,
        "group": "root",
        "mode": "0644",
        "owner": "root",
        "size": 0,
        "src": "/opt/testfile",
        "state": "hard",
        "uid": 0
    }

      创建链接文件时,当源文件不存在或链接文件与其他文件同名时,强制覆盖。

    [root@tlur31drk8wk ~]# ansible test -m file -a "path=/opt/linkfile state=link src=sourcefile force=yes"
    192.168.161.42 | SUCCESS => {
        "changed": true,
        "dest": "/opt/linkfile",
        "src": "sourcefile",
        "state": "absent"
    }

      删除被控主机的指定文件或目录。

    [root@tlur31drk8wk ~]# ansible test -m file -a "path=/opt/testdir state=absent"
    192.168.161.42 | SUCCESS => {
        "changed": true,
        "path": "/opt/testdir",
        "state": "absent"
    }

      创建文件时设置文件属性或修改被控端文件属性和权限。

    [root@tlur31drk8wk ~]# ansible test -m file -a "path=/opt/testdir state=directory  group=www owner=www mode=0644"
    192.168.161.42 | SUCCESS => {
        "changed": true,
        "gid": 501,
        "group": "www",
        "mode": "0644",
        "owner": "www",
        "path": "/opt/testdir",
        "size": 4096,
        "state": "directory",
        "uid": 501
    }  
    #若修改去掉state

      操作被控端的目录时,递归修改目录属性。

    [root@tlur31drk8wk ~]# ansible test -m file -a "path=/testdir/www state=directory  group=www owner=www recurse=yes"
    192.168.161.42 | SUCCESS => {
        "changed": true,
        "gid": 501,
        "group": "www",
        "mode": "0755",
        "owner": "www",
        "path": "/testdir/www",
        "size": 4096,
        "state": "directory",
        "uid": 501
    }

    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参数 :当要操作的文件并不存在时,是否创建对应的文件。

    举例说明:

      为了方便举例,将/etc/rc.local文件复制到/opt目录下做测试。

      在test主机中/opt/rc.local文件尾部添加两行:

      service nginx start

      service php-fpm start

    [root@tlur31drk8wk ~]# ansible test -m blockinfile -a 'path=/opt/rc.local block="service nginx start
    service php-fpm start"'
    192.168.161.42 | SUCCESS => {
        "changed": true,
        "msg": "Block inserted"
    }
    执行过后文件内容如下:

    [root@tlur31drk8wk ~]# ansible test -m shell -a "cat /opt/rc.local"
    192.168.161.42 | SUCCESS | rc=0 >>
    #!/bin/sh
    #
    # This script will be executed *after* all the other init scripts.
    # You can put your own initialization stuff in here if you don't
    # want to do the full Sys V style init stuff.

    
    

    touch /var/lock/subsys/local
    # BEGIN ANSIBLE MANAGED BLOCK   #ansible添加的开始标记
    service nginx start
    service php-fpm start
    # END ANSIBLE MANAGED BLOCK     ##ansible添加的结束标记

      自定义标记(需要有开始和结束标记):

    [root@tlur31drk8wk ~]# ansible test -m blockinfile -a 'path=/opt/rc.local block="service nginx start
    service php-fpm start" marker="#{mark} service start"'
    192.168.161.42 | SUCCESS => {
        "changed": true,
        "msg": "Block inserted"
    }
    
    #执行后文件内容如下:
    #BEGIN service start
    service nginx start
    service php-fpm start
    #END service start

      标记重复会替换标记中内容,而不会插入新内容:

    [root@tlur31drk8wk ~]# ansible test -m blockinfile -a 'path=/opt/rc.local block="service mysql start" marker="#{mark} service start"'
    192.168.161.42 | SUCCESS => {
        "changed": true,
        "msg": "Block inserted"
    }
    #执行后文件内容如下:
    #BEGIN service start
    #service mysql start
    #END service start

      删除文本块:

    [root@tlur31drk8wk ~]# ansible test -m blockinfile -a 'path=/opt/rc.local block="" marker="#{mark} service start"'
    192.168.161.42 | SUCCESS => {
        "changed": true,
        "msg": "Block removed"
    }

    ansible test-m blockinfile -a 'path=/opt/rc.local marker="#{mark} service start" state=absent'

      默认情况下文本块插入到文件的末尾,我们也可以将文本块插在文件开头或者根据正则区匹配对应的行,然后将文本块插入到匹配到的行前或行后。

      将文本块插入到文件开头,使用insertbefore参数,将其设为BOF(begin of file)

    [root@tlur31drk8wk ~]# ansible test -m blockinfile -a 'path=/opt/rc.local block="##blockfile##" marker="#{mark} test" insertbefore=BOF'
    192.168.161.42 | SUCCESS => {
        "changed": true,
        "msg": "Block inserted"
    }

      将文件插入到以#!/bin/bash开头的行后:

    [root@tlur31drk8wk ~]# ansible test -m blockinfile -a 'path=/opt/rc.local block="bfile test" marker="#{mark} zhengze" insertafter="^#!/bin/sh"'
    192.168.161.42 | SUCCESS => {
        "changed": true,
        "msg": "Block inserted"
    }

      使用backup参数,在操作之前会对文件备份,备份文件会在原文件名基础上加上时间戳

    [root@tlur31drk8wk ~]# ansible test -m blockinfile -a 'path=/opt/rc.local block="bfile test" marker="#{mark} bak" backup=yes'
    192.168.161.42 | SUCCESS => {
        "changed": true,
        "msg": "Block inserted"
    }
    [root@tlur31drk8wk ~]# ansible test -m shell -a "ls /opt"
    192.168.161.42 | SUCCESS | rc=0 >>
    rc.local
    rc.local.23466.2019-08-13@13:57:44~
    testdir
    testfile

      使用create参数,指定文件不存在将会创建它

    [root@tlur31drk8wk ~]# ansible test -m blockinfile -a 'path=/opt/notin block="hello" marker="#{notin} abc" create=yes'
    192.168.161.42 | SUCCESS => {
        "changed": true,
        "msg": "File created"
    }

    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参数 :当要操作的文件并不存在时,是否创建对应的文件。

    举例说明:

      通过操作/opt/ansible_test.txt文件具体,文件内容如下:

    [root@tlur31drk8wk opt]# cat ansible_test.txt
    Hello ansible,Hiiii
    lineinfile -
    Ensure a particular line is in a file,
    lineinfile -
    or replace an existing line using a back-referenced regular expression.

      确保某行文本存在于文件中,存在不做任何操作,不存在则添加到文件的末尾

    [root@tlur31drk8wk ~]# ansible test -m lineinfile -a 'path=/opt/ansible_test.txt line="test lineinfile"'
    192.168.161.42 | SUCCESS => {
        "backup": "",
        "changed": true,
        "msg": "line added"
    }

      根据正则表达式替换某一行,若不止一行能够匹配,只有最后一个匹配上的才会被替换,被匹配上的行会被替换成line参数指定的内容,若没匹配上则会将line参数内容添加到最后一行。

    [root@tlur31drk8wk ~]# ansible test -m lineinfile -a 'path=/opt/ansible_test.txt regexp="^line" line="change line"'
    192.168.161.42 | SUCCESS => {
        "backup": "",
        "changed": true,
        "msg": "line replaced"
    }

      根据正则表达式替换某一行,若不止一行能够匹配,只有最后一个匹配上的才会被替换,被匹配上的行会被替换成line参数指定的内容,若没匹配上则不会进行任何操作。

    [root@tlur31drk8wk ~]# ansible test -m lineinfile -a 'path=/opt/ansible_test.txt regexp="^line" line="change line" backrefs=yes'
    192.168.161.42 | SUCCESS => {
        "backup": "",
        "changed": false,
        "msg": ""
    }

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

    [root@tlur31drk8wk ~]# ansible test -m lineinfile -a 'path=/opt/ansible_test.txt line="change line" state=absent'
    192.168.161.42 | SUCCESS => {
        "backup": "",
        "changed": true,
        "found": 2,
        "msg": "2 line(s) removed"
    }

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

    [root@tlur31drk8wk ~]# ansible test -m lineinfile -a 'path=/opt/ansible_test.txt regexp="^test" state=absent'
    192.168.161.42 | SUCCESS => {
        "backup": "",
        "changed": true,
        "found": 1,
        "msg": "1 line(s) removed"
    }

    参考链接:http://www.zsythink.net/archives/2542

  • 相关阅读:
    计网 | 文件传输协议
    Java | JDK8 | Integer
    2.项目管理-应用工具
    1.需求管理
    1.短视频运营基础
    10.视频效果---变形稳定器
    9.时间重映射
    8.效果控件之移动&&缩放
    7.标记
    6.子剪辑与合并剪辑
  • 原文地址:https://www.cnblogs.com/ltlinux/p/11339584.html
Copyright © 2020-2023  润新知