【问题标题】:how to loop ansible json_query如何循环 ansible json_query
【发布时间】:2019-08-16 20:40:21
【问题描述】:

有什么方法可以简化下面的 json_query? 在这里您可以看到我正在尝试使用三个查询设置来提取三个值。由于我在列表中有三个项目,因此将生成与项目列表相对应的三次值。有什么方法可以分开每个项目的价值吗?

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

【问题讨论】:

  • 据我所知,您只能设置一次事实。但是由于迭代with_items,您将多次设置相同的事实。所以你的任务不会像你预期的那样工作。

标签: ansible ansible-2.x ansible-facts json-query


【解决方案1】:

您可以做的是建立一个字典字典,其中第一级键是循环中的项目;第二级键对应的ClusterNameDomainNamePolicyName值。

我创建了一个示例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 任务所示。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    • 2019-12-20
    • 2023-03-25
    相关资源
    最近更新 更多