#ansible
#ansible
Вопрос:
У меня есть такой диктант
{"product_1": [
"account1",
"account2"
],
"product_2": [
"account1",
"account2"
],
...
"product_10": [
"account1",
"account2"
]}
Как отфильтровать этот dict на основе ключа?
Ответ №1:
Для этого существуют специальные фильтры jinja2: selectattr
и rejectattr
.
Но они работают со списком dicts, а не с самим dict. Вам придется использовать dict2items
и items2dict
обойти это.
Вот несколько примеров использования:
# Values are dicts, select only items with specific attribute defined.
result: "{{ my_dict | dict2items | selectattr('value.my_attribute', 'defined')
| list | items2dict }}"
# Values are lists (as in your example), check for an existing item value.
result: "{{ my_dict | dict2items | selectattr('value', 'contains', 'some item')
| list | items2dict }}"
# Values are dict. Reject elements when attributes has a specific value.
result: "{{ my_dict | dict2items | rejectattr('value.my_attribute', '==', 'Does not apply')
| list | items2dict }}"
Проверьте вышеупомянутую документацию и остальные фильтры для исчерпывающего представления всех возможностей.
Ответ №2:
вы могли бы использовать dict2items
для переформатирования элементов, чтобы иметь имена, которые вы ищете в качестве ключей, а затем передать их в map
filter, чтобы получить эти ключи:
---
- hosts: localhost
gather_facts: false
vars:
myvar:
product_1:
- account1
- account2
product_2:
- account1
- account2
product_10:
- account1
- account2
tasks:
- name: extract the list of keys
debug:
msg: '{{ myvar | dict2items | map(attribute="key") | list }}'
приветствия