如何在Ansible中为VM字典添加对应item字段并生成新字典?
在Ansible中为子字典添加同级键值对
原始数据
注意:你提供的原始JSON存在语法问题——results数组中的单个字典包含重复的item和vms键,这会导致后序键覆盖前序。修正后的有效原始数据如下:
ok: [localhost] => { "vm_info": { "results": [ { "item": "AP", "vms": [ {"VM": "1"}, {"VM": "2"}, {"VM": "2"} ] }, { "item": "US", "vms": [ {"VM": "1"}, {"VM": "2"}, {"VM": "2"} ] } ] } }
期望输出
"updated_vm": { "results": [ { "item": "AP", "vms": [ {"VM": "1", "item": "AP"}, {"VM": "2", "item": "AP"}, {"VM": "2", "item": "AP"} ] }, { "item": "US", "vms": [ {"VM": "1", "item": "US"}, {"VM": "2", "item": "US"}, {"VM": "2", "item": "US"} ] } ] }
实现方法
可以通过Ansible的combine和map过滤器结合Jinja2模板语法实现,示例Playbook如下:
- name: 为VM字典添加对应item值 hosts: localhost vars: vm_info: results: - item: "AP" vms: - {"VM": "1"} - {"VM": "2"} - {"VM": "2"} - item: "US" vms: - {"VM": "1"} - {"VM": "2"} - {"VM": "2"} tasks: - name: 生成更新后的updated_vm数据 set_fact: updated_vm: results: "{{ vm_info.results | map('update_vms_item') | list }}" vars: update_vms_item: >- {% set current_item = item.item %} {{ item | combine({ 'vms': item.vms | map('combine', {'item': current_item}) | list }) }} - name: 打印更新后的数据 debug: var: updated_vm
逻辑说明
- 用
map过滤器遍历vm_info.results中的每个条目 - 对每个条目,取出当前的
item值(如"AP") - 用
combine过滤器将该item值合并到vms列表的每个字典中 - 用
combine替换原条目里的vms字段,最终生成新的results数组
相关文档参考
- Ansible官方文档的Filters章节:重点查看
combine、map过滤器的用法 - Ansible官方文档的Jinja2 Templates章节:了解Jinja2变量赋值、表达式语法
内容的提问来源于stack exchange,提问作者Ilya
相关产品推荐
相关产品推荐

