私のプレイブックには、これがあります:
#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
に設定されます。
何が悪いのですか?
解決しました!
service_type: "{{ 'NodePort' if expose_service == 'true' else 'ClusterIP' }}"
あなたの例では、'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
と呼ばれる変数を効果的に渡します)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' }}
_
これは明らかに誤りです。