如何在Ansible/Jinja2中为字典值应用过滤器转换磁盘大小为GB级易读格式(无需set_fact或FilterPlugin)
解决方案
你可以直接通过Jinja2的生成器表达式结合Ansible内置的human_readable过滤器,在单个模板表达式内完成字典转换和磁盘大小格式化,完全不需要set_fact或自定义FilterPlugin。
核心表达式如下:
{{ dict( (item.friendly_name, item.size | human_readable(unit='G')) for item in ansible_facts.disks ) }}
说明
- 遍历磁盘列表:直接循环
ansible_facts.disks中的每一项,避免了json_query的中间转换,更直观也更灵活。 - 格式化磁盘大小:对每个磁盘的
size字段应用human_readable(unit='G')过滤器,自动将原始数值转换为以GB为单位的人类可读格式。如果需要调整精度(比如去掉小数),可以添加precision参数:
如果想要更简洁的格式(比如item.size | human_readable(unit='G', precision=0)1024G而非1024 GB),可以再叠加replace过滤器去掉空格:item.size | human_readable(unit='G', precision=0) | replace(' ', '') - 生成目标字典:用生成器表达式产出
(友好名称, 格式化后大小)的键值对,最后通过dict()函数直接转换为你需要的字典结构。
示例
假设你的ansible_facts.disks数据如下:
ansible_facts: disks: - friendly_name: 'disk1 name' size: 1099511627776 # 1TB = 1024GB - friendly_name: 'disk2 name' size: 8796093022208 # 8TB = 8192GB
使用带精度调整和空格去除的表达式:
{{ dict( (item.friendly_name, item.size | human_readable(unit='G', precision=0) | replace(' ', '')) for item in ansible_facts.disks ) }}
将输出你期望的格式:
{'disk1 name': '1024G', 'disk2 name': '8192G'}
内容的提问来源于stack exchange,提问作者LordAro
相关产品推荐
相关产品推荐

