ansible教程:ansible的find模块
ansible的find模块用于在远程主机中查找符合条件的文件,就像linux中的find命令一样。
我们用ansible来实现几个find命令
find模块查看/root目录下的json文件
ansible all -m find -a 'paths=/root contains="*abc*"'
- all 表示一个主机组,这里可以写ip地址。
- -m find 表示使用find模块
- -a 表示参数,这里可以写一些查询参数
- paths表示在哪个目录下查询
- contains表示在/root目录下查找文件中包含abc字符的文件
ansible的find模块的参数说明
本节介绍一些find模块的常用参数,大家可以先耐心阅读理解一下:),后面会有更多demos哦。
paths:path是必须的参数,用于指定查询目录,如果有多个目录,可以用逗号隔开。这个参数有别名path和name。下面的代码都是正确的:
ansible all -m find -a 'paths=/root patterns="*.json"' ansible all -m find -a 'path=/root,/home patterns="*.json"' ansible all -m find -a 'name=/root,/home patterns="*.json"'
patterns: 使用此参数指定需要查找的文件名称,支持使用shell(比如通配符)或者正则表达式去匹配文件名称,默认情况下,使用shell匹配对应的文件名,如果想要使用python的正则去匹配文件名,需要将use_regex参数的值设置为yes。
指定在哪个目录中查找文件,可以指定多个路径,路径间用逗号隔开,此参数有别名,使用别名path或者别名name可以代替paths。
recurse递归参数 : 默认情况下,ansible只会在指定的目录中查找文件,也就是说,如果目录中还包含子目录,ansible并不会递归的进入子目录查找对应文件,如果想要递归的查找文件,需要使用recurse参数,当recurse参数设置为yes时,表示在指定目录中递归的查找文件。
ansible all -m find -a 'paths=/root patterns="*.yaml" recurse=yes'
size大小参数 :使用此参数可以根据文件大小查找文件,比如,如果想要查找大于5M的文件,那么可以设置size=5m,如果想要查找小于50k的文件,可以设置size=-50k,可以使用的单位有t、g、m、k、b。大于的时候使用正数,小于的时候使用负数。
在/root目录中,递归查找大于100m的文件,不包括目录、软链接等
ansible all -m find -a "paths=/root size=100m recurse=yes"
get_checksum参数 :当有符合查找条件的文件被找到时,会同时返回对应文件的sha1校验码,sha1是文件的摘要,一个文件有一个唯一的摘要。
ansible all -m find -a "paths=/root size=100m get_checksum=yes recurse=yes"
结果在在checksum字段中,是一个40个字符的字符串。
{ "atime": 1616856019.41, "checksum": "649332adb37dc23f3c48f81c5b9210f207e4e3e2", "ctime": 1616856019.406, "dev": 64769, "gid": 0, }
age时间参数 :使用此参数可以根据时间范围查找文件,默认以文件的mtime为准与指定的时间进行对比。文件的时间有3种:
- atime:访问时间(access time),指的是文件最后被访问、读取的时间。
- ctime:变更时间(change time),指的是文件本身最后被变更的时间,不是变更其内容,是变更文件的元数据,如修改权限,修改用户组,变更动作可以使chmod、chgrp、mv等等;
- mtime:修改时间(modify time),指的是文件内容最后被修改的时间,例如编辑文件,修改文件内容,修改动作可以使echo重定向、vi等等。
比如,如果想要查找修改时间在7天之前的文件,那么可以设置age=7d,如果想要查找修改时间(mtime)在7天以内的文件,可以设置age=-7d,这里所说的3天是按照当前时间往前推3天,可以使用的单位有秒(s)、分(m)、时(h)、天(d)、星期(w)。
递归查找7天之内修改的所有文件:
ansible all -m find -a "path=/root age=7d recurse=yes"
age_stamp参数 :文件的时间属性中有三个时间种类,atime、ctime、mtime,当我们根据时间范围查找文件时,可以指定以哪个时间种类为准,当根据时间查找文件时,默认以mtime为准。下面是以atime访问时间来指定查找文件
ansible all -m find -a "path=/root age=7d age_stamp=atime recurse=yes"
contains参数:使用此参数可以根据文章内容查找文件,此参数的值为一个正则表达式,find模块会根据对应的正则表达式匹配文件内容。例如查找某个文件中是否包含abc这3个字符。
echo xxxabceee >c.log ansible all -m find -a 'paths=/root contains=".*abc.*"'
结果:
192.168.1.39 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "examined": 31, "files": [ { "atime": 1616992056.325, "ctime": 1616992056.325, "dev": 64769, "gid": 0, "gr_name": "root", "inode": 528849, "isblk": false, "ischr": false, "isdir": false, "isfifo": false, "isgid": false, "islnk": false, "isreg": true, "issock": false, "isuid": false, "mode": "0644", "mtime": 1616992056.325, "nlink": 1, "path": "/root/c.log", "pw_name": "root", "rgrp": true, "roth": true, "rusr": true, "size": 10, "uid": 0, "wgrp": false, "woth": false, "wusr": true, "xgrp": false, "xoth": false, "xusr": false } ......
find模块举例
下面的例子在/root目录中,查找文件后缀为json的文件。
[root@ecs-3f37-0003 ~]# ansible all -m find -a 'paths=/root patterns="*.json"' 192.168.1.39 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "examined": 30, "files": [ { "atime": 1616940364.922, "ctime": 1616940363.934, "dev": 64769, "gid": 0, "gr_name": "root", "inode": 528847, "isblk": false, "ischr": false, "isdir": false, "isfifo": false, "isgid": false, "islnk": false, "isreg": true, "issock": false, "isuid": false, "mode": "0644", "mtime": 1616940363.934, "nlink": 1, "path": "/root/mysql2mysql.json", "pw_name": "root", "rgrp": true, "roth": true, "rusr": true, "size": 1659, "uid": 0, "wgrp": false, "woth": false, "wusr": true, "xgrp": false, "xoth": false, "xusr": false } ], "matched": 1, "msg": "" }