如何对json_query查询到的Ansible事实进行除法和乘法?

How to divide and multiply Ansible facts queried by json_query?

"{{ ansible_facts | json_query('mounts[*].size_available') }} / {{ ansible_facts | json_query('mounts[*].size_total') }} * 100"

我正在尝试获取可用大小并将其除以总大小,然后乘以 100 得到磁盘使用百分比。当前代码给我这样的输出:

"msg": "[238273] / [483298433] * 100"

它完全忽略了 /*
我该如何解决这个问题?

您的数学运算符需要位于 Jinja expression {{ ... }}.

此外,由于您正在获取 [238273][483298433],因此您在 json_query 中的 JMESPath 查询 return 正在为您提供两个列表,因此您确实希望使用 first filter.

最后但同样重要的是,这两个值仍然会 return 你一些字符串,所以你确实想使用 int filter.

"{{ (ansible_facts | json_query('mounts[*].size_available') | first | int) / (ansible_facts | json_query('mounts[*].size_total') | first | int) * 100 }}"

json_query 不需要。只需 map 属性,例如

    - debug:
        msg: "{{ (item.0 / item.1 * 100)|round }}"
      with_together:
        - "{{ ansible_mounts|map(attribute='size_available')|list }}"
        - "{{ ansible_mounts|map(attribute='size_total')|list }}"

给予

ok: [localhost] => (item=[2085240832, 41015336960]) => 
  msg: '5.0'
ok: [localhost] => (item=[30278656, 100663296]) => 
  msg: '30.0'
ok: [localhost] => (item=[21565116416, 109899771904]) => 
  msg: '20.0'

一个更简单的选择是迭代安装列表,例如

    - debug:
        msg: "{{ (item.size_available / item.size_total * 100)|round }}"
      loop: "{{ ansible_mounts }}"
      loop_control:
        label: "{{ item.mount }}"

给予

ok: [localhost] => (item=/) => 
  msg: '5.0'
ok: [localhost] => (item=/boot/efi) => 
  msg: '30.0'
ok: [localhost] => (item=/export) => 
  msg: '20.0'