Ansible列表变量更新异常:如何将disks中gb值转为整数?
解决Ansible批量转换列表字典中gb值为整数的问题
问题原因
你当前的任务写法错误在于同时使用loop和map,且在map的combine操作中引用了loop的item变量。loop循环结束后,item会保留最后一次循环的取值(即gb为16.00的磁盘项),导致map处理所有磁盘元素时,都用了最后一个item的gb值,最终所有项的gb都变成16。
正确解决方案
方案1:使用Jinja2列表推导式(直观易读)
直接遍历原disks列表,逐个转换gb值并生成新列表:
- name: Update disk sizes to integers set_fact: disks: >- {% set updated = [] %} {% for d in disks %} {% set _ = updated.append(d | combine({'gb': (d.gb | float | round(0, 'common') | int)})) %} {% endfor %} {{ updated }}
方案2:使用map结合元素遍历(简洁写法)
利用map遍历每个磁盘项,无需额外loop,直接在map中处理当前元素:
- name: Update disk sizes to integers set_fact: disks: "{{ disks | map('update', {'gb': (item.gb | float | round(0, 'common') | int)}) | list }}"
验证结果
执行任务后,disks变量会变为:
disks: - gb: 17 type: flat number: 12 - gb: 16 type: flat number: 12
内容的提问来源于stack exchange,提问作者Smily
相关产品推荐
相关产品推荐

