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事实如何除法?的主要内容,如果未能解决你的问题,请参考以下文章