Eu tenho uma lista de dicts como este:
list_of_dicts:
- name: Item1
- name: Item2
type: special
- name: Item3
- name: Item4
type: small
Como você pode ver, nem todos os itens têm um type
atributo. Contexto: Se nenhum type
atributo for definido, isso significa que o item é do tipo padrão.
Eu gostaria de selecionar todos os itens que NÃO são do tipo special
.
Eu tentei isso:list_of_dicts | rejectattr('type', 'equalto', 'special')
Infelizmente, isso falha com um AnsibleUndefinedVariable: 'dict object' has no attribute 'type'
erro porque alguns dos itens não têm um tipo.
Qual é uma boa maneira de resolver isso?
Editar: na verdade, não prestei atenção suficiente à última edição da resposta existente de @ranjandas e aos comentários a seguir. Minha primeira solução é quase semelhante. Eu acho que você está mais interessado pelo segundo.
Aqui estão 2 maneiras diferentes de atingir sua exigência.
A primeira solução usa apenas filtros disponíveis no ansible por padrão:
rejectattr
você já mencionou e sua contraparteselectattr
. A ideia é adicionar duas listas. A primeira é feita selecionando todos ostype
dicts que não possuem o atributo. A segunda é feita selecionando dict com otype
atributo e rejeitando aqueles onde ele é igualspecial
.Para a segunda solução, usei o
json_query
filtro que requerpip install jmespath
no controlador. Como você pode ver abaixo, é muito mais compacto.A escolha é sua !
O manual de demonstração:
Que dá:
Você deve usar
rejectattr
para rejeitar itenstype
indefinidos e usarselectattr
para selecionar os itens que sãoequalto
especiais.editar:
Que tal combinar duas listas como abaixo? Não sei se esta é a melhor maneira possível, mas funciona.