fnwiya's quine

自分自身を出力するブログ

ansibleのshellで冪等性を保つ

冪等性とは

数学において、冪等性(べきとうせい、英: idempotence 「巾等性」とも書くが読み方は同じ)は、大雑把に言って、ある操作を1回行っても複数回行っても結果が同じであることをいう概念である。まれに等冪(とうべき)とも。抽象代数学、特に射影(projector)や閉包(closure)演算子に見られる特徴である。"idempotence" という単語はラテン語の "idem"(同じ=same)と"potere"(冪=power)から来ている。

冪等 - Wikipedia

ansibleではget_urlモジュールなどではこの冪等性が保証されている(すでにダウンロード済みの場合は再度ダウンロードされない)のですが
shellモジュールの場合はシェルコマンドを実行するだけのモジュールなので、
冪等性の保証はされません。
しかし、それでは毎回changed判定されたり、場合によっては悪影響がでたりするので
必要な状態をみたしたら処理をスキップしてあげる必要があります。

そこで使うのがcreates/removesパラメータです。
ansibleは公式ドキュメント が非常に丁寧なのでそちらを見ていただくのがいいと思いますが
簡単にいうと

  -shell: do something creates=path/to/filename

でfilenameが存在した時にこの処理がスキップされ、
removes=path/to/filenameとすれば逆にファイルがないときスキップされます。
これによってmakeコマンドなどを実行するときはmakeによって生成されるファイル名をcreatesに指定してやれば
一度makeされた後に再度ansibleを実行しても次はmakeが走らず、
changedが残りません。

ansible導入は簡単ですが奥が深いので色々試してみたいと思います。