Fabric は、Python 製のデプロイ・システム管理ツールです。
最近、構築や運用を自動化するための様々なツールが出てきています。
構成管理ツールの Puppet や Chef が有名ですが、使うまでに覚えることが多いのが欠点です。
しかし、Fabric は非常にシンプルなツールで、今からすぐに使うことができます。
Fabric はデプロイ・システム管理ツールで、類似のツールとして Ruby 製の Capistrano があります。
Fabric の最大の特長は、シェルスクリプトを書き慣れた人がいきなり利用できるところです。
シェルスクリプトとしてまとめていたコマンドをそのまま run() メソッドや sudo() メソッドで囲むだけで、使うことができます。
シェルスクリプトを使っていていると、いくつもの問題に遭遇します。
- 名前空間の管理
- 変数の扱い
- 複雑なデータ構造がない(せいぜい配列ぐらい)
- 例外処理
これらの問題に頭を悩ませたことがある人は多いでしょう。
Fabric は Python で記述しますので、上記の問題は全て解決します。
「Fabric = シェルスクリプト + Python + 便利メソッド」
というイメージです。
SIerに勤めていてSE等をされている方は、運用チームのための運用手順書を書いたことがある人も多いでしょう。
その運用手順書の多くは、何らかのコマンドラインを実行する、という記述が書かれているはずです。
Fabric を使えば、その運用手順書を「ほぼそのまま」Fabric のスクリプトに移行できます。
Fabric のインストール
$ easy_install fabric
たったこれだけです。「easy_install って何?」という人は ymotongpoo先生の素晴らしい記事 を参考にしてください。約5分で読み終わり、さらに約5分で easy_install を使えるようになるでしょう。
試してみる(1): yum コマンドを Fabric から実行
例えば、yum コマンドで git をインストールする、という作業があったとします。
シェルを使えば以下のように書けるでしょう。
$ sudo yum -y install git
おそらく、普通の運用手順書では、「サーバAにログインし、以下のコマンドを実行する」という形で書いてあるはずです。
Fabric を使えば、そのような手順書は不要になります。
まず、リモートマシンを1台用意してください。
VM でも構いませんが、Amazon EC2 を使う方が便利です。EC2 を使ったことがないという方は、この記事の末尾で使い方などが記載されている資料のリンクを紹介します。
ここでは、以下のようなサーバ設定を例にとります。
ec2-user は Amazon Linux のデフォルト管理者ユーザで、sudo 権限を持っています。
EC2 上で RHEL を使う場合は ec2-user ではなく root を使ってください。
- サーバ名: ec2-XXX.ap-northeast-1.compute.amazonaws.com
- ユーザ名: ec2-user
- SSH秘密鍵のパス: ~/.ssh/id_rsa
Fabric を使う場合、まず適当なディレクトリを作成し、fabfile.py というファイルを作成してください。
次に、以下の内容を書き込みます。
from fabric.api import sudo
def install_git():
sudo("yum -y install git")
「え?」と思ったでしょうが、本当にこれでおしまいです。
あとは、fabfile.py の置いてあるディレクトリで、以下のコマンドを実行します。
$ fab -u [ユーザ名] -i [sshの秘密鍵] -H [ホスト名] install_git
先程のサーバ例の場合は、以下のようになります。
$ fab -u ec2-user -i ~/.ssh/id_rsa -H ec2-XXX.ap-northeast-1.compute.amazonaws.com install_git
たったこれだけで、リモートサーバで yum install git を実行することができます。
非常に簡単です!
今回紹介したサンプルスクリプトは、github に公開しています。
こちらも参考にしてみてください。
https://github.com/shiumachi/fabric-sample
試してみる(2): Fabric の価値を体感する
「ただ置き換えるだけならシェルスクリプトのままでいいじゃん」
と思う人のために、Fabric の強力な機能のうちのいくつかをを紹介します。
複数ホストに対して同時に実行
'-H' でホスト名を指定する際にカンマ区切りで複数のサーバを指定することができます。
例えば先程の例で、serverA と serverB に対し同時に install_git を実行したい場合は、以下のように書きます。
$ fab -u ec2-user -i ~/.ssh/id_rsa -H serverA,serverB install_git
複数コマンドを順番に実行
例えば、ユーザ 'hoge' を作成するコマンドを作りたいとします。
シェルスクリプトで書く場合は以下のようになります。
# adduser hoge
これを Fabric で書くと、以下のようになります。
def adduser_hoge():
sudo("adduser hoge")
シェルスクリプトの場合、先程の git のインストールコマンドと一緒に管理するには、別々のファイルとして保存するか、一緒のファイルにしてしまってバッチ実行するしかありませんでした。
Fabric の場合は、作成したメソッド全てを独立したコマンドとして扱えます。
fabric.py のあるディレクトリで、以下のコマンドを入力してみてください。
$ fab --list
そうすると、現在実行可能なコマンドの一覧が表示されます。
Available commands:
adduser_hoge
install_git
Fabric の面白いところは、一回のコマンドでこれらを任意の順番で実行できるところです。
以下の例のように、スペースを空けて一つづつコマンドを記述していくことで、Fabric はそのコマンドを左から順番に実行していきます。
$ fab -u ec2-user -i ~/.ssh/id_rsa -H ec2-XXX.ap-northeast-1.compute.amazonaws.com install_git adduser_hoge
たったこれだけのコマンドで、「git をインストールする」「ユーザ hoge を作成する」の2つの作業を実行できるのです!
次のステップ
もしこの記事を読んで、「よし、ちょっと Fabric を試してみよう」と思った方に、次にステップのための記事を紹介します。
EC2 を使ったことのない人のために、いくつかドキュメントを紹介します。
これらを読めば、EC2 上でインスタンスを立ち上げることができると思います。
これらを読んでもどうしても分からない人はAWSの有償サポートを買ってください。
多分人件費分は元が取れると思います。
更新履歴
2013/04/14 17:33 指摘に従い、タイトル及び冒頭の説明を修正