You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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é

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 21:15:02