Estou tentando obter uma lista classificada corretamente pelo campo " nome " no exemplo de código abaixo:
---
- hosts: localhost
vars:
hosts:
- name: host2
uptime: 1d
- name: host10
uptime: 45d
- name: host1
uptime: 3m
tasks:
- name: version sort host list
debug:
#var: hosts | community.general.version_sort
#var: hosts | dictsort(false, 'value')
var: hosts | sort(attribute='name')
Como você pode ver, ele não classifica os nomes de host corretamente (host2 deve vir antes de host10). Procurei o filtro version_sort, mas ele não suporta classificação por atributo. Entendo que não estaria nessa situação se os nomes de host estivessem preenchidos corretamente. Mas é o que é. Pesquisei e não vi essa pergunta. Alguma outra ideia?
TASK [version sort host list] *************************************
ok: [localhost] => {
"hosts | sort(attribute='name')": [
{
"name": "host1",
"uptime": "3m"
},
{
"name": "host10", <-------
"uptime": "45d"
},
{
"name": "host2",
"uptime": "1d"
}
]
}
Resumo :
Obrigado a @Vladimir Botka por todas as opções! Consolidei a opção nº 3 e criei o manual abaixo. Observe que atualizei a lista de dicionários para torná-la um pouco mais complexa com o FQDN. Mas a solução funciona:
- hosts: localhost
vars:
hosts:
- {name: host2.example.com, uptime: 1d}
- {name: host10.example.com, uptime: 45d}
- {name: host1.example.com, uptime: 3m}
- {name: host3.example.com, uptime: 3m}
- {name: host15.example.com, uptime: 45d}
- {name: host20.example.com, uptime: 45d}
tasks:
# - debug:
# msg:
# - "index: {{ hosts | map(attribute='name') | community.general.version_sort }}"
# - "host_indexed: {{ dict(hosts|json_query('[].[name,@]')) }}"
# - "solution: {{ (hosts | map(attribute='name') | community.general.version_sort) | map('extract', dict(hosts|json_query('[].[name,@]'))) }}"
- debug:
var: (hosts | map(attribute='name') | community.general.version_sort) | map('extract', dict(hosts|json_query('[].[name,@]')))
Aqui está o resultado:
PLAY [localhost] *****************************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************************
ok: [localhost]
TASK [debug] *********************************************************************************************************************************************
[WARNING]: Collection community.general does not support Ansible version 2.14.17
ok: [localhost] => {
"(hosts | map(attribute='name') | community.general.version_sort) | map('extract', dict(hosts|json_query('[].[name,@]')))": [
{
"name": "host1.example.com",
"uptime": "3m"
},
{
"name": "host2.example.com",
"uptime": "1d"
},
{
"name": "host3.example.com",
"uptime": "3m"
},
{
"name": "host10.example.com",
"uptime": "45d"
},
{
"name": "host15.example.com",
"uptime": "45d"
},
{
"name": "host20.example.com",
"uptime": "45d"
}
]
}
PLAY RECAP ***********************************************************************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Há mais opções:
dá
Nota: Para padrões mais sofisticados, use expressões regulares do Python. Por exemplo, as declarações abaixo fornecem o mesmo resultado.
Combine o índice
dá
Agora, classifique a lista
dá
Exemplo de um manual completo para testes
dá
Agora, classifique o dicionário
dá o mesmo resultado, mas sem o atributo 'index'
Exemplo de um manual completo para testes
Use-o para classificar os nomes
dá
Use o atributo 'nome' como uma chave
dá
Agora, use a lista 'index' para extrair a lista ordenada
dá
Exemplo de um manual completo para testes