检查Ansible中的字符串是否等于和三元运算符
在我的剧本中,我有:检查Ansible中的字符串是否等于和三元运算符,ansible,jinja2,Ansible,Jinja2,在我的剧本中,我有: #More things - include: deploy_new.yml vars: service_type: "{{ expose_service == 'true' | ternary('NodePort', 'ClusterIP') }}" when: service_up|failed 当expose\u service为true时,我希望service\u type设置为NodePort,否则设置为clusterpo
#More things
- include: deploy_new.yml
vars:
service_type: "{{ expose_service == 'true' | ternary('NodePort', 'ClusterIP') }}"
when: service_up|failed
当expose\u service
为true时,我希望service\u type
设置为NodePort,否则设置为clusterport
但是,在所有情况下,service\u type
都设置为False
我做错了什么?解决了
service_type: "{{ 'NodePort' if expose_service == 'true' else 'ClusterIP' }}"
在您的示例中,您将三元过滤器应用于
'true'
字符串。实际上,您正在将expose\u service
的值与字符串'NodePort'
进行比较,结果总是false
您需要将相等运算符子句括在括号中:
- include: deploy_new.yml
vars:
service_type: "{{ (expose_service == true) | ternary('NodePort', 'ClusterIP') }}"
when: service_up|failed
本答复中涉及的其他两点:
- 您使用字符串
而不是布尔值'true'
指令处于错误的缩进级别时,有效地传递名为指令处于错误的缩进级别时(当
的变量)
当
识别和'true'
作为字符串而不是布尔值true
时)仍然有效
所以,问题是“我做错了什么?”。答案是:运算符优先级
在{{expose_service=='true'| triangal('NodePort','ClusterIP')}
中,过滤器首先应用于'true'。因此,Ansible评估:
{{expose_service==('true'三元('NodePort','ClusterIP'))}
,因为引用的非空字符串仍然是布尔非false → <代码>{{expose_service=='NodePort'}} 这显然是错误的'true'|三元('NodePort','ClusterIP')='NodePort'