file模块可以帮助我们完成一些对文件的基本操作,比如,创建文件或目录、删除文件或目录、修改文件权限等
path参数:必须参数,用于指定要操作的文件或目录,在之前版本的ansible中,使用dest参数或者name参数指定要操作的文件或目录,为了兼容之前的版本,使用dest或name也可以。
state参数:Path=“路径” state= touch|directory|link|hard|absent
此参数非常灵活,此参数对应的值需要根据情况设定,比如,当我们需要在远程主机中创建一个目录的时候,我们需要使用path参数指定对应的目录路径,假设,我想要在远程主机上创建/testdir/a/b目录,那么我则需要设置path=/testdir/a/b,但是,我们无法从"/testdir/a/b"这个路径看出b是一个文件还是一个目录,ansible也同样无法单单从一个字符串就知道你要创建文件还是目录,所以,我们需要通过state参数进行说明
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,可以递归的修改目录中文件的属性。
创建文件
1.在test70主机上创建一个名为testfile的文件,如果testfile文件已经存在,则会更新文件的时间戳,与touch命令的作用相同。
ansible test70 -m file -a "path=/testdir/testfile state=touch"
2.在test70主机上创建一个名为testdir的目录,如果testdir目录已经存在,则不进行任何操作。
ansible test70 -m file -a "path=/testdir/testdir state=directory"
3.在test70上为testfile文件创建软链接文件,软链接名为linkfile,执行下面命令的时候,testfile已经存在。
ansible test70 -m file -a "path=/testdir/linkfile state=link src=/testdir/testfile"
4.在test70上为testfile文件创建硬链接文件,硬链接名为hardfile,执行下面命令的时候,testfile已经存在。
ansible test70 -m file -a "path=/testdir/hardfile state=hard src=/testdir/testfile"
5.在创建链接文件时,如果源文件不存在,或者链接文件与其他文件同名时,强制覆盖同名文件或者创建链接文件,参考上述force参数的解释。
ansible test70 -m file -a "path=/testdir/linkfile state=link src=sourcefile force=yes"
删除文件
6.删除远程机器上的指定文件或目录
ansible test70 -m file -a "path=/testdir/testfile state=absent"
更改属主属组
7.在创建文件或目录的时候指定属主,或者修改远程主机上的文件或目录的属主。
ansible test70 -m file -a "path=/testdir/abc state=touch owner=zj"
ansible test70 -m file -a "path=/testdir/abc state=directory owner=zj"
ansible test70 -m file -a "path=/testdir/abc owner=zj"
8.在创建文件或目录的时候指定属组,或者修改远程主机上的文件或目录的属组。
ansible test70 -m file -a "path=/testdir/abb state=touch group=zj"
ansible test70 -m file -a "path=/testdir/abb group=zj"
ansible test70 -m file -a "path=/testdir/abb state=directory group=zj"
更改权限
9.在创建文件或目录的时候指定权限,或者修改远程主机上的文件或目录的权限。
ansible test70 -m file -a "path=/testdir/111 state=touch mode=755"
ansible test70 -m file -a "path=/testdir/111dir mode=755"
ansible test70 -m file -a "path=/testdir/111file mode=755"
ansible test70 -m file -a "path=/testdir/111 state=directory mode=755"
10当操作远程主机中的目录时,同时递归的将目录中的文件的属主属组都设置为zsy。
ansible test70 -m file -a "path=/testdir/abd state=directory owner=zsy group=zsy recurse=yes"
见名知义,copy模块的作用就是拷贝文件,它与fetch模块类似,不过,fetch模块是从远程主机中拉取文件到ansible主机,而copy模块是将ansible主机上的文件拷贝到远程主机中。
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.将ansible主机中/testdir/copytest文件复制到远程主机的/opt目录下,注意,如果copytest文件已经存在于远程主机的/opt目录中,并且远程主机中的copytest与ansible主机中copytest文件内容不同,那么使用如下命令时,远程主机中的copytest文件将被覆盖。
ansible test70 -m copy -a "src=/testdir/copytest dest=/opt/ force=yes"
复制(不覆盖)
2.将ansible主机中/testdir/copytest文件复制到远程主机的/opt目录中时,如果远程主机中已经存在/opt/copytest文件,并且文件内容与ansible主机中的copytest文件的内容不一致,则不执行拷贝操作,远程主机中的/opt/copytest文件内容不会被改变。
ansible test70 -m copy -a "src=/testdir/copytest dest=/opt/ force=no"
创建文件编辑内容
3.在远程主机的/opt目录下生成文件test,test文件中有两行文本,第一行文本为aaa,第二行为bbb,当使用content指定文件内容时,dest参数对应的值必须是一个文件,而不能是一个路径。
ansible test70 -m copy -a 'content="aaa\nbbb\n" dest=/opt/test'
文件存在备份源文件在复制
4.将ansible主机中/testdir/copytest文件复制到远程主机的/opt目录中时,如果远程主机中已经存在/opt/copytest文件,并且文件内容与ansible主机中的copytest文件的内容不一致,会执行拷贝操作,但是在执行拷贝操作之前,会将远程主机中的原文件重命名,以作备份,然后再进行拷贝操作。
ansible test70 -m copy -a "src=/testdir/copytest dest=/opt/ backup=yes"
复制文件指定文件属主属组权限
5.拷贝文件时,指定文件的属主,需要注意,远程主机上必须存在对应的用户。
ansible test70 -m copy -a "src=/testdir/copytest dest=/opt/ owner=zsy"
6.拷贝文件时,指定文件的属组,需要注意,远程主机上必须存在对应的组。
ansible test70 -m copy -a "src=/testdir/copytest dest=/opt/ group=zsy"
7.拷贝文件时,指定文件的权限
ansible test70 -m copy -a "src=/testdir/copytest dest=/opt/ mode=0640"
拉取远程主机的文件,并以主机IP地址或者主机名为目录,并保留了原来的目录结构
从被管理节点上拷贝文件到控制节点!
[root@master ~]# ansible webservers -m fetch -a 'src=/etc/hosts dest=/opt'
[root@master ~]# ll /opt/
总用量 0
drwxr-xr-x. 3 root root 17 3月 3 21:25 node1.kongd.com
drwxr-xr-x. 3 root root 17 3月 3 21:25 node2.kongd.com
drwxr-xr-x. 3 root root 17 3月 3 21:25 node3.kongd.com
flat=yes 不采用默认的文件级结构
[root@master ~]# ansible node3.kongd.com -m fetch -a 'src=/etc/hosts dest=/opt/hosts flat=yes'
synchronize 基于rsync命令批量同步文件做这个模块的时候,必须保证远程服务器上有rsync这个命令
[root@master ~]# ansible all -m yum -a 'name=rsync state=present'
如果没有rsync先安装
1.将node1节点的/etc/hosts目录拉取到主控节点的/tmp目录下
[root@master ~]# ansible node1.kongd.com -m synchronize -a 'src=/etc/hosts/ dest=/tmp mode=pull'
注意:mode默认为push,要拉取到主控节点,需要配置mode为pull
2.将本地/tmp目录内除.txt结尾的数据无差异且保持属性的同步到对端/mnt目录无差异化
[root@master ~]# ansible node1.kongd.com -m syncronize -a "src=/tmp/ dest=/mnt archive=yes delete=yes rsync_opts=--excloud=*.txt "
blockinfile模块可以帮助我们在指定的文件中插入"一段文本",这段文本是被标记过的,换句话说就是,我们在这段文本上做了记号,以便在以后的操作中可以通过"标记"找到这段文本,然后修改或者删除它
1.将/etc/rc.d/rc.local文件复制到/testdir目录中,以做测试。假如,我们想要在test70主机中的/testdir/rc.local文件尾部插入如下两行
systemctl start mariadb
systemctl start httpd
ansible test70 -m blockinfile -a 'path=/testdir/rc.local block="systemctl start mariadb\nsystemctl start httpd"'
#BEGIN ANSIBLE MANAGED BLOCK
systemctl start mariadb
systemctl start httpd
# END ANSIBLE MANAGED BLOCK
2.我们也可以自定义标记,但是自定义的标记仍然要"成对出现",需要有开始标记和结束标记
ansible test70 -m blockinfile -a 'path=/testdir/rc.local block="systemctl start mariadb\nsystemctl start httpd" marker="#{mark} serivce to start" '
#BEGIN serivce to start
systemctl start mariadb
systemctl start httpd
#END serivce to start
3.当文本块标记已存在,但再次编辑内容不同会覆盖原标记中的内容
ansible test70 -m blockinfile -a 'path=/testdir/rc.local block="systemctl start mariadb" marker="#{mark} serivce to start" '
文本块的内容被更新为如下文本。
#BEGIN serivce to start
systemctl start mariadb
#END serivce to start
4.删除对应标记文本块
当文本块为空时删除对应标记文本块
ansible test70 -m blockinfile -a 'path=/testdir/rc.local block="" marker="#{mark} serivce to start" '
ansible test70 -m blockinfile -a 'path=/testdir/rc.local marker="#{mark} serivce to start" state=absent'
5.将文本块插入到文档的开头,可以使用insertbefore参数,将其值设置为BOF,BOF表示Begin Of File
ansible test70 -m blockinfile -a 'path=/testdir/rc.local block="####blockinfile test####" marker="#{mark} test" insertbefore=BOF'
6.如果使用如下命令,表示将文本块插入到文档的结尾,与默认操作相同,将insertafter参数设置为EOF表示End Of File
ansible test70 -m blockinfile -a 'path=/testdir/rc.local block="####blockinfile test####" marker="#{mark} test" insertafter=EOF'
7.使用如下命令表示使用正则表达式匹配行,将文本块插入到 "以#!/bin/bash开头的行 " 之后
ansible test70 -m blockinfile -a 'path=/testdir/rc.local block="####blockinfile test####" marker="#{mark} test reg" insertafter="^#!/bin/bash" '
8.使用backup参数,可以在操作修改文件之前,对文件进行备份,备份的文件会在原文件名的基础上添加时间戳
ansible test70 -m blockinfile -a 'path=/testdir/rc.local marker="#{mark} test" state=absent backup=yes'
9.使用create参数,如果指定的文件不存在,则创建它,示例如下
ansible test70 -m blockinfile -a 'path=/testdir/test block="test" marker="#{mark} test" create=yes'
lineinfile模块,确保"某一行文本"存在于指定的文件中,或者确保从文件中删除指定的"文本"(即确保指定的文本不存在于文件中),还可以根据正则表达式,替换"某一行文本"。
path参数:必须参数,指定要操作的文件
line参数: 使用此参数指定文本内容。
regexp参数:使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。
state参数:当想要删除对应的文本时,需要将state参数的值设置为absent,absent为缺席之意,表示删除,state的默认值为present
backrefs参数:默认情况下,当根据正则替换文本时,即使regexp参数中的正则存在分组,在line参数中也不能对正则中的分组进行引用,除非将backrefs参数的值设置为yes,backrefs=yes表示开启后向引用,这样,line参数中就能对regexp参数中的分组进行后向引用了。backrefs=yes开启后向引用功能。
另一个作用,使用正则表达式替换对应行时,如果正则没有匹配到任何的行,那么line对应的内容会被插入到文本的末尾,不过,如果使用了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参数 :当要操作的文件并不存在时,是否创建对应的文件。
我们使用/testdir/test文件作为被操作的文件,test文件内容如下
cat /testdir/test
123
234
345
456
1.插入内容。 判断文件中test text内容是否存在,不存在则在文档尾插入该内容
ansible test70 -m lineinfile -a 'path=/testdir/test line="test text"'
2.regexp支持正则符匹配可以将匹配的行进行替换,当匹配不到则在文档尾追加写入
ansible test70 -m lineinfile -a 'path=/testdir/test regexp="^1" line="test text" '
3.基于正则替换行,当没有匹配到指定行则不做任何更改
ansible test70 -m lineinfile -a 'path=/testdir/test regexp="^line" line="test text" backrefs=yes '
4.匹配指定内容的行删除(若多行相同全部删除)
ansible test70 -m lineinfile -a 'path=/testdir/test line="123" state=absent'
5.根据正则表达式删除对应行,如果有多行都满足正则表达式,那么所有匹配的行都会被删除
ansible test70 -m lineinfile -a 'path=/testdir/test regexp="^lineinfile" state=absent'
6.如果将backrefs设置为yes,表示开启支持后向引用,使用如下命令,可以将test示例文件中的"Hello ansible,Hiiii"替换成"Hiiii",如果不设置backrefs=yes,则不支持后向引用,那么"Hello ansible,Hiiii"将被替换成"\2"
ansible test70 -m lineinfile -a 'path=/testdir/test regexp="(H.{4}).*(H.{4})" line="\2" backrefs=yes'
解包解压缩
ansible all -m unarchive -a 'src=/data/foo.tgz dest=/var/lib/foo'
ansible all -m unarchive -a 'src=/tmp/foo.zip dest=/data copy=no mode=0777'
ansible all -m unarchive -a 'src=https://example.com/example.zip dest=/data copy=no'
ansible websrvs -m archive -a 'path=/var/log/ dest=/data/log.tar.bz2 format=bz2 owner=wang mode=0600'