LoginSignup
5

More than 5 years have passed since last update.

posted at

updated at

Organization

Ansible の shell モジュールでチェックモードも考慮して冪等性を保つ:改

以前、下記のような方法で shell モジュールでファイルが無いときだけ実行して、かつ、ファイルがあるときは ok と表示させつつ、チェックモードで実行したときにも changed とか ok とかそれっぽく表示できるようにしてみましたが、

最近の Ansible なら(2.1以上)、チェックモードで実行されているかどうか ansible_check_mode マジック変数で判断できるので、↓のようにもっと簡単?にできました。

- hosts: localhost
  tasks:
    - name: create hoge
      shell: |
        # ファイルが存在するなら ok を標準出力に出して終了
        if [ -e /tmp/hoge ]; then
          echo ok
          exit
        fi

        # チェックモードなら何もしない
        if [ "$ansible_check_mode" -ne 0 ]; then
          exit
        fi

        # 実際の処理
        uname -a > /tmp/hoge

      environment:
        # ansible_check_mode を環境変数で渡す
        ansible_check_mode: '{{ ansible_check_mode|int }}'
      register: res
      # チェックモードでも実行する
      check_mode: no
      # 標準出力が ok なら変更なしとみなす
      changed_when: res.stdout != 'ok'

この例だと簡単すぎてそもそも shell モジュールでやる必要無くね? と思いますが、例のためのサンプルなので本当はもっと shell モジュールでなければ出来ないことなのだと思ってもらえればと・・・例えば make -q の終了コードで実行の要否を判断するとか?

---
- hosts: localhost
  tasks:
    - name: make hoge
      shell: |
        make -q
        if [ $? -ne 1 ]; then
          # 終了コードが 1 以外ならビルド不要かエラーのどっちか
          exit $?
        fi
        if [ "$ansible_check_mode" -eq 0 ]; then
          if ! make; then
            exit 2
          fi
        fi
        exit 1
      environment:
        ansible_check_mode: '{{ ansible_check_mode|int }}'
      register: res
      check_mode: no
      changed_when: res.rc == 1
      failed_when: not res.rc in (0, 1)

チェックモードでもそうじゃなくても、ビルドが必要なら changed になるし、不要なら ok になります。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
5