Estou tentando obter dados de dados JSON (abaixo) usando um loop com uma variável (em vez de codificar um valor). Nos dados json (abaixo), 'cluster' pode mudar, portanto não posso simplesmente usar: loop: "{{ drs_rule_jsondata.drs_rule_info.cluster }}" - que funciona como eu esperava e produz os resultados esperados.
No entanto, quando uso a peça abaixo (usando vars no loop e quando {{ cluster_info.name }} = cluster), recebo "msg": "'dict object' has no attribute 'drs_rule_jsondata.drs_rule_info.cluster'". A parte confusa é que ele produz a mesma sintaxe que funciona... usar vars dessa maneira no loop não deveria funcionar? Existe outra maneira de obter os resultados esperados, visto que o 'cluster' pode mudar?
Jogar:
- name: Set drs rule info
set_fact:
drs_rule: "{{ drs_rule|default([]) + [ {
'rule_name': item | json_query('rule_name'),
'rule_affinity': item | json_query('rule_affinity'),
'rule_vms': item | json_query('rule_vms[*]')
} ] }}"
vars:
path: drs_rule_jsondata.drs_rule_info
cluster_name: "{{ cluster_info.name }}"
loop: "{{ vars[path + '.' + cluster_name] }}"
dados JSON:
{
"ansible_facts": {
"drs_rule_jsondata": {
"changed": false,
"drs_rule_info": {
"cluster": [
{
"rule_affinity": true,
"rule_enabled": true,
"rule_key": 1,
"rule_mandatory": null,
"rule_name": "DEMO_REP_DRS_1",
"rule_type": "vm_vm_rule",
"rule_uuid": "522d41eb-4acb-afbf-9f37-15a1651ccf45",
"rule_vms": [
"VM1",
"VM2",
"VM3",
"VM4"
]
]
},
"failed": false
}
},
"_ansible_no_log": false,
"changed": false
}
Resultados esperados:
{
"drs_rule": [
{
"rule_name": "DEMO_REP_DRS_1",
"rule_affinity": true,
"rule_vms": [
"VM1",
"VM2",
"VM3",
"VM4"
]
}
]
}
Responder1
Esta expressão não faz sentido:
vars[path + '.' + cluster_name]
Aqui você está solicitando uma variável com o nome literal drs_rule_jsondata.drs_rule_info.<value of cluster_name>
, mas essa variável não existe - esse nem mesmo é um nome de variável válido.
Você não precisa usar vars
aqui em nenhum caso; você pode simplesmente consultar dns_rule_jsondata
diretamente a variável de nível superior.
Também não está claro por que você está usando json_query
seu manual, já que você está solicitando apenas chaves estáticas individuais.
Acho que o que você está tentando fazer é o seguinte:
- hosts: localhost
gather_facts: false
vars:
cluster_info:
name: cluster
drs_rule_jsondata:
changed: false
drs_rule_info:
cluster:
- rule_affinity: true
rule_enabled: true
rule_key: 1
rule_mandatory: null
rule_name: DEMO_REP_DRS_1
rule_type: vm_vm_rule
rule_uuid: 522d41eb-4acb-afbf-9f37-15a1651ccf45
rule_vms:
- VM1
- VM2
- VM3
- VM4
tasks:
- name: Set drs rule info
set_fact:
drs_rule: >-
{{
drs_rule + [
{
'rule_name': item.rule_name,
'rule_affinity': item.rule_affinity,
'rule_vms': item.rule_vms
}
]
}}
vars:
drs_rule: []
cluster_name: "{{ cluster_info.name }}"
loop: "{{ drs_rule_jsondata.drs_rule_info[cluster_name] }}"
- debug:
var: drs_rule
A execução do manual acima produz como saída:
PLAY [localhost] ***************************************************************
TASK [Set drs rule info] *******************************************************
ok: [localhost] => (item={'rule_affinity': True, 'rule_enabled': True, 'rule_key': 1, 'rule_mandatory': None, 'rule_name': 'DEMO_REP_DRS_1', 'rule_type': 'vm_vm_rule', 'rule_uuid': '522d41eb-4acb-afbf-9f37-15a1651ccf45', 'rule_vms': ['VM1', 'VM2', 'VM3', 'VM4']})
TASK [debug] *******************************************************************
ok: [localhost] => {
"drs_rule": [
{
"rule_affinity": true,
"rule_name": "DEMO_REP_DRS_1",
"rule_vms": [
"VM1",
"VM2",
"VM3",
"VM4"
]
}
]
}
PLAY RECAP *********************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Responder2
Aqui está o que funcionou no final (o que eu já tinha tentado):
set_fact:
drs_rule: "{{ drs_rule|default([]) + [ {
'rule_name': item | json_query('rule_name'),
'rule_affinity': item | json_query('rule_affinity'),
'rule_vms': item | json_query('rule_vms[*]')
} ] }}"
vars:
cluster_name: "{{ cluster_info.name }}"
loop: "{{ drs_rule_jsondata.drs_rule_info[cluster_name] }}"