Dictionary 在ansible中组合嵌套词典

Dictionary 在ansible中组合嵌套词典,dictionary,ansible,Dictionary,Ansible,我有两个不同的字典,其中包含我需要连接在一起的应用程序信息 景观词典: { "app_1": { "Category": "application", "SolutionID": "194833", "Availability": null, "Environment": "stage", "Vendor/Manufacturer": null }, "app_2": false } { "app_1": { "app_id":

我有两个不同的字典,其中包含我需要连接在一起的应用程序信息

景观词典:

{
  "app_1": {
    "Category": "application",
    "SolutionID": "194833",
    "Availability": null,
    "Environment": "stage",
    "Vendor/Manufacturer": null
  },
  "app_2": false
}
{
  "app_1": {
    "app_id": "6886817",
    "owner": "owner1@nomail.com",
    "prod": [
      "server1"
    ],
    "stage": []
  },
  "app_2": {
    "app_id": "3415012",
    "owner": "owner2@nomail.com",
    "prod": [
      "server2"
    ],
    "stage": [
      "server3"
    ]
  }
}
应用程序信息字典:

{
  "app_1": {
    "Category": "application",
    "SolutionID": "194833",
    "Availability": null,
    "Environment": "stage",
    "Vendor/Manufacturer": null
  },
  "app_2": false
}
{
  "app_1": {
    "app_id": "6886817",
    "owner": "owner1@nomail.com",
    "prod": [
      "server1"
    ],
    "stage": []
  },
  "app_2": {
    "app_id": "3415012",
    "owner": "owner2@nomail.com",
    "prod": [
      "server2"
    ],
    "stage": [
      "server3"
    ]
  }
}
这是我用来连接两个字典的代码

- set_fact:
    uber_dict: "{{app_info_dictionary}}"

- set_fact:
    uber_dict: "{{ uber_dict | default ({}) | combine(new_item, recursive=true) }}"
  vars:
    new_item: "{ '{{item.key}}' : { 'landscape': '{{landscape_dictionary[item.key]|default(false)}}' } }"
  with_dict: "{{ uber_dict }}"

- debug:
    msg: "{{item.key}}: {{item.value}}"
  with_dict: "{{uber_dict}}"
如果横向词典中的值为false,它将毫无问题地将其添加到uber词典中。但如果该值包含信息,则会失败

这就是错误:

fatal: [127.0.0.1]: FAILED! => {"msg": "|combine expects dictionaries, got u\"{ 'app_1' : { 'landscape': '{u'Category': u'application', u'SolutionID': u'194820', u'Availability': None, u'Environment': 'stage', u'Vendor/Manufacturer': None}' } }\""}
有什么问题吗?
在set_事实中设置var时,是否需要进行额外的合并


谢谢

此语法不合法,或者至少不符合您的想法:

new_item: "{ '{{item.key}}' : { 'landscape': '{{landscape_dictionary[item.key]|default(false)}}' } }"
最重要的是,ansible只会将JSON字符串自动强制为
dict
,但您已经使用了python语法

其次,动态构造dict的方法不是使用jinja2构建文本,而是使用jinja2几乎是一种编程语言的事实:

new_item: "{{
  {
    item.key: {
      'landscape': landscape_dictionary[item.key]|default(false)
    }
  }
}}"

每当你发现自己使用嵌套的jinja2插值块时,你就会觉得这是一种代码味道,你把这个问题想得太多了,就像文本一样(所谓嵌套,我的意思是
{something{{nested}}else}}

我几分钟前意识到了这一点,我正要回答。感谢所有在互联网上寻找“如何在ansible中组合嵌套词典”答案的人,答案是
|combine(新的_项,recursive=true)
@DustWolf
recursive=true
这是我一直在寻找的魔法,大约2天了!Ansible在没有它的情况下有一些最奇怪的行为!它有时会扩展、重写或重新排列你的口述,当你完全困惑时,它会这样做。非常感谢您提供的联合收割机参数,使其真正起作用!