Просмотр документации для фильтра json_query Ansible у них есть пример, который может быть вам полезен.
С учетом структуры данных:
domain_definition:
domain:
cluster:
- name: "cluster1"
- name: "cluster2"
server:
- name: "server11"
cluster: "cluster1"
port: "8080"
- name: "server12"
cluster: "cluster1"
port: "8090"
- name: "server21"
cluster: "cluster2"
port: "9080"
- name: "server22"
cluster: "cluster2"
port: "9090"
library:
- name: "lib1"
target: "cluster1"
- name: "lib2"
target: "cluster2"
Они предоставляют пример для запроса нескольких значений, сопоставленных как хэши с результирующим выводом.
В этом примере мы получаем хеш-карту со всеми портами и именами кластера. :
- name: "Display all server ports and names from cluster1"
debug:
var: item loop: "{{ domain_definition | json_query(server_name_cluster1_query) }}"
vars:
server_name_cluster1_query: "domain.server[?cluster=='cluster2'].{name: name, port: port}"
Обратите внимание, что они используют только vars:
для определения запроса, якобы для удобства чтения, но здесь есть важный бит:
domain.server[?cluster=='cluster2'].{name: name, port: port}
Таким образом, они запрашивают domain.server (который представляет собой список словарей, каждый с одинаковыми атрибутами), выбирая только те, у которых значение cluster
равно cluster2
, а затем для каждого из возвращаемыхname
как name
и port
как port
.
В вашем случае вы хотите вернуть несколько атрибутов, но не хотите выбирать элементы с конкретными значениями. Таким образом, вы можете использовать что-то более похожее на:
msg: "{{ my_var | json_query('domain.server[*].{name: name, cluster: cluster}') }}"
Вывод, который я получаю:
"msg": [
{
"cluster": "cluster1",
"name": "server11"
},
{
"cluster": "cluster1",
"name": "server12"
},
{
"cluster": "cluster2",
"name": "server21"
},
{
"cluster": "cluster2",
"name": "server22"
}
]
TLDR: адаптированный к вашему конкретному вопросу и варианту использования, я думаю, что вы хотите:
msg: "{{ output.ansible_facts.openstack_servers | json_query('[*].{status: status, flavor: flavor, az: az}') }}"
Спасибо, надеюсь, это поможет!