fabric を使う¶
アプリケーションのデプロイやシステム管理を簡単に扱えるライブラリとして fabric があります。
- fabric - docs.fabfile.org
Warning
Python 2.5 以上が必要で、まだ Python 3.x 系には対応していません。 CentOS 標準のものは Python 2.4 なので、自分で 2.7 をインストールしてください。 Ubuntu や MacOSX Lion は Python 2.7 がインストールされているはずなので、そのまま使い始められます。
Python 3.x 系への対応はこちらの Issue で確認できます。 依存する paramiko の Issue は Close されましたので、たまには確認してみましょう。
fabric のインストール¶
Python 2.7 の環境を virtualenv で作成し、 pip で fabric をインストールします。
$ virtualenv --distribute $HOME/.pyvenv/python-school-ja-py27
$ source $HOME/.pyvenv/python-school-ja-py27/bin/activate
$ pip install fabric
fab コマンドが使えるようになります。
$ fab --version
Fabric 1.8.3
Paramiko 1.12.4
fabfile.py¶
fabric では fabfile.py というファイルを使います。 make における Makefile のようなものです。
fabfile.py は通常の Python スクリプトですが、 関数が fab コマンドとのインターフェイスとなります。 fabfile.py に Python の関数を定義し、 fab コマンドの引数に渡すことで実行されます。
次の4つの関数を定義してみましょう。
- hello: サーバ名を表示
- check: Python スクリプトの構文をチェック (手元で実行)
- test: Python スクリプトのテストを実行 (手元で実行)
- deploy: Python スクリプトを配置
fabfile.py
from fabric.api import local, run, put
def hello():
run("uname -s")
def check():
local("flake8 *.py")
def test():
local("nosetests *.py")
def deploy():
put("downloader.py", "/tmp/downloader.py")
def all():
check()
test()
deploy()
繰り返しになりますが、 fabfile.py は普通の Python スクリプトですから、 コマンド用の関数を呼び出すこともできます。 all のようにまとめて check(), test(), deploy() を実行してくれます。 デフォルトではエラーが発生した場合は途中で処理を中断します。 エラー時の挙動を変更したい場合は、 try-except を使って自分で何らかの処理を記述してください。
fab コマンドの実行¶
実行結果 (hello)
$ fab hello
No hosts found. Please specify (single) host string for connection: localhost
[localhost] run: uname -s
[localhost] Passphrase for private key:
[localhost] out: Could not open a connection to your authentication agent.
[localhost] out: Darwin
Done.
Disconnecting from localhost... done.
実行結果 (check)
$ fab check
実行結果 (test)
$ fab test
[localhost] local: nosetests *.py
........
----------------------------------------------------------------------
Ran 8 tests in 0.002s
OK
Done.
実行結果 (deploy)
$ fab deploy
No hosts found. Please specify (single) host string for connection: localhost
[localhost] Passphrase for private key:
[localhost] put: downloader.py -> /tmp/downloader.py
Done.
Disconnecting from localhost... done.
fab はたくさんのオプションを受け付けます。 たとえば -H オプションでホストを指定できます。
$ fab -H localhost deploy
[localhost] Executing task 'deploy'
[localhost] Passphrase for private key:
[localhost] put: downloader.py -> /tmp/downloader.py
Done.
Disconnecting from localhost... done.
ホストはカンマ区切りで複数指定できます。 複数のサーバーに平行してファイルを配布する場合には非常に便利でしょう。 その他のオプションはマニュアルやヘルプなどで確認してください。
Note
対話的にパスワードを入力するのではなく鍵認証を使う方法や、 ~/.ssh/config の設定を流用する方法もあります。 ブログ記事などを参照する際はバージョンに注意してください。 paramiko に含まれる SSHConfig 使って自前でファイルを解析している例もありますが、 fabric のバージョン 1.4 以降では use_ssh_config を使いましょう。
fabric に関する日本語の情報は少ないかもしれません。 Overview and Tutorial は英語ですが、サンプルコードを読めば雰囲気はつかめると思います。
また、github のようなサイトで検索すると使用例が見つかります。
- fabfile.py で検索 - github.com
より簡単に使い始めるには Ansible も検討してみてください。
宿題¶
- fabric を使って複数の Linux マシンに .bashrc を配布してみましょう。
- リモートにある Linux マシンに、同じ構成でスクリプト群を配布してみましょう。
- リモートにある Linux マシンで、Python の最新バージョンをソースコードからコンパイルさせてみましょう。