always_run is deprecated

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: yescheck_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に設定する

というものです。

このように、shellcommandモジュールを使う場合は冪等性を考慮して条件判定をしてあげなければなりません。

しかし、ansibleのdry-runではshellcommandモジュールが実行されないので、必然的に変数に値が格納されません。よって、後続のモジュール実行が失敗する場合があります。

そこでdry-runであっても実行させるためにalways_runを使用していました。

check_modeのほうがシンプルに書ける場合がある?みたいなのでそのうち試してみようと思います。