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 をおまじないとしてつかっているのはあまりにもこわいので少しは理解を進めないとなぁ。