読者です 読者をやめる 読者になる 読者になる

文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

【python】fabricを触ってみた!【デプロイツール】

python fabric デプロイ

最近chefやvagrant等、世間では色々な事を自動化する流れになっています。
乗るしかない、このビッグウェーブに!、ということで、
今回触ってみたのはfabricというデプロイ・システム管理ツールです。
Fabric — Fabric 1.8 documentation

以前の記事でantのビルドを脱却してgradleに移行する記事を書き、移行する事ができたので、
成果物を配布・デプロイ、という部分をいい感じに自動化する部分を何とかするため、
fabricを触ってみることにしました。
目標は、jenkinsでチェックアウト+gradleでビルド、fabricで成果物を配布・デプロイ、です。

今回はまだ触っただけの状態なので、具体的なサンプルコードはほとんど掲載しません。
実は触ったのはほんの30分程度ですが、色々思った事を書いてみようと思います。

インストール

私の場合はmacにインストールしてみました。
yumもダメ、homebrewもダメ(Formulaが無い)、というちょっとアレな状態で、
代わりにeasy_installでインストールしました。
macの場合はできればhomebrewに統一したいですね。

sudo easy_install fabric

これだけでインストールが完了したので簡単でした。
pythonプレインストールのv2.7があったので、特にインストールしていません。

IDE

macの場合、pythonでいい感じのIDEって無いんですよね・・
eclipse + PyDevもいいんですが、windowsのPyScripter等と比較して明らかに劣っている気がします。
仕方ないのでエディタ(SublimeText2)でゴリゴリ書いているのですが、
importするものが何のか解らない!のです。
↓例えばこんなやつです。

from fabric.api import run, sudo, local, put

eclipse + javaの場合、importはideにお任せで、自分で手打ちする事なんてまずありません。
しかしエディタなので、そもそも何をimportしたらいいか解らず、相当戸惑いました。
私は基本eclipse + javaの開発ばっかりなので、できればeclipseでいい感じにコード補完してくれるとありがたいのですが、PyDevはそこまで高機能じゃないんですよね・・・

sudoはどうなる?

apacheの起動・終了等で絶対に必要になるsudo。
さて、fabricではどうやるのか。どうなるのか。
まずpythonのファイルに以下を書きます。

from fabric.api import sudo
def httpdRestart():
    sudo('/etc/init.d/httpd restart')

そして、以下で実行します。

fab -uuser -ppassword -hhost -f hoge.py httpdRestart

これで再起動できます。パスワードの対話式入力を突破してくれるので、
パスワード入力で止まる事はありませんでした。これはありがたい。
bashでやるとsudo突破関数みたいの用意してやってたので、短く綺麗に書けていい感じです。

scpはどうなる?

scpではないですが、sftpによる転送ができました。

from fabric.api import put
def upload():
    put('/home/user/hoge.txt', '/tmp/')

こんな感じでできました。putの第1引数がlocal、第2引数がremote、です。
試しに $HOME/hoge.txt と指定してみましたが、解釈されませんでした。
この辺の環境変数等の扱いがどうなるのかはまだ調査中です。

なんでcapistranoにしなかったの?

rubyが嫌いなんだよ!!
endって書くのがキモいんだよ!!
オレオレインデントされたくないんだよ!!

というのが主な原因ですが、
capistranoはfabricより重厚な作りなのも敬遠した理由の1つです。
個人的に重厚なツールは嫌いで、困った時に自力で何とかできる抜け道があるツールの方がいいと思っているので、薄い作りのfabricを選びました。

で、実践で使えそう?

使えると思います。
但し、必要なメソッドを洗い出して、環境毎・サーバ毎に挙動・設定を変えられるように、
事前に設計しておかないとダメですね。これはfabricに限らずbashでもcapistranoにも言えるでしょう。

私的には、sudoが楽なだけで使いたくなっちゃいます。
後、pythonなのでbashみたいにtrapしないで単純にtry-catchできるのも嬉しい。
しかし今はbashでゴリゴリデプロイスクリプトを書く事に慣れすぎていて、習得には少し時間がかかりそうです。
結局のところfabricなんて使わなくてもbashだけでデプロイできるので、
fabricを使うメリットが現れるようなコードが書けるようにならないと、使う意味は無いでしょう。

入門Chef Solo - Infrastructure as Code

入門Chef Solo - Infrastructure as Code

Jenkins実践入門 ?ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

Jenkins実践入門 ?ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

Pythonスタートブック

Pythonスタートブック