Ansible:将字典合并到嵌套字典内指定列表项中
解决Ansible中合并字典到列表指定项的问题
我通过import_playbook调用准备playbook获取了service_secrets字典,需要将其合并到product.dependencies中Source为"S3"的列表项内,但使用combine()时错误地新增了列表项而非合并到目标项。
方法一:使用map遍历合并
这种方法通过遍历dependencies列表,仅对Source为"S3"的项合并service_secrets:
- name: 合并S3凭据到对应依赖项 set_fact: updated_product: >- {{ product | combine({ 'dependencies': product.dependencies | map('combine', item if item.Source == 'S3' else {}) | list }) }} vars: item: "{{ service_secrets }}"
方法二:通过索引定位替换
先找到目标项的索引,再替换为合并后的字典:
- name: 获取S3依赖项的索引 set_fact: s3_dep_index: "{{ product.dependencies | index_of('item.Source == \"S3\"', wantlist=False) }}" - name: 合并凭据到S3依赖项 set_fact: updated_product: >- {{ product | combine({ 'dependencies': product.dependencies[:s3_dep_index] + [product.dependencies[s3_dep_index] | combine(service_secrets)] + product.dependencies[s3_dep_index+1:] }) }}
错误原因分析
你之前的代码存在两个核心问题:
- 使用
loop遍历dependencies时,每次循环都会执行combine并通过list_merge="append"追加新列表项,导致service_secrets被作为独立项重复添加。 combine({"dependencies": [service_secrets]}, list_merge="append")的逻辑是将[service_secrets]直接追加到原列表末尾,而非合并到已有项的字典中。
验证结果
合并后的updated_product.dependencies中,Source为"S3"的项会包含原有的字段(Name、Source、Type、Bucket)以及service_secrets中的Access_key_id、Access_key_secret、Endpoint字段。若存在重复键(如Bucket),combine会用service_secrets中的值覆盖原有值(此处两者值一致,无影响)。
内容的提问来源于stack exchange,提问作者Daniel Koerner
相关产品推荐
相关产品推荐

