【问题标题】:Ansible, merge dictionaries into onceAnsible,将字典合并到一次
【发布时间】:2019-07-10 17:26:39
【问题描述】:

我有这个示例 yaml 文件 (haproxy.yml):

---
rules:
  aa:
    PHP53:
      - url: php53-1-aa.my-example.com
    PHP55:
      - url: php55-1-aa.my-example.com
    PHP56:
      - url: php56-1-aa.my-example.com
      - url: php56-2-aa.my-example.com
      - url: php56-3-aa.my-example.com
    PHP72:
      - url: php72-1-aa.my-example.com
      - url: php72-2-aa.my-example.com
      - url: php72-3-aa.my-example.com
  bb:
    PHP53:
      - url: php53-1-bb.my-example.com
      - url: php53-2-bb.my-example.com
      - url: php53-3-bb.my-example.com

    PHP55:
      - url: php55-1-bb.my-example.com
    PHP56:
      - url: php56-1-bb.my-example.com
      - url: php56-2-bb.my-example.com
      - url: php56-3-bb.my-example.com
    PHP72:
      - url: php72-1-bb.my-example.com
      - url: php72-2-bb.my-example.com
      - url: php72-3-bb.my-example.com
  cc:
    PHP55:
      - url: php55-1-cc.my-example.com
    PHP56:
      - url: php56-1-cc.my-example.com
      - url: php56-2-cc.my-example.com
      - url: php56-3-cc.my-example.com
...

我使用这个剧本来加载这个文件:

---
- name: 'stack-example'
  hosts: localhost
  gather_facts: no
  tasks:
    - name: 'include'
      include_vars:
        file: 'haproxy.yml'

    - set_fact:
        try: '{{ try|default({}) | combine(item.value) }}'
      loop: '{{ lookup("dict", rules) }}'

    - debug:
        var: try

所有文件都是两个解释和重现我的问题:-)

我需要使用set_fact 来处理我的变量。

我的主要目标是将所有 PHP** 合并/分组为一组。 这是我需要的一个例子,我用combinemaplookup尝试了很多东西,但没有给我预期的结果。

我试试这个:

{
  "PHP53": [
      { "url": "php53-1-aa.my-example.com" },
      { "url": "php53-1-bb.my-example.com" },
      { "url": "php53-2-bb.my-example.com" },
      { "url": "php53-3-bb.my-example.com" }
  ],
  "PHP55": [
      { "url": "php55-1-aa.my-example.com" },
      { "url": "php55-1-bb.my-example.com" },
      { "url": "php55-1-cc.my-example.com" }
  ],
  "PHP56": [
      { "url": "php56-1-aa.my-example.com" },
      { "url": "php56-2-aa.my-example.com" },
      { "url": "php56-3-aa.my-example.com" },
      { "url": "php56-1-bb.my-example.com" },
      { "url": "php56-2-bb.my-example.com" },
      { "url": "php56-3-bb.my-example.com" },
      { "url": "php56-1-cc.my-example.com" },
      { "url": "php56-2-cc.my-example.com" },
      { "url": "php56-3-cc.my-example.com" },
  ],
  "PHP72": [
      { "url": "php72-1-aa.my-example.com" },
      { "url": "php72-2-aa.my-example.com" },
      { "url": "php72-3-aa.my-example.com" },
      { "url": "php72-1-bb.my-example.com" },
      { "url": "php72-2-bb.my-example.com" },
      { "url": "php72-3-bb.my-example.com" }
  ]
}

如果有人有这样做的想法? 非常感谢您的帮助 最好的问候

【问题讨论】:

    标签: ansible yaml jinja2


    【解决方案1】:

    下面的任务完成了

    - set_fact:
        rules_grouped: "{{ rules_grouped|
                           default({})|
                           combine({item.0: item.1|json_query('[].value')|flatten})
                           }}"
      loop: "{{ rules|
                dict2items|
                json_query('[*].value')|
                map('dict2items')|list|flatten|
                groupby('key')
                }}"
    

    要了解循环的工作原理,请将其调试并逐步添加过滤器。

       - debug
           msg: "{{ rules|
                    dict2items
                    }}"
    
       - debug
           msg: "{{ rules|
                    dict2items|
                    json_query('[*].value')
                    }}"
    
       - debug
           msg: "{{ rules|
                    dict2items|
                    json_query('[*].value')|
                    map('dict2items')|list|flatten
                    }}"
    
       - debug
           msg: "{{ rules|
                    dict2items|
                    json_query('[*].value')|
                    map('dict2items')|list|flatten|
                    groupby('key')
                    }}"
    

    【讨论】:

    • 嗨弗拉基米尔,感谢新时代的帮助 :-) 你的解决方案是我所期望的新时代。我不明白它是如何运作的,但我会学习的。非常感谢。
    • 使用调试查看循环非常容易。我已经更新了答案。
    猜你喜欢
    • 2020-12-28
    • 2014-10-14
    • 2022-07-05
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 2020-11-13
    • 1970-01-01
    相关资源
    最近更新 更多