如何在Ansible的JMESPath查询中执行算术运算(字节转GB)
在Ansible中实现字节到GB的单位转换
核心问题解答
json_query 基于JMESPath语法,本身不支持直接执行算术运算(比如字节转GB的除法计算)。JMESPath的内置函数仅包含类型转换、字符串处理等基础操作,无法完成自定义数值计算,因此需要通过Ansible的其他过滤器或步骤来实现单位转换。
解决方案1:直接处理CSV源数据,新增GB字段
先遍历CSV解析后的字典列表,为每个条目添加转换后的GB字段,再筛选所需字段:
- name: 添加GB单位的大小字段 set_fact: dictionnary: >- {{ dictionnary | default([]) + [item | combine({'Taille en Go': (item['Size'] | int / (1024*1024*1024)) | round(2)})] }} loop: "{{ csv.content | community.general.from_csv }}" - name: 选择需要展示的字段 set_fact: result: "{{ dictionnary | community.general.json_query('[].{\"Chemin\": \"Path\", \"Date de dernière modification\": \"Last Modified\", \"Taille en Go\": \"Taille en Go\", \"Nombre de fichiers et de dossiers\": \"File and Directory Count\"}') }}"
说明:通过int过滤器将字符串类型的Size转为数值,除以1024³得到GB值,用round(2)保留两位小数,最后通过combine将新字段合并到原字典中。
解决方案2:先转JSON再用human_readable过滤器生成易读格式
先通过json_query完成字段筛选和类型转换,再遍历数据用human_readable过滤器自动转换为带单位的易读格式(会根据数值大小自动适配KB/MB/GB等单位):
- name: 格式化原始数据为JSON结构 set_fact: json_data: "{{ csv.content | community.general.from_csv | community.general.json_query( '[].{ \"Chemin HDFS\": \"Path\", \"Date de dernière modification\": \"Last Modified\", \"Taille\": to_number(\"Size\"), \"Nombre de fichiers et de dossiers\": \"File and Directory Count\"}') }}" delegate_to: dpn - name: 将大小转换为人类可读格式 vars: key_to_replace: 'Taille' set_fact: result: "{{ result | default([]) + [ item | combine({ key_to_replace: item[key_to_replace] | int | human_readable }) ] }}" loop: "{{ json_data }}"
说明:human_readable是Ansible内置过滤器,会自动匹配最合适的存储单位;如果需要强制固定为GB格式,可以手动计算后拼接单位字符串(例如(数值/1024^3)|round(2) ~ " GB")。
内容的提问来源于stack exchange,提问作者Mike HUMPHREYS
相关产品推荐
相关产品推荐

