gpt4 book ai didi

Ansible:如何从列表字典中提取值

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

我正在尝试从 dict 列表中获取值,但无法获得所需的确切输出

使用安装了 ansible 2.7.5 和 jinja2 2.7.2 版本的 Linux 服务器。

下面是dict值列表。

DOMAIN_GROUPS_ASSIGNMENT:


CACHE01:
- domain_group: DG1
is_active: true
- domain_group: DG2
is_active: true
- domain_group: DG3
is_active: true
CACHE02:
- domain_group: DG4
is_active: true
- domain_group: DG5
is_active: true
- domain_group: DG6
is_active: true

SCACHE01:
- domain_group: DG1
is_active: false
- domain_group: DG2
is_active: false
- domain_group: DG3
is_active: true
SCACHE02:
- domain_group: DG4
is_active: false
- domain_group: DG5
is_active: false
- domain_group: DG6
is_active: false

到目前为止尝试使用以下代码:

- debug:
msg: "KEY: {{ item.key }}, VALUE: {{ item.value }}"
loop: "{{ lookup('dict', DOMAIN_GROUPS_ASSIGNMENT) }}"

我得到的输出是:

TASK [debug] ************************************************************************************************************************************************
task path: /u02/netcracker/reir1015_test/singlesite/test.yml:7
Friday 31 May 2019 08:54:59 -0400 (0:00:00.058) 0:00:00.897 ************
ok: [localhost] => (item={'key': u'CACHE01', 'value': [{u'is_active': True, u'domain_group': u'DG1'}, {u'is_active': True, u'domain_group': u'DG2'}, {u'is_active': True, u'domain_group': u'DG3'}]}) => {}

MSG:

KEY: CACHE01, VALUE: [{u'domain_group': u'DG1', u'is_active': True}, {u'domain_group': u'DG2', u'is_active': True}, {u'domain_group': u'DG3', u'is_active': True}]

ok: [localhost] => (item={'key': u'SCACHE02', 'value': [{u'is_active': False, u'domain_group': u'DG4'}, {u'is_active': False, u'domain_group': u'DG5'}, {u'is_active': False, u'domain_group': u'DG6'}]}) => {}

MSG:

KEY: SCACHE02, VALUE: [{u'domain_group': u'DG4', u'is_active': False}, {u'domain_group': u'DG5', u'is_active': False}, {u'domain_group': u'DG6', u'is_active': False}]

ok: [localhost] => (item={'key': u'SCACHE01', 'value': [{u'is_active': False, u'domain_group': u'DG1'}, {u'is_active': False, u'domain_group': u'DG2'}, {u'is_active': True, u'domain_group': u'DG3'}]}) => {}

MSG:

KEY: SCACHE01, VALUE: [{u'domain_group': u'DG1', u'is_active': False}, {u'domain_group': u'DG2', u'is_active': False}, {u'domain_group': u'DG3', u'is_active': True}]

ok: [localhost] => (item={'key': u'CACHE02', 'value': [{u'is_active': True, u'domain_group': u'DG4'}, {u'is_active': True, u'domain_group': u'DG5'}, {u'is_active': True, u'domain_group': u'DG6'}]}) => {}

MSG:

KEY: CACHE02, VALUE: [{u'domain_group': u'DG4', u'is_active': True}, {u'domain_group': u'DG5', u'is_active': True}, {u'domain_group': u'DG6', u'is_active': True}]

要求的输出:

结果应为字典格式,并存储在一个变量中。

我希望列表或字典格式如下所示:

CACHE01:真,CACHE02:真,SCACHE01:假,SCACHE02:假

上述值应该存储在一个变量中。

最佳答案

下面的任务

    - debug:
msg: "{{ item.key }} {{ item.value|json_query('[].is_active') }}"
loop: "{{ DOMAIN_GROUPS_ASSIGNMENT|dict2items }}"

给出:

  msg: CACHE01 [True, True, True]
msg: CACHE02 [True, True, True]
msg: SCACHE01 [False, False, True]
msg: SCACHE02 [False, False, False]

过滤器 map 而不是 json_query 给出相同的结果

    - debug:
msg: "{{ item.key }} {{ item.value|map(attribute='is_active')|list }}"
loop: "{{ DOMAIN_GROUPS_ASSIGNMENT|dict2items }}"

(在 Ansible 2.3 及更低版本中)为了组合逻辑值,让我们创建 filter_plugins/bool_utils.py带有 2 个过滤器 bool_andbool_or 分别应用 Python 函数 all(list)any(list)

    shell> cat filter_plugins/bool_utils.py
def bool_and(h):
return all(h)
def bool_or(h):
return any(h)
class FilterModule(object):
''' utility filters for operating on list of Boolean '''
def filters(self):
return {
'bool_and' : bool_and,
'bool_or' : bool_or,
}

下面的任务带有过滤器bool_and

    - debug:
msg: "{{ item.key }} {{ item.value|json_query('[].is_active')
|bool_and }}"
loop: "{{ DOMAIN_GROUPS_ASSIGNMENT|dict2items }}"

给予

  msg: CACHE01 True
msg: CACHE02 True
msg: SCACHE01 False
msg: SCACHE02 False

下面的任务创建列表status

    - set_fact:
status: "{{ status|default([]) +
[{item.key: item.value|json_query('[].is_active')
|bool_and}] }}"
loop: "{{ DOMAIN_GROUPS_ASSIGNMENT|dict2items }}"
- debug:
var: status

给予

  status:
- CACHE01: true
- CACHE02: true
- SCACHE01: false
- SCACHE02: false

(在 Ansible 2.4. 及更高版本中) 有测试 any, all可用的。下面的任务给出了相同的结果

    - debug:
msg: "{{ item.key }} {{ item.value|json_query('[].is_active') is all }}"
loop: "{{ DOMAIN_GROUPS_ASSIGNMENT|dict2items }}

关于Ansible:如何从列表字典中提取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56395331/

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