Звучит так, как будто вы хотите извлечь UUID для текущего хоста, как указано в переменной ansible_hostname
.Вы можете сделать это следующим образом:
- name: debug using ansible_hostname
debug:
msg: >-
{{ [ansible_hostname] |
map('extract', dict(networker_vms.json |
json_query('vms[].[hostname,uuid]'))) | first }}
Это просто заменит mynames
в вашем примере, который является списком, на [ansible_hostname]
, который также является списком (состоящим из одного значения, содержимогоansible_hostname
).Это обеспечивает контекст списка, необходимый для фильтра map
.
Однако, если у вас есть одно значение, вам не нужно использовать фильтр map
;вместо этого вы можете просто сделать это:
- name: debug using ansible_hostname
debug:
msg: >-
{{ (networker_vms.json.vms |
selectattr('hostname', 'eq', ansible_hostname)|first).uuid }}
Обновление
Если у вас есть сочетание квалифицированных и неквалифицированных имен хостов, вы можете сделать что-то вроде этого:
- name: get my uuid
set_fact:
my_uuid: "{{ host_to_addr[item] }}"
when: my_uuid is not defined and item in host_to_addr
vars:
host_to_addr: "{{ dict(networker_vms.json | json_query('vms[].[hostname,uuid]')) }}"
loop:
- "{{ ansible_hostname }}"
- "{{ ansible_fqdn }}"
- debug:
var: my_uuid
Это зацикливает список имен хостов и устанавливает факт my_uuid
в зависимости от того, какой из них совпадает первым.
Вы также можете написать более сложное выражение для фильтра json_query
:
- name: get my uuid
debug:
msg: >-
{{ networker_vms.json.vms |
json_query('[?hostname == `%s` || hostname == `%s`].[uuid]|[]' % (
ansible_hostname, ansible_fqdn))|
first}}