使用ansible/jinja2将映射过滤器应用于字典的值



我正在尝试编写一个易于理解的剧本,以一种格式良好的方式输出有关系统的一些细节。特别是磁盘大小。

输入变量看起来像:

- friendly_name: 'disk1 name'
size: 123456
- friendly_name: 'disk2 name'
size: 654321
{{ dict(ansible_facts.disks | json_query('[].[friendly_name, size]')) }}

我正在努力想出一种方法来将函数应用于字典的"值"(或嵌套列表的第二个值,在将其转换为dict之前(-我想应用human_readable(unit='G')或类似的方法,而不使用set_factFilterPlugin

所以理想情况下,我会有一个形式的输出变量:

{'disk1 name': '1024G', 'disk2 name': '8192G'}

您可以将字典ansible_facts.disks拆分为两个列表,一个包含大小,另一个包含友好名称,然后使用map筛选器将human_readable筛选器应用于包含大小的列表,然后将zip这两个列表重新组合在一起。

给定任务:

- debug:
msg: "{{ dict(
ansible_facts.disks | map(attribute='friendly_name') | 
zip(ansible_facts.disks | map(attribute='size') | map('human_readable','unit','G'))
) }}"
vars:
ansible_facts:
disks:
- friendly_name: 'disk1 name'
size: 1099511627776
- friendly_name: 'disk2 name'
size: 8796093022208

这产生:

TASK [debug] ********************************************************************
ok: [localhost] => {
"msg": {
"disk1 name": "1024.00 Gb",
"disk2 name": "8192.00 Gb"
}
}

如果没有格式化,您可以简单地使用items2dict


- debug:
msg: "{{ ansible_facts.disks|items2dict(key_name='friendly_name',
value_name='size') }}"

给出

msg:
disk1 name: 1099511627776
disk2 name: 8796093022208

使用Jinja更改格式,例如

- debug:
msg: "{{ _disks|from_yaml }}"
vars:
_disks: |
{% for i in ansible_facts_disks %}
{{ i.friendly_name }}: {{ i.size|human_readable(unit='G') }}
{% endfor %}

给出

msg:
disk1 name: 1024.00 GB
disk2 name: 8192.00 GB

最新更新