有什么方法可以简化下面的json_query吗? 在这里您可以看到我正在尝试使用三种查询设置来提取三个值。由于我在列表中有三个项目,因此对应于项目列表的值将生成3次。有什么办法可以分隔每个项目的值?
ClusterName: xxxx for dv-cn-c1
DomainName: xxxx for dv-cn-c1
ClusterName: xxxx for dv-cn-c2
DomainName: xxxx for dv-cn-c2
请参阅我的想法
- name: "set fact for policy pkg for list of devices"
set_fact:
ClusterName: "{{ fullinvt | json_query(query1) }}"
DomainName: "{{ fullinvt | json_query(query2) }}"
PolicyName: "{{ fullinvt | json_query(query3) }}"
vars:
#w query: "ansible_facts.checkpoint_servers_gateways.objects[*].policy[].\"cluster-members-access-policy-revision\"[?name == 'dev-cn-c2'].name"
query1: "ansible_facts.checkpoint_servers_gateways.objects[?\"cluster-member-names\"[?contains(@ `{{ item }}`)]].name | [0]"
query2: "ansible_facts.checkpoint_servers_gateways.objects[?\"cluster-member-names\"[?contains(@ `{{ item }}`)]].domain.name | [0]"
query3: "ansible_facts.checkpoint_servers_gateways.objects[?\"cluster-member-names\"[?contains(@ `{{ item }}`)]].policy.\"access-policy-name\" | [0]"
with_items:
- dv-cn-c1
- dv-cn-c2
- dv-cn-4
tags: ADDLAG
答案 0 :(得分:1)
您可以做的是建立字典词典,其中第一级键是循环中的项目;第二级则键入它们相应的ClusterName
,DomainName
和PolicyName
值。
我创建了一个示例playbook
来更好地说明自己:
---
- name: Multiple json_queries
hosts: local
connection: local
gather_facts: no
vars_files:
- ./secret.yml
vars:
fullinvt:
dv-cn-c1:
ClusterName: dv-cn-c1-cluster-name
DomainName: dv-cn-c1-domain-name
PolicyName: dv-cn-c1-policy-name
dv-cn-c2:
ClusterName: dv-cn-c2-cluster-name
DomainName: dv-cn-c2-domain-name
PolicyName: dv-cn-c2-policy-name
dv-cn-4:
ClusterName: dv-cn-4-cluster-name
DomainName: dv-cn-4-domain-name
PolicyName: dv-cn-4-policy-name
tasks:
- name: Create `json_query` object
set_fact:
# Multiline filter application
result: >
{{
(result | default({})) |
combine({item: {
"ClusterName": fullinvt | json_query('"' + item + '"' + ".ClusterName"),
"DomainName": fullinvt | json_query('"' + item + '"' + ".DomainName"),
"PolicyName": fullinvt | json_query('"' + item + '"' + ".PolicyName")
}})
}}
loop:
- dv-cn-c1
- dv-cn-c2
- dv-cn-4
- debug:
var: item
loop: "{{ result | dict2items }}"
我没有创建全局事实,而是创建了一个名为result
的事实。循环中每个元素的数据都位于同名键中。
如果您需要进一步遍历该词典,则可以使用dict2items
过滤器,如debug
任务所示。
希望对您有帮助。