无法在 json_query ansible 模块中搜索字符串
Unable to search string in json_query ansible module
团队,我有输出并正在尝试 fail/pass 基于收到的 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": "The conditional check '\"gpu\" not in query.results' failed. The error was: error while evaluating conditional (\"gpu\" not in query.results) : 无法在模板字符串中查找名称或访问属性 ({% if \"gpu\" not in query.results %} True {% else %} False {% endif %})。\n确保您的变量名不包含无效字符,例如“-”:'AnsibleUndefined' 类型的参数不可迭代"}
播放回顾 ******************************************* *******
target1 : ok=10 changed=5 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
你误会了; vars:
仅为当前任务声明 "local" 个变量。由于您刚刚声明了一个名为 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:
永远不会为真
团队,我有输出并正在尝试 fail/pass 基于收到的 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": "The conditional check '\"gpu\" not in query.results' failed. The error was: error while evaluating conditional (\"gpu\" not in query.results) : 无法在模板字符串中查找名称或访问属性 ({% if \"gpu\" not in query.results %} True {% else %} False {% endif %})。\n确保您的变量名不包含无效字符,例如“-”:'AnsibleUndefined' 类型的参数不可迭代"}
播放回顾 ******************************************* ******* target1 : ok=10 changed=5 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
你误会了; vars:
仅为当前任务声明 "local" 个变量。由于您刚刚声明了一个名为 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:
永远不会为真