Fabricの階層化に使う @ task デコレータの挙動

fabric を扱う可能性が出てきた

今まで概要は知っていたけどもうちょっと知らないといけなさそうだしちょっとさわってみた

概要

公式::Fabric — Fabric 1.8 documentation
参考::Fabric デプロイツールのPythonicな書き方 - Ian Lewis
参考::Fabricを使ってリモートサーバーでコマンドを実行する - スコトプリゴニエフスク通信
参考::fabfileの構造化 - logiqboard
デプロイツール。複数環境にデプロイするときにいろいろ設定を予めかいておいてあとは実行するだけにてきる。「じゃあシェルスクリプトやれよ」っていうかもしれないし実際中身はシェルスクリプトなんだけど、それを Python でかけてわかりやすく階層化できるから使っているらしい。ちなみにこの手のツールは Ruby だと Puppet とか Chef とか Capistano とかなんとかあるらしい。

普通に使う

fabfile.py を用意する。 fab -f オプションでファイル指定もできるらしいけどまあ決め打ちでいいと思う。

# coding: utf-8

from fabric.api import local

def hai():
    local('uname -s')
(fab)[atasatamatara ~] fab hai
# [localhost] local: uname -s
# Darwin

# Done.

階層化する

複雑になる場合モジュールに分割したい。なので階層化する。具体的なやり方は上記のやりかたをみるとわかる

(fab)[atasatamatara ~] tree fabfile/
fabfile/
├── __init__.py
├── __init__.pyc
├── ap.py
├── ap.pyc
├── db.py
└── db.pyc

こんな感じにしてみた。中身(__init__.py)に簡単な上記のような定義をする。

# coding: utf-8

from fabric.api import local
from fabric.decorators import task

@task
def hoge():
    local('uname -s')

@task
def moge():
    local("echo moe")

@task
def dev():
    run("uname -su")

import ap
import db

で、実行できるコマンドを一覧する

(fab)[atasatamatara ~] fab -l
Available commands:

    hai
    dev
    ap.start
    db.start

これで fab hai dev ap.start db.start などを叩いて実行できる

階層化したときに実行できるように明示するのが @task デコレータ

ためしに hai や ap.start の @task デコレータをとってみる

(fab)[atasatamatara ~] fab -l
Available commands:

    hoge
    moge
    db.start

こんなかんじで fab コマンドで叩けるものが減った。つまり、fab コマンドで叩くために明示するのが @task デコレータ、ですね。逆に言うとモジュール内部で使用するけど fab コマンドで叩いてほしくない場合は @task をかかない、ということになる

それだけ

デプロイ野郎になるかはわからないけど、 fabric をおまじないとしてつかっているのはあまりにもこわいので少しは理解を進めないとなぁ。