TL;DR
- Ansibleで複数の変数の存在チェック、文字列の場合は空のチェックをしたい場合は
ansible.builtin.fail: msg: Varialbe '{{ item }}' is not defined or empty. when: > item is not defined or item is none or ( item is string and item | length == 0 ) loop: - '{{ var1 }}' - '{{ var2 }}' #nolog: true # Hide credencials, but suppress message. 
経緯
Ansibleで引数が定義されていて、空でないかどうかチェックしたい。1個ずつやるのもだるいのでloopでまとめて。 以下でできるかと思ったのだが…
ansible.builtin.fail:
  msg: Varialbe '{{ item }}' is not defined or empty.
when: >
  item is not defined or
  item is none or
  item | length == 0  
loop:
  - '{{ var1 }}'
  - '{{ var2 }}'
これだと、変数に数字が設定されていると型がstringにはならず、lengthの実行でlen()メソッドがないと言われてこけてしまう。このため、以下のように型がstringかチェックしたうえでlengthチェックさせる。また、内容がパスワードなどを含む場合はno_log: trueとするとよい。ただしその場合エラー時のメッセージも簡略化されてどの変数でこけたのか、別途調査が必要となる。
ansible.builtin.fail:
  msg: Varialbe '{{ item }}' is not defined or empty.
when: >
  item is not defined or
  item is none or
  (
    item is string and
    item | length == 0
  )  
loop:
  - '{{ var1 }}'
  - '{{ var2 }}'
#nolog: true # Hide credencials, but suppress message.