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.