Python
Ansible

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

More than 3 years have passed since last update.

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

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


main.yml

- 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の場合だとこうなる


main.yml

- 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ゴリゴリ書いちゃってるから自分の中ではかなり負けた気分だし・・・・