with_itemsでundefinedを回避するdefaultフィルター

2017.01.25

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

渡辺です。 今日はAnsibleの小ネタをひとつ。

Ansibleではwith_itemsを利用すると、いわゆるループ処理を行うことができます。 変数としてリストを定義し、with_itemsを使い、複数の設定を行うことができるため、たくさんのユーザを作成したいようなケースで重宝します。

users:
 - su-metal
 - yui-metal
 - moa-metal
with_items: users

ところが、with_itemsに対応する変数が無い場合、次のようなエラーが発生します。

fatal: [localhost]: FAILED! => {"failed": true, "msg": "'users' is undefined"}

変数usersが未定義(undefined)であることが原因です。 この時、次のように空のリストを定義すれば解決します。

users: []

しかし、Roleで提供する場合など、明示的に空のリストを定義させず、いい感じに処理して欲しいところです。

Jinja2のdefaultフィルターで解決!

未定義の場合にデフォルト値を設定したい場合、Jinja2のdefaultフィルターを利用しましょう。

with_items: "{{ users | default([]) }}"

これで、変数が未定義(undefined)の場合、自動的に空のリストとして扱います。

以上。