#json #ansible
#json #ansible
Вопрос:
Я пытаюсь извлечь значения vs_name
для каждого элемента в списке массивов, но, похоже, я что-то делаю неправильно, но не могу понять это.
Вот результат, который я хочу проанализировать
ok: [localhost] => {
"msg": {
"AV-FAS": {
"vs_name": "AV-FAS",
"vs_type": "admin"
},
"AV-FAS-01": {
"vs_name": "AV-FAS-01",
"vs_type": "node"
},
"AV-FAS-02": {
"vs_name": "AV-FAS-02",
"vs_type": "node"
}
Вот мой код:
- name: populate vs list
set_fact:
vs_list: "{{ vs_list|default([]) }} [ '{{ item.vs_name }}' ]"
with_items: "{{ output }}"
Ответ №1:
Вопрос: «Извлеките значения vs_name».
A: Используйте filter json_query. Например
- set_fact:
vs_list: "{{ output|json_query('*.vs_name') }}"
дает
"vs_list": [
"AV-FAS",
"AV-FAS-01",
"AV-FAS-02"
]
Следующий вариант — сопоставление атрибута. Фильтр dict2items необходим для преобразования словаря в список. Например, задача ниже дает тот же результат
- set_fact:
vs_list: "{{ output|dict2items|
map(attribute='value.vs_name')|
list }}"
Вопрос: «Перечислите vs_name, когда vs_type = ‘admin’«
A: Добавьте фильтр selectattr в канал. Например
- set_fact:
vs_list: "{{ output|dict2items|
selectattr('value.vs_type', 'eq', 'admin')|
map(attribute='value.vs_name')|
list }}"
дает
"vs_list": [
"AV-FAS"
]
Комментарии:
1. спасибо, это работает. Что, если я затем захочу добавить vs_name, когда vs_type = «admin»? Возможно ли это?
2. Пожалуйста. Да, это возможно. Я добавил пример. Откройте новый вопрос, если у вас есть другие проблемы.