😀

【ansible】強制的にchangedを発生させない方法

2022/11/28に公開

Ansibleのshell moduleを使用してコマンド結果のみをregisterに保存しておきたい時がある

自分の場合はログインShellがzshなのかbashなのかを調べたくてこんなタスクを書いた

- name: check using shell register in file path
  shell: |
      if [ `echo $SHELL | grep -c "zsh"` -eq 1 ]; then
        echo ".zshrc"
      elif [ `echo $SHELL | grep -c "bash"` -eq 1 ]; then
        if [ `uname` = "Linux" ]; then
          echo "~/.bashrc"
        elif [ `uname` = "Darwin" ]; then
          echo "~/.bash_profile"
        fi
      fi
  register: shell_configure_file

上記タスクを実行した場合は必ず changed になってしまう。

TASK: [python/pyenv/install | check using shell register in file path] ********
changed: [127.0.0.1]

このchangedを常にokにしたい時に色々調べてしまったのでメモ

環境

  • Mac OSX Yosemite(10.10.5)
    • python 2.7.10
      • ansible 1.9.4

参考にしたサイト

ansible個人的メモ&Tips

常にokにする方法

changed_when: False をタスクに記載してしまえばよい

先ほどのtaskの場合だとこうなる

- name: check using shell register in file path
  shell: |
      if [ `echo $SHELL | grep -c "zsh"` -eq 1 ]; then
        echo ".zshrc"
      elif [ `echo $SHELL | grep -c "bash"` -eq 1 ]; then
        if [ `uname` = "Linux" ]; then
          echo "~/.bashrc"
        elif [ `uname` = "Darwin" ]; then
          echo "~/.bash_profile"
        fi
      fi
  changed_when: False
  register: shell_configure_file

なぜchangedを許容してはいけないのか?

個人的な見解なのだが、自分が書いたplaybookであれば、これは気にしなくてよいchangedだ。などansibleの実行結果を見てすぐ判断できるだろうが、このplaybookを他人が実行した時に changed がでた場合に「おや、何か設定が何か変わったのか?」と思ってしまう。

changedは対象のOSの振る舞いが変わった時だけchangedになる方が望ましいと思う。

最後に

ansibleは簡単なんだけども色々回避方法があるから返ってtask作るときはムズイなー。。。
上記taskもshellゴリゴリ書いちゃってるから自分の中ではかなり負けた気分だし・・・・

Discussion