gpt4 book ai didi

ansible - 在 Ansible 中有条件地合并主要和次要字典

转载 作者:行者123 更新时间:2023-12-01 12:16:03 25 4
gpt4 key购买 nike

我正在尝试合并两个包含多个应用程序设置的词典。在附加到各个主机的主字典中,它包含特定于该服务器的内容(例如,与应用程序的 git 存储库相关的版本):

proj/host_vars/host_name.yml

installed_apps:
pineapple:
version: master
pear:
version: "1.1"

然后第二个包含特定于应用程序的所有设置:

proj/group_vars/apps.yml

all_apps:
pineapple:
setting1: blah
setting2: di
setting3: blah
apple:
setting1: hi
pear:
setting3: there

从这些我想构建一个字典,结合两者的值但前提是该应用程序存在于“installed_apps”中,以便 ansible 具有它需要安装的所有应用程序的所有详细信息某台服务器:

new_dict:
pineapple:
version: master
setting1: blah
setting2: di
setting3: blah
pear:
version: "1.1"
setting3: there

在 Python 中它会是这样的:

installed_apps = {
"pineapple": {"version": "master"},
"pear": {"version": "1.1"}
}

all_apps = {
'pineapple': {'setting1': 'blah', 'setting2': 'di', 'setting3': 'blah'},
'apple': {'setting1': 'hi'},
'pear': {'setting3': 'there'}
}

new_dict = dict()
for k, v in all_apps.items():
if k in installed_apps:
new_dict[k] = v
new_dict[k].update(installed_apps[k])

但我一辈子都想不出如何在 Ansible 中做到这一点。

最佳答案

您可以使用 Ansible 的 combine 来做到这一点筛选。

以下示例假设如下:

- hosts: localhost
gather_facts: false
vars:
installed_apps:
pineapple:
version: master
pear:
version: "1.1"
all_apps:
pineapple:
setting1: blah
setting2: di
setting3: blah
apple:
setting1: hi
pear:
setting3: there

首先,我们创建一个新字典 (installed_app_settings),其中包含 all_apps 中与 installed_apps 中具有匹配键的项目:

- set_fact:
installed_app_settings: >
{{ (installed_app_settings|default([])) + [{item: all_apps[item]}] }}
with_items: "{{ installed_apps }}"

- debug:
var: installed_app_settings

现在我们使用它来更新 installed_apps 变量,其中包含在之前的 set_fact 任务中提取的值:

- set_fact:
installed_apps: >
{{ installed_apps|combine(item, recursive=True) }}
with_items: "{{ installed_app_settings }}"

- debug:
var: installed_apps

结果是:

ok: [localhost] => {
"installed_apps": {
"pear": {
"setting3": "there",
"version": "1.1"
},
"pineapple": {
"setting1": "blah",
"setting2": "di",
"setting3": "blah",
"version": "master"
}
}
}

...我认为这就是您所追求的。

关于ansible - 在 Ansible 中有条件地合并主要和次要字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48171374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com