无法在json_query ansible模块中搜索字符串

时间:2019-10-22 02:17:18

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

团队,我已经输出了,并且根据正在获取的json响应中是否存在字符串来尝试失败/通过。有什么提示吗?

      - name: "Fetch all gpu/dgx nodes from clusters using K8s facts"
        k8s_facts:
          kubeconfig: $WORKSPACE
          kind: Node
          label_selectors:
          - nodeType=gpu
          verify_ssl: no
        register: node_list

      - debug:
          var: node_list
      - debug:
          var: node_list | json_query(query)
        vars:
          query: 'resources[].{node_name: metadata.name, nodeType: metadata.labels.nodeType}'
        failed_when: '"gpu" not in query.results'
TASK [2_k8s_validations : debug] ******************************************************************************************************************************************************************
ok: [target1] => {
    "node_list | json_query(query)": [
        {
            "nodeType": "gpu",
            "node_name": "dgx"
        },
        {
            "nodeType": "gpu",
            "node_name": "dgx"
        }
    ]
}```

任务[2_k8s_validations:调试] ********************************************* ****************************************************** ****************************************************** ********************* 致命:[target1]:失败! => {“ msg”:“条件检查'\” gpu \“不在query.results中。错误是:评估条件条件时发生错误(\” gpu \“不在query.results中):无法查找名称或访问模板字符串中的属性({%如果\“ gpu \”不在query.results%}中{%else%} False {%endif%})。\ n请确保您的变量名不包含无效字符类似于“-”:“ AnsibleUndefined”类型的参数不可迭代”}

PLAY RECAP ********************************************* ***** target1:ok = 10更改= 5不可达= 0失败= 1跳过= 0获救= 0忽略= 0


1 个答案:

答案 0 :(得分:1)

您有误会; vars:仅为当前任务声明“局部”变量。由于您刚刚声明了一个名为query的变量,并且该变量不是dict,因此它没有这样的子属性.results

您很可能希望使用set_fact:hostvars结构中声明一个新的明显事实,因此您可以像尝试做的那样使用它:

  - set_fact:
      nodes_with_node_type: '{{ node_list | json_query(query) }}'
    vars:
      query: 'resources[].{node_name: metadata.name, nodeType: metadata.labels.nodeType}'

  - fail:
      msg: Expected to find at least one GPU node type
    vars:
      node_types: '{{ nodes_with_node_type | map(attribute="nodeType") | list }}'
    when: '"gpu" not in node_types'

与您的特定问题不同,假设您在k8s_facts:上的选择器明确要求nodeType=gpu,那么您要完成的实际任务完全是胡说八道-不会有其他类型的选择返回的节点因此when:永远不会为真