json_query查询到的Ansible事实如何除法?

Posted

技术标签:

【中文标题】json_query查询到的Ansible事实如何除法?【英文标题】:How to divide and multiply Ansible facts queried by json_query? 【发布时间】:2022-01-18 21:53:50 【问题描述】:
" ansible_facts | json_query('mounts[*].size_available')  /  ansible_facts | json_query('mounts[*].size_total')  * 100"

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

“味精”:“[238273] / [483298433] * 100”

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

【问题讨论】:

因为你在 Jinja 表达式之外,所以它作为一个简单的字符串返回。 【参考方案1】:

您需要您的数学运算符位于 Jinja expression ... 内。

此外,由于您获得了[238273][483298433],因此您在json_query 中的JMESPath 查询将返回两个列表,因此您确实想使用first filter。

最后,但同样重要的是,这两个值仍会返回一些字符串,因此您确实想使用 int filter。

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

【讨论】:

【参考方案2】:

json_query 不是必需的。只需映射属性,例如

    - 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'

【讨论】:

以上是关于json_query查询到的Ansible事实如何除法?的主要内容,如果未能解决你的问题,请参考以下文章

使用Ansible中的json_query / jmespath过滤器进行多次搜索

如何在ansible中将字典或列表转换为字符串

sql: JSON_QUERY() 函数提取对象

强制 Ansible 从组中收集事实

如何使用ansible查找Linux主机的序列号

Ansible最佳实践之委派任务和事实