Ansible stat模块获取的目录大小如何转换为MiB/GiB并实现阈值告警
Ansible目录大小转换及阈值判断实现方案
前置注意事项
stat模块针对目录返回的stat.size是目录自身inode的占用大小(通常仅几KB),不是目录下所有文件的总存储容量。如果需要统计目录的实际总大小,建议使用du命令获取,结果更符合预期。
完整实现示例(统计目录实际总大小)
1. 实现逻辑
- 调用
du命令获取目录总字节数 - 通过Jinja2过滤器做单位换算,可自定义保留小数位数
- 用
when条件判断是否超过阈值,触发对应提示
2. 完整Playbook代码
--- - name: 目录大小统计与阈值校验 hosts: 你的目标主机组 tasks: - name: 获取目录总字节数 command: du -sb /apps/InstallDir/data register: dir_total_size changed_when: false # 标记为无变更,避免影响playbook变更统计 - name: 字节单位转换为MB/GB set_fact: # 1MB = 1024*1024字节,保留2位小数 dir_size_mb: "{{ (dir_total_size.stdout_lines[0].split()[0] | int / 1048576) | round(2) }}" # 1GB = 1024*1024*1024字节,保留2位小数 dir_size_gb: "{{ (dir_total_size.stdout_lines[0].split()[0] | int / 1073741824) | round(2) }}" - name: 输出转换后的目录大小 debug: msg: "目录 /apps/InstallDir/data 总大小为:{{ dir_size_mb }} MB(约 {{ dir_size_gb }} GB)" - name: 超过阈值时输出告警(示例阈值为10GB) debug: msg: "警告:目录大小已超出设定阈值10GB,当前大小为 {{ dir_size_gb }} GB,请及时清理冗余文件!" when: dir_size_gb | float > 10
基于原stat模块的转换方案
如果确实需要使用stat模块返回的大小做转换,可参考以下代码修改你原有的playbook:
- name: check for file size stat: path: /apps/InstallDir/data register: myDir - name: 转换stat返回值为MB/GB格式 set_fact: dir_size_mb: "{{ (myDir.stat.size | int / 1048576) | round(2) }}" dir_size_gb: "{{ (myDir.stat.size | int / 1073741824) | round(2) }}" - debug: msg: "stat返回的目录大小为 {{ dir_size_mb }} MB / {{ dir_size_gb }} GB"
自定义调整说明
- 阈值可按需修改:如果要设置500MB的阈值,只需将告警任务的
when条件改为when: dir_size_mb | float > 500即可 - 保留小数位数可调整
round过滤器的参数,比如round(1)就是保留1位小数
内容的提问来源于stack exchange,提问作者Sravan Kumar
相关产品推荐
相关产品推荐

