Я хочу преобразовать следующие списки:
rtt: [38,1,97]
site: ["A","B","C"]
в словарь, например:
dict: [ {'rtt':38, 'site':'A'},{'rtt':1, 'site':'B'},{'rtt':97,'site':'C'}]
поэтому я могу отсортировать его по rtt, используя:
x = dict | sort(attribute:'rtt')
а затем извлеките атрибут сайта в правильном порядке:
x | map(attribute:'site') | list
должен дать: [ 'B', 'A', 'C']
Ладно, я понял:
- name: create dict list variable, NICE ONE
set_fact:
SITES_DICT: "{{ SITES_DICT|default([]) + [{'site': item.1,'rtt': item.0}] }}"
with_together:
- "{{ rtt }}"
- "{{ site }}"
- debug:
msg: "{{ SITES_DICT }}"
verbosity: 1
- name: extract sites in sequence of rtt (!!)
set_fact:
sites_list: "{{ SITES_DICT | sort(attribute='rtt') | map(attribute='site') | list }}"
Вот пример использования zip для получения результатов. Это позволит вам делать все за одну задачу без промежуточных set_fact / registers, создающих переменные.
- hosts: localhost
gather_facts: no
vars:
rtt: [38,1,97]
site: ["A","B","C"]
tasks:
- debug:
msg: |
{{ site | zip(rtt) | sort(attribute='1') |
map(attribute='0') | list }}
# TASK [debug] ***************************
# ok: [localhost] => {
# "msg": [
# "B",
# "A",
# "C"
# ]
# }
- debug:
msg: |
{{ site | zip(rtt) | sort(attribute='1') }}
# TASK [debug] ***************************
# ok: [localhost] => {
# "msg": [
# [
# "B",
# 1
# ],
# [
# "A",
# 38
# ],
# [
# "C",
# 97
# ]
# ]
# }