Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
5
Help us understand the problem. What are the problem?

More than 3 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 になります。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
5
Help us understand the problem. What are the problem?