Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 如何在Ansible中向现有词典添加项?_List_Dictionary_Ansible_Ansible Inventory - Fatal编程技术网

List 如何在Ansible中向现有词典添加项?

List 如何在Ansible中向现有词典添加项?,list,dictionary,ansible,ansible-inventory,List,Dictionary,Ansible,Ansible Inventory,我有一本字典,由以下剧本加载: - name: Get variables from ../main.yml and save them into dict include_vars: file: "../main.yml" name: dict dict包含以下内容: "dict": { "environments": { "MYENV": { "key1": "value1", "key2": "value2" },

我有一本字典,由以下剧本加载:

- name: Get variables from ../main.yml and save them into dict
  include_vars:
    file: "../main.yml"
    name: dict
dict包含以下内容:

"dict": {
"environments": {
    "MYENV": {
        "key1": "value1",
        "key2": "value2"
    },
    "MYENV2": {
        "key1": "value1",
        "key2": "value2"
    },
    "MYENV3": {
        "key1": "value1",
        "key2": "value2"
    }
}}
"new_dict": {
"environments": {
    "MYENV": {
        "key1": "value1",
        "key2": "value2",
        "key3": "value3"
    },
    "MYENV2": {
        "key1": "value1",
        "key2": "value2",
        "key3": "value3"
    },
    "MYENV3": {
        "key1": "value1",
        "key2": "value2",
        "key3": "value3"
    }
}}
问题:我如何在Ansible中循环浏览此词典,并在环境中的每个条目中添加第三个键3和伴随值

理想的情况将是一个新的目录,其中包含以下内容:

"dict": {
"environments": {
    "MYENV": {
        "key1": "value1",
        "key2": "value2"
    },
    "MYENV2": {
        "key1": "value1",
        "key2": "value2"
    },
    "MYENV3": {
        "key1": "value1",
        "key2": "value2"
    }
}}
"new_dict": {
"environments": {
    "MYENV": {
        "key1": "value1",
        "key2": "value2",
        "key3": "value3"
    },
    "MYENV2": {
        "key1": "value1",
        "key2": "value2",
        "key3": "value3"
    },
    "MYENV3": {
        "key1": "value1",
        "key2": "value2",
        "key3": "value3"
    }
}}

value3是一个类似MYENV+value1+value2的字符串。

需要对目录进行分解。然后添加{key3:value3},再次创建目录。下面的任务

  vars:
    add_this:
      key3: value3
  tasks:
    - set_fact: # collect dictionary keys
        keys: "{{ dict.environments|
                  dict2items|
                  json_query('[].key') }}"
    - set_fact: # collect dictionary values and add item
        values: "{{ dict.environments|
                    dict2items|
                    json_query('[].value')|
                    map('combine', add_this)|list }}"
    - set_fact: # create dict environments
        environments: "{{ environments|
                          default({})|
                          combine({item.0: item.1}) }}"
      loop: "{{ keys|zip(values)|list }}"
    - set_fact: # create dictionary new_dict
        new_dict: "{{ new_dict|
                      default({})|
                      combine({'environments': environments}) }}"
    - debug:
        var: new_dict
  tasks:
    - set_fact: 
        env: "{{ env|default({})|
                 combine({item: dict.environments[item]|
                                dict_merge((dict.environments[item]|custom_1), True)
                                }) }}"
      loop: "{{ dict.environments|dict_keys }}"
    - set_fact:
        new_dict: "{{ {}|combine({'environments': env}) }}"
    - debug:
        var: new_dict
给予

鉴于所有值都是不同的,我如何通过添加key1和key2的值等方式为每个环境动态创建value3

有几个过滤器

$ cat filter_plugins/filter1.py
def custom_1(h):
    return {'key3': h.values()}

def dict_merge(x, y, recursive=False):
    if recursive:
        z = dict(list(x.items()) + list(y.items()))
    else:
        z = x.copy()
        z.update(y)
    return z

def dict_keys(d):
    return list(d)


class FilterModule(object):

    def filters(self):
        return {
            'custom_1' : custom_1,
            'dict_keys' : dict_keys,
            'dict_merge' : dict_merge
        }
下面的任务

  vars:
    add_this:
      key3: value3
  tasks:
    - set_fact: # collect dictionary keys
        keys: "{{ dict.environments|
                  dict2items|
                  json_query('[].key') }}"
    - set_fact: # collect dictionary values and add item
        values: "{{ dict.environments|
                    dict2items|
                    json_query('[].value')|
                    map('combine', add_this)|list }}"
    - set_fact: # create dict environments
        environments: "{{ environments|
                          default({})|
                          combine({item.0: item.1}) }}"
      loop: "{{ keys|zip(values)|list }}"
    - set_fact: # create dictionary new_dict
        new_dict: "{{ new_dict|
                      default({})|
                      combine({'environments': environments}) }}"
    - debug:
        var: new_dict
  tasks:
    - set_fact: 
        env: "{{ env|default({})|
                 combine({item: dict.environments[item]|
                                dict_merge((dict.environments[item]|custom_1), True)
                                }) }}"
      loop: "{{ dict.environments|dict_keys }}"
    - set_fact:
        new_dict: "{{ {}|combine({'environments': env}) }}"
    - debug:
        var: new_dict
给予


根据您的需要安装自定义_1过滤器

谢谢大家!!我现在达到了我想要达到的目标的90%。考虑到所有值都是不同的,我如何通过添加key1和key2的值来为每个环境动态创建value3?当然,我已经更新了答案。请随意定制。还有其他的。