检查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'))}
  • 'true'|三元('NodePort','ClusterIP')='NodePort'
    ,因为引用的非空字符串仍然是布尔非false

    → <代码>{{expose_service=='NodePort'}}

    这显然是错误的