如何在Ansible中检查目录文件列表大小并配置超50M的失败触发条件
问题根因
使用with_items循环调用stat模块后,注册的size_log变量是循环执行的汇总结果,所有单个文件的stat信息都存储在size_log.results数组中。你原有写法直接读取size_log.stat,仅当循环只执行1次(即只有1个待检测文件)时结构匹配,多文件场景下该变量路径不存在,因此条件判断失效。
修复方案
方案1:批量校验(推荐,只要存在超过50M的文件就触发失败)
直接通过Jinja2过滤器判断是否存在符合条件的文件,无需二次循环:
- name: 校验日志文件大小,超过50M则中断执行 fail: msg: "异常:存在超过50M的日志文件,文件列表:{{ (size_log.results | selectattr('stat.size', 'gt', 52428800) | map(attribute='item') | list) | join('、') }}" # 50M对应字节数为50*1024*1024=52428800,直接用字节比较精度更高 when: size_log.results | selectattr('stat.size', 'gt', 52428800) | list | length > 0
方案2:逐个文件校验
如果需要单独输出每个超规文件的大小信息,可以循环遍历size_log.results数组:
- name: 逐个校验日志文件大小 fail: msg: "异常:文件{{ item.item }}大小超过50M,实际大小为{{ (item.stat.size / 1024 / 1024) | round(2) }}M" loop: "{{ size_log.results }}" when: item.stat.size > 52428800
逻辑优化建议
你原有逻辑中用shell执行ls获取文件列表的方式容错性较差(路径含空格、目录无log文件时容易报错),可以直接用Ansible自带的find模块一次性获取文件列表和大小属性,省去单独调用stat模块的步骤:
- name: 获取指定目录下所有.log后缀的文件属性 find: paths: "{{ logs_directory }}" patterns: "*.log" register: find_logs - name: 校验日志文件大小 fail: msg: "异常:存在超过50M的日志文件,文件列表:{{ (find_logs.files | selectattr('size', 'gt', 52428800) | map(attribute='path') | list) | join('、') }}" when: find_logs.files | selectattr('size', 'gt', 52428800) | list | length > 0
内容的提问来源于stack exchange,提问作者Djé Djé
相关产品推荐
相关产品推荐

