Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

ngyuki
テック系男子。 ただのやってみた系の記事ははてなブログに、それ以外の技術系のネタは Qiita に投稿します。
https://ngyuki.jp/
headjapan
中規模~大規模の安定した基幹システム・大規模サイトの分析・要件定義・設計・開発を得意とする、総合的な開発会社です。
http://www.headjapan.com/
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