값을 하드 코딩하는 대신 변수가 있는 루프를 사용하여 json 데이터(아래)에서 데이터를 가져오려고 합니다. json 데이터(아래)에서 'cluster'는 변경될 수 있으므로 간단히 사용할 수 없습니다. loop: "{{ drs_rule_jsondata.drs_rule_info.cluster }}" -- 예상대로 작동하고 예상한 결과를 생성합니다.
그러나 아래 플레이를 사용하면(루프에서 vars를 사용하고 {{ Cluster_info.name }} = 클러스터인 경우) "msg"가 표시됩니다. "'dict object' has no attribute 'drs_rule_jsondata.drs_rule_info.cluster'". 혼란스러운 부분은 작동하는 것과 동일한 구문을 생성한다는 것입니다.... 루프에서 이러한 방식으로 vars를 사용하면 작동하지 않습니까? '클러스터'가 변경될 수 있는 경우 예상되는 결과를 얻을 수 있는 다른 방법이 있습니까?
놀다:
- 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] }}"
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
}
예상 결과:
{
"drs_rule": [
{
"rule_name": "DEMO_REP_DRS_1",
"rule_affinity": true,
"rule_vms": [
"VM1",
"VM2",
"VM3",
"VM4"
]
}
]
}
답변1
이 표현은 의미가 없습니다:
vars[path + '.' + cluster_name]
여기서는 리터럴 이름이 있는 변수를 요청하고 있지만 drs_rule_jsondata.drs_rule_info.<value of cluster_name>
그러한 변수가 없습니다. 이는 유효한 변수 이름도 아닙니다.
vars
어떤 경우에도 여기서 사용할 필요는 없습니다 . 최상위 dns_rule_jsondata
변수를 직접 참조할 수 있습니다.
json_query
개별 정적 키만 요구하기 때문에 플레이북에서 를 사용하는 이유도 명확하지 않습니다 .
내 생각에 당신이하려는 일은 다음과 같습니다.
- 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
위 플레이북을 실행하면 다음과 같은 출력이 생성됩니다.
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
답변2
결국 결과는 다음과 같습니다(이미 시도했지만).
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] }}"