2014年10月27日月曜日

デプロイツールの一種ということになってるfabric、Pythoistaなら是非

小生も、数10台のサーバを操作しなければならず、
expectとかsshにスクリプト流すとか最初はやってたのですが、
最終的にfabricに落ち着きつつあります。実際よく出来ています。

http://www.fabfile.org/

https://github.com/fabric/fabric

小生はfabricを「デプロイツール」だとは思っていません。厳密にはリモートサーバ管理フレームワークってところでしょう。実際readmeでもそう言ってる

https://github.com/fabric/fabric/blob/master/README.rst

Fabric is a Python (2.5-2.7) library and command-line tool for streamlining the use of SSH for application deployment or systems administration tasks.
後者のsystem administration tasksの方が、実は使い出があります。

そのままでは何も動きません。
  1. fabricをどうにかしてインストールすると /usr/bin/fab が出来上がって、コイツを起動するわけですが、こいつは本体というよりはむしろ入り口です。
  2. 実態はカレントディレクトリのfabfile.pyです。コイツは自分で好きなように書きます。
  3. コマンドラインで指定した文字列をfabfile.pyから探して実行する。それだけです
  4. そこから先は完全にpythonです。
直接実行しない*pyでカスタマイズする、という感じがpythonicですねえ。しかもファイルの中身にはcallableなインスタンス変数を並べるだけ。動的言語の真骨頂です。

pythonならではの小細工が存分に生かせます
http://dekokun.github.io/posts/2013-04-07.html

ローカルでコマンドラインを使うかのように

sudo("/sbin/reboot -h now")
とかやれば、リモートサーバを一回りしてrebootして戻ってきます。
もちろん複数台にも対応しています。しかも並列操作です。
pythonの「質」をうまく利用していて、@parallelデコレータを付けるだけです。

@parallel
def shutdown: sudo("/sbin/reboot -h now")
シェルスクリプトでも出来ますが、ssh & して waitしなければならないところです。もちろん前述のsudo は from fabric.api import sudo してるわけで、
sudo関数の向こう側は似たようなことになってるわけですが、見事に隠蔽しています。
この辺りが、フレームワークと呼びたい所以ですね。