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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:56:02