基于项目类型的词典中的Ansible set_事实

基于项目类型的词典中的Ansible set_事实,ansible,jinja2,Ansible,Jinja2,我正在从Kubernetes配置图(cm\u config如下)中阅读一本字典,并使用它替换defaults/main.yml中设置的变量,如下所示: - name: 'Overwrite defaults' set_fact: "{{ item.key }}={{ item.value }}" with_dict: "{{ cm_config }}" 只要这些项是简单变量,这种方法就行。但是只要一个项是另一个字典,我就要合并这些值 如何将其集成

我正在从Kubernetes配置图(
cm\u config
如下)中阅读一本字典,并使用它替换
defaults/main.yml
中设置的变量,如下所示:

- name: 'Overwrite defaults'
  set_fact: "{{ item.key }}={{ item.value }}"
  with_dict: "{{ cm_config }}"
只要这些项是简单变量,这种方法就行。但是只要一个
是另一个字典,我就要合并这些值


如何将其集成到上述任务中?我考虑运行两次循环,进行某种类型的类型检查。我不知道这是怎么回事。此外,我相信可能有更好的方法?

下面的一个解决方案可以在一个任务中实现您的需求,只需一点jinja2模板和一个获取现有
dict
内容的方法。关键是根据变量类型计算值

请注意,这并没有考虑var是一个
列表
的情况,该列表将被替换为所有其他类型的值。这既不会处理现有变量和配置映射之间的类型不匹配问题。e、 g.如果您现有的var是
string
,并且配置映射a
dict
中对应的var将中断

以下剧本:

---
-主机:本地主机
收集事实:错误
变量:
配置:
标签1:toto
标签2:
a_值:1
其他_值:2
标签3:
a_值:3
其他_值:4
标签4:塔塔
label1:我开始玩了
标签3:
我是一个可怜的孤独的牛仔
任务:
-名称:显示初始状态
调试:
变量:“{item.key}}”
使用命令:{{cm_config}}”
-名称:配置映射中的进程值
变量:
我的价值:>-
{%if item.value为映射%}
{{lookup('vars',item.key,default={})| combine(item.value)}
{%else%}
{{item.value}}
{%endif%}
设定事实:
“{item.key}}”:“{{my_value}”
使用命令:{{cm_config}}”
-名称:处理配置映射后显示结果
调试:
变量:“{item.key}}”
使用命令:{{cm_config}}”
给出以下结果:

PLAY [localhost] ****************************************************************************************************************************************************************************************************************************

TASK [show initial state] *******************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=label1) => {
    "ansible_loop_var": "item",
    "item": {
        "key": "label1",
        "value": "toto"
    },
    "label1": "I am set in play"
}
ok: [localhost] => (item=label2) => {
    "ansible_loop_var": "item",
    "item": {
        "key": "label2",
        "value": {
            "a_value": 1,
            "other_value": 2
        }
    },
    "label2": "VARIABLE IS NOT DEFINED!"
}
ok: [localhost] => (item=label3) => {
    "ansible_loop_var": "item",
    "item": {
        "key": "label3",
        "value": {
            "a_value": 3,
            "other_value": 4
        }
    },
    "label3": {
        "some_value": "I'm a poor lonesome cowboy"
    }
}
ok: [localhost] => (item=label4) => {
    "ansible_loop_var": "item",
    "item": {
        "key": "label4",
        "value": "tata"
    },
    "label4": "VARIABLE IS NOT DEFINED!"
}

TASK [Process values from config map] *******************************************************************************************************************************************************************************************************
ok: [localhost] => (item={'key': 'label1', 'value': 'toto'})
ok: [localhost] => (item={'key': 'label2', 'value': {'a_value': 1, 'other_value': 2}})
ok: [localhost] => (item={'key': 'label3', 'value': {'a_value': 3, 'other_value': 4}})
ok: [localhost] => (item={'key': 'label4', 'value': 'tata'})

TASK [Show the result after processing config map] ******************************************************************************************************************************************************************************************
ok: [localhost] => (item=label1) => {
    "ansible_loop_var": "item",
    "item": {
        "key": "label1",
        "value": "toto"
    },
    "label1": " toto "
}
ok: [localhost] => (item=label2) => {
    "ansible_loop_var": "item",
    "item": {
        "key": "label2",
        "value": {
            "a_value": 1,
            "other_value": 2
        }
    },
    "label2": " {'a_value': 1, 'other_value': 2} "
}
ok: [localhost] => (item=label3) => {
    "ansible_loop_var": "item",
    "item": {
        "key": "label3",
        "value": {
            "a_value": 3,
            "other_value": 4
        }
    },
    "label3": " {'some_value': \"I'm a poor lonesome cowboy\", 'a_value': 3, 'other_value': 4} "
}
ok: [localhost] => (item=label4) => {
    "ansible_loop_var": "item",
    "item": {
        "key": "label4",
        "value": "tata"
    },
    "label4": " tata "
}

PLAY RECAP **********************************************************************************************************************************************************************************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0