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": ""
}