always_run is deprecated
先日ansible-playbookを実行したら以下のようなWARNINGが出ました。
[DEPRECATION WARNING]: always_run is deprecated. Use check_mode = no instead..
This feature will be removed in version 2.4. Deprecation warnings can be disabled by setting deprecation_warnings=False in
ansible.cfg.
どうやらalways_run
は非推奨になり、ansibleバージョン2.4で廃止されるようです。
代わりにcheck_mode
を使えば良いみたいです。
always_run: yes
とcheck_mode: no
が等価。
解決!
そもそもalways_runて何だったっけ...
どのようなプレイブックでalways_run
を使っていたかというと、以下のようにタイムゾーンを設定するプレイブックで使用されていました。
# time and locale
- name: locale checked
shell: date +%Z
register: timezone
changed_when: false
always_run: yes
tags: locale
- name: locale is set
shell: timedatectl set-timezone Asia/Tokyo
when: not timezone.stdout == "JST"
tags: locale
このプレイブックは、
- タイムゾーンを取得するコマンドを実行し、
timezone
変数に格納 timezone
変数の値がJSTでなければtimedatectl
コマンドでタイムゾーンをAsia/Tokyoに設定する
というものです。
このように、shell
やcommand
モジュールを使う場合は冪等性を考慮して条件判定をしてあげなければなりません。
しかし、ansibleのdry-runではshell
やcommand
モジュールが実行されないので、必然的に変数に値が格納されません。よって、後続のモジュール実行が失敗する場合があります。
そこでdry-runであっても実行させるためにalways_run
を使用していました。
check_modeのほうがシンプルに書ける場合がある?みたいなのでそのうち試してみようと思います。