在Ansible字典中找到重复项

2024-03-28 10:39:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要检查两个子字典中是否没有使用同一个端口。在

my_dict:
  first:
    redis:
      port: 1234
  second:
    redis:
      port: 1235
  third:
    redis:
      port: 1234

在任务中,我可以使用以下方法:

^{pr2}$

这将返回:

['1234', '1235', '1234']

我需要的是,用某种方法只过滤重复项。所以我得到:

['1234', '1234']

回来了。在

基本上,我需要检查端口是否重复,如果它们应用了fail任务,检查并显示哪些项导致了冲突。在

有什么想法吗?在


Tags: 方法端口redis字典portmydictfirst
2条回答

非常感谢你的帮助马修!在

我觉得有点太难看了,有事实,等等,所以我决定只做一个过滤器插件迅速。。。或者更重要的是,对mathstuff.py文件进行添加。在

添加:

def duplicate(a):
    if isinstance(a, collections.Hashable):
        c = set(a)
    else:
        s = {}
        c = []

        for x in a:
            if x not in s:
                s[x] = 1
            else:
                if s[x] == 1:
                    c.append(x)
                s[x] += 1
    return c

在文件的主体部分,并添加:

^{pr2}$

进入:

class FilterModule(object):
    ''' Ansible math jinja2 filters '''

    def filters(self):
        filters = {

所以Jinja2知道过滤器。在

当我有时间的时候,我会发出一个请求,但是如果有人同时发现这个请求,或者如果您不想/不能更新Ansible,那么下面的方法非常有用:

- debug:
    msg: '{{ my_dict | dict2items | map(attribute="value.redis.port") | list | duplicate }}'

退货:

['1234']

我用大得多的样本做了一些测试,结果如愿。在

享受吧!

@stacksonstacks链接到的过滤器在这种特定情况下是没有帮助的,因为端口的填充总是相同的,只是它们的数量发生变化:set([1,2,2,2]) == set([1,2])总是True

所以我们真正想要的是按端口分组,寻找长度大于1的子节点。然后,我们可以提取导致冲突的密钥的名称,以便报告它们。在

tasks:
- set_fact:
    bogus: >-
      {%- for port_num, dicts in (my_dict | dict2items | groupby('value.redis.port'))
          if (dicts|length) > 1 -%}
      {{ dicts | map(attribute='key') | list }}
      {%- endfor -%}

- debug: var=item
  when: '{{ (bogus | length) > 0 }}'
  with_items: '{{ bogus }}'

相关问题 更多 >