首页 > 解决方案 > 如何在ansible中修改深度字典中的多个值

问题描述

在我的 ansible 中,我需要进行一次休息调用以获取一个相当大的 json 对象(它以 dict 的形式出现)。然后我需要修改json中的几个字段并重新发布以更新我要更改的组件的状态。

我已经有了其余的响应,我正在尝试弄清楚如何干净地修改众多值。我目前的尝试看起来像这样(简化了一点):

- name: update locations for remote processor
  set_fact:
    request: "{{ response.json | combine(item)}}"
  loop:
    - { 'component': { 'targetUri': "{{remoteProcessorUri}}"
    - { 'component': { 'targetUris': "{{remoteProcessorUri}}"
    ...

不幸的是,虽然这确实改变了请求,但它用仅包含 targetUri 的 dict 替换了较大的组件 dict,组件中的所有其他内容都被删除了,因为我想保留它并且只修改 targetUri。

我尝试了一个变体,其中我的循环对每个项目都有一个位置和一个值字段,但我无法正确获取位置字段语法,以便能够用 item.location 替换 response.json。

那么我怎样才能创建它以使其变得容易和可读,在我的 dict 中进行各种更改而不更改除我调用的特定子字段之外的任何内容?

标签: ansible

解决方案


事实证明我几乎是正确的。我所需要的只是将 recursive=true 选项添加到组合过滤器中。所以...

- name: update locations for remote processor
  set_fact:
    request: "{{ response.json | combine(item, recursive=True)}}"
  loop:
    - { 'component': { 'targetUri': "{{remoteProcessorUri}}"
    - { 'component': { 'targetUris': "{{remoteProcessorUri}}"
    ...

推荐阅读