fabric を使ってみた

最近 githubSphinx で作った s6 スライドのソースを置いて、それを自分の VPS にアップロードするということが結構ある。

その時に

  • github に push
  • サーバに ssh
    • git clone
    • buildout
    • make html
    • sudo して /var/www なりなんなりにコピー

という手順をこなさないといけない。

大した手順ではないけれど、正直めんどい。
一回だけならいいけれど、更新掛けたり何度も書き換えるようなときは手間なのでなんとか自動化したい。

というわけで fabric を使ってみた。

fabric とは

Fabric is a Python (2.5 or higher) library and command-line tool for streamlining the use of SSH for application deployment or systems administration tasks.

http://docs.fabfile.org/en/1.4.3/index.html

適当に訳すと fabric とは Python2.5 以降で動く SSH を使ったアプリケーションデプロイやサーバ管理を行うためのツールである、ということらしい。

fabric の使い方

fabric は以下のようにして使う。

  • easy_install/pip で fabric を入れる
    • pycrypto が古かったので更新した記憶あり
  • fabfile.py を書く
  • fab コマンドを実行

で、問題なのは fabfile.py を書くところ。

今回書いたのは以下のようなスクリプト

#-*- coding:utf-8 -*-

import sys
import os
import subprocess

from fabric import api

api.env.hosts = ['vps_hostname']

python = '/usr/local/python2.6/bin/python'

m = lambda *seq: subprocess.list2cmdline(seq)

def make_docs(n):

    target = os.path.join('/path/to/apache/public/dir', n)

    with api.cd(n):
        api.run(m(python, '/path/to/bootstrap.py', '-d', 'init'))
        api.run(m('bin/buildout', '-N'))
        api.run(m('bin/make-docs'))
        api.run(m('sudo', 'rm', '-rf', target))
        api.run(m('sudo', 'cp', '-r', '_build/html', target))



def deploy():

    with api.cd('linuxsyscall'):
        api.run('git pull')

        make_docs('01')

で、こんなものを用意して、

$ fab deploy

ってやると api.env.hosts に設定したホストに ssh して勝手に処理してくれる。
sudo したらパスワードの入力を求めてくれるので非常に楽。

やー楽だわー。めっちゃ楽だわー