てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] check モードの実行ログに [CHECK MODE] という印をつける方法

■ はじめに

Ansible には、Playbook 実行時に予めどのような変更がせれるかを、実際に変更を加えることなくチェックできる、check モード (Dry-run)という機能があります。

これまでは、通常実行時も check モード実行時も、実行ログ上は特に変わりはありませんでした。

Ansible 2.9 から、デフォルトのコールバックプラグインに、check モードで実行されたタスクにのログに印を付けられるようになりました。

この記事では、簡単な例をもとにして説明します。


■ 設定

ansible.cfg環境変数の、2通りの設定方法があります。

ansible.cfg

ansible.cfg で設定する場合は、[defaults] セクションに以下のように指定します。

[defaults]
check_mode_markers = yes

環境変数

ansible.cfg で設定する場合は、以下のように指定します。

 export ANSIBLE_CHECK_MODE_MARKERS=yes


■ 実行例1: --check オプション付加時

ansible-playbook コマンドに --check オプションを付けて Playbook 全体をチェックモードで実行する場合です。

  • Playbook
- hosts: all
  gather_facts: no

  tasks:
    - name: debug test 1
      debug:
        msg: debug test 1
    - name: debug test 2
      debug:
        msg: debug test 2
  • 実行
$ ansible-playbook -i localhost, check_test.yml --check

DRY RUN *********************************************************************************

PLAY [all] [CHECK MODE] *****************************************************************

TASK [debug test 1] [CHECK MODE] ********************************************************
ok: [localhost] => {
    "msg": "debug test 1"
}

TASK [debug test 2] [CHECK MODE] ********************************************************
ok: [localhost] => {
    "msg": "debug test 2"
}

PLAY RECAP ******************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

冒頭に DRY RUN、各 Play、各タスクに CHECK MODE と表示されました。


■ 実行例2: タスクに check_mode: yes 付加時

タスクに check_mode: yes を付けて、特定のタスクだけチェックモードで実行する場合です。

  • Playbook
- hosts: all
  gather_facts: no

  tasks:
    - name: debug test 1
      debug:
        msg: debug test 1
    - name: debug test 2
      debug:
        msg: debug test 2
      check_mode: yes         # ポイント
  • 実行
$ ansible-playbook -i localhost, check_test.yml

PLAY [all] ******************************************************************************

TASK [debug test 1] *********************************************************************
ok: [localhost] => {
    "msg": "debug test 1"
}

TASK [debug test 2] [CHECK MODE] ********************************************************
ok: [localhost] => {
    "msg": "debug test 2"
}

PLAY RECAP ******************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

check_mode: yes を指定したタスクのみ CHECK MODE と表示されました。


■ 参考: check_mode_markers を有効にしなかった場合

通常はこのようなログになります。

$ ansible-playbook -i localhost, check_test.yml --check

PLAY [all] ******************************************************************************

TASK [debug test 1] *********************************************************************
ok: [localhost] => {
    "msg": "debug test 1"
}

TASK [debug test 2] *********************************************************************
ok: [localhost] => {
    "msg": "debug test 2"
}

PLAY RECAP ******************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   


■ まとめ

デフォルトのコールバックプラグインに、check モードで実行されたタスクにのログに印を付ける設定のご紹介をしました。

Playbook 実行ログ上、check モードで実行したことを区別したいときには便利だと思います。