こんにちは、おにぎりエンジニア平尾です。弊社のとあるプロダクトでそろそろデプロイツールを導入したくて、今回はFabricを試してみました。 デプロイツールといえばCapistranoも有名ですが、ある記事に「シェルスクリプトを書き慣れた人が使いやすい」みたいな事が書かれていて、とっつきやすそうなので今回はFabricを試してみました。ドキュメントが日本語なので嬉しいですね。
Fabricのドキュメントへようこそ ! — Fabric ドキュメント
特徴
コマンドライン経由で、任意のPython関数を実行するツールで、 シェルスクリプトをそのままFabricのメソッドrun()やsudo()メソッドで囲むだけで、使うことがきる。
インストール
今回Fabricをインストールするサーバ環境は、以下です。
pipを使用してFabricをインストールします。
pip install fabric
fabというスクリプトがインストールされます。かなり簡単ですね。
試してみること
- 単体のリモートサーバでコマンドを実行する
- 複数のリモートサーバでコマンドを実行する
- 複数のリモートサーバでgitコマンドを実行する
単体のリモートサーバでコマンドを実行する
ではFabricを使ってリモートサーバでコマンド(hostname)を実行してみます。
リモートマシンのサーバ環境は以下です。
OS : Amazon Linux
user : ec2-user
host : ******.ap-northeast-1.compute.amazonaws.com
※ログインはSSH秘密鍵 id_rsa
fab実行時読み込まれるファイルを作成
以下に詳細があります。
fabfileの構成と使い方 — Fabric ドキュメント
fabfile.py
#hostname を取得するスクリプト from fabric.api import run def get_hostname(): run("hostname")
実行コマンド
fab -u ec2-user -i path/to/id_rsa -H ******.ap-northeast-1.compute.amazonaws.com get_hostname
結果
Executing task 'get_hostname' run: hostname out: ip-172-31-9-30 out: Done.
out でhostnameが実行されていることが確認できました。
※コマンド実行ディレクトリは対象ユーザのホームディレクトリみたいです。
複数のリモートサーバでコマンドを実行する
次は複数のホストで実行してみます。ホスト名をカンマ区切りで入力するだけで複数サーバに実行できます。
※もう1台同じ環境を用意。host以外は全て同じです。
host : ++++++.ap-northeast-1.compute.amazonaws.com
実行コマンド
fab -u ec2-user -i path/to/id_rsa -H ******.ap-northeast-1.compute.amazonaws.com,++++++.ap-northeast-1.compute.amazonaws.com get_hostname
結果
Executing task 'get_hostname' run: hostname out: ip-172-31-9-30 out: Executing task 'get_hostname' run: hostname out: ip-172-31-6-214 out: Done.
複数のサーバに実行できた事を、確認できました。
複数のリモートサーバでgitコマンドを実行する
では次に複数のサーバにgitからcloneするスクリプトを書いてみます。
fabfile.py に追記する
#~hoge/gitSample ディレクトリを作成し、そこにgit cloneする from fabric.api import run def get_hostname(): run("hostname") def clone_sample(): run("mkdir -p hoge/gitSample") run("git clone https://user:password@github.com/******/fabric_test.git hoge/gitSample")
実行コマンド
fab -u ec2-user -i path/to/id_rsa -H ******.ap-northeast-1.compute.amazonaws.com,++++++.ap-northeast-1.compute.amazonaws.com clone_sample
結果
Executing task 'clone_sample' run: mkdir -p hoge/gitSample run: git clone https://user:password@github.com/******/fabric_test.git hoge/gitSample out: Cloning into 'hoge/gitSample'... out: remote: Counting objects: 3, done. out: remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0 out: Unpacking objects: 33% (1/3) out: Unpacking objects: 66% (2/3) out: Unpacking objects: 100% (3/3) out: Unpacking objects: 100% (3/3), done. out: Checking connectivity... done. out: Executing task 'clone_sample' run: mkdir -p hoge/gitSample run: git clone https://user:password@github.com/******/fabric_test.git hoge/gitSample out: Cloning into 'hoge/gitSample'... out: remote: Counting objects: 3, done. out: remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0 out: Unpacking objects: 33% (1/3) out: Unpacking objects: 66% (2/3) out: Unpacking objects: 100% (3/3) out: Unpacking objects: 100% (3/3), done. out: Checking connectivity... done. out: Done.
複数サーバにディレクトリを作成し、cloneできました。
まとめ
シェルスクリプトをそのままかけるので、すごくとっつきやすいです!まだ色々なAPIがあるっぽいので、まだまだ試してみたですね。
今回のおすすめおにぎりは、浅草で食べた「牛巻きおにぎり」どこの店で食べたか忘れましたが、すごくおいしかったです!
今回はギタリストも紹介しましょう!
kurt rosenwinkel 世界最強のコンテンポラリージャズギタリスト是非聞いてみてください!