web-dev-qa-db-ja.com

文字列が等しいかどうかを確認し、Ansibleの三項演算子

私のプレイブックには、これがあります:

#More things
- include: deploy_new.yml
  vars:
    service_type: "{{ expose_service == 'true' | ternary('NodePort', 'ClusterIP') }}"
    when: service_up|failed

expose_serviceがtrueの場合、service_typeを「NodePort」に設定し、それ以外の場合は「ClusterIP」に設定します。

ただし、service_typeは常にFalseに設定されます。

何が悪いのですか?

16
Héctor

解決しました!

service_type: "{{ 'NodePort' if expose_service == 'true' else 'ClusterIP' }}"
30
Héctor

あなたの例では、'true'文字列に3値フィルタを適用しています。実際には、expose_serviceの値を文字列'NodePort'と比較し、常にfalseを取得します。

等価演算子句を括弧で囲む必要があります。

 - include: deploy_new.yml
   vars:
     service_type: "{{ (expose_service == true) | ternary('NodePort', 'ClusterIP') }}"
   when: service_up|failed

この回答で扱われている他の2つのポイント:

  • ブール値の代わりに文字列'true'を使用する
  • whenディレクティブのインデントレベルが正しくありません(whenと呼ばれる変数を効果的に渡します)
17
techraf

techraf の答えの最初のポイントを詳しく説明します。他の2つのポイント(when identationと_'true'_をブール値trueの代わりに文字列として)も依然として有効です。

それで、質問は「私は何が間違っているのですか?」でした。答えは、演算子の優先順位です。

{{ expose_service == 'true' | ternary('NodePort', 'ClusterIP') }}では、フィルターは最初に「true」に適用されます。したがって、Ansibleは以下を評価します。

  • {{ expose_service == ('true' | ternary('NodePort', 'ClusterIP')) }}
  • 'true' | ternary('NodePort', 'ClusterIP') = 'NodePort'引用符で囲まれた空ではない文字列はブール値であり、偽ではないため.

    →_{{ expose_service == 'NodePort' }}_

    これは明らかに誤りです。