在 Ansible 中使用failed_when进行多个字符串搜索



Team, 不知何故无法弄清楚这是什么错误..我正在执行多个字符串搜索,并且找不到每个字符串都相应地失败了。

- name: "Validate kubectl access and k8s node lables"
debug:
msg: "kubectl get nodes --show-labels -l nodeType={{item}}"
with_items:
- gpu
- cpu
- monitoring
register: k8s_labelsresponse
- debug:
var: k8s_labelsresponse.stdout
failed_when: '"nodeType=gpu" not in k8s_labelsresponse.stdout or "nodeType=cpu" not in k8s_labelsresponse.stdout or "nodeType=monitoring" not in k8s_labelsresponse.stdout'

输出:

TASK [Validate kubectl access and k8s node lables] 
ok: [target1] => (item=gpu) => {
"msg": "kubectl get nodes --show-labels -l nodeType=gpu"
}
ok: [target1] => (item=cpu) => {
"msg": "kubectl get nodes --show-labels -l nodeType=cpu"
}
ok: [target1] => (item=monitoring) => {
"msg": "kubectl get nodes --show-labels -l nodeType=monitoring"
}
TASK [debug] **************************************************************************************************************************************************
fatal: [target1]: FAILED! => {"msg": "The conditional check '"nodeType=gpu" not in k8s_labelsresponse.stdout or "nodeType=cpu" not in k8s_labelsresponse.stdout or "nodeType=monitoring" not in k8s_labelsresponse.stdout' failed. The error was: error while evaluating conditional ("nodeType=gpu" not in k8s_labelsresponse.stdout or "nodeType=cpu" not in k8s_labelsresponse.stdout or "nodeType=monitoring" not in k8s_labelsresponse.stdout): Unable to look up a name or access an attribute in template string ({% if "nodeType=gpu" not in k8s_labelsresponse.stdout or "nodeType=cpu" not in k8s_labelsresponse.stdout or "nodeType=monitoring" not in k8s_labelsresponse.stdout %} True {% else %} False {% endif %}).nMake sure your variable name does not contain invalid characters like '-': argument of type 'AnsibleUndefined' is not iterable"}

首先,你的变量k8s_labelsresponse是一个地图,所以你没有stdout。按debug: var=k8s_labelsresponse看一看 您可以通过以下方式创建该变量:

msg:
- kubectl get nodes --show-labels -l nodeType=gpu
- kubectl get nodes --show-labels -l nodeType=cpu
- kubectl get nodes --show-labels -l nodeType=monitoring

但是这个解决方案非常丑陋,因为它是硬编码。 我建议在 Jinja2 的帮助下创建一个动态变量,set_fact:

- hosts: localhost
vars:
params:
- cpu
- gpu
- monitoring
tasks:
- set_fact:
k8s_labelsresponse: "{% for param in params -%}
nodeType={{ param }}
{% endfor %}"
- debug:
msg: "{{ k8s_labelsresponse.splitlines() }}"
failed_when:  '"nodeType=gpu" not in k8s_labelsresponse  or "nodeType=cpu" not in k8s_labelsresponse or "nodeType=monitoring" not in k8s_labelsresponse'

相关内容

  • 没有找到相关文章

最新更新