4
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-06-16

以前、下記のような方法で 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 になります。

4
5
0

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
  3. You can use dark theme
What you can do with signing up
4
5