как извлечь значения из списка словаря - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь получить значения из списка dict, но не могу получить точный вывод, который требуется

Использование сервера Linux с установленными версиями ansible 2.7.5 & jinja2 2.7.2.

Ниже приведен список значений 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}]

Требуемый выход:

Результат должен быть в формате dict и храниться в одной переменной.

Я ожидаю что-то вроде ниже в списке или в формате dict:

CACHE01: True, CACHE02: True, SCACHE01: False, SCACHE02: False

Указанные выше значения должны храниться в одной переменной.

Ответы [ 2 ]

0 голосов
/ 31 мая 2019

Задание ниже

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

дает:

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

Чтобы объединить логические значения, давайте создадим filter_plugins / bool_utils.py с 2 фильтрами bool_and и bool_or , которые применяют функции Python все (список) и любой (список) соответственно.

> 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": "SCACHE02 False"
"msg": "SCACHE01 False"
"msg": "CACHE02 True"

Игра ниже создает список

- 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
    }, 
    {
        "SCACHE02": false
    }, 
    {
        "SCACHE01": false
    }, 
    {
        "CACHE02": true
    }
]
0 голосов
/ 31 мая 2019

Вы должны выбрать правильный value для вашего результата:

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