読者です 読者をやめる 読者になる 読者になる

Fabricを試してみた

f:id:hiraoy:20150625205021p:plain

こんにちは、おにぎりエンジニア平尾です。弊社のとあるプロダクトでそろそろデプロイツールを導入したくて、今回はFabricを試してみました。 デプロイツールといえばCapistranoも有名ですが、ある記事に「シェルスクリプトを書き慣れた人が使いやすい」みたいな事が書かれていて、とっつきやすそうなので今回はFabricを試してみました。ドキュメントが日本語なので嬉しいですね。

Welcome to Fabric’s documentation! — Fabric ドキュメント

特徴

コマンドライン経由で、任意のPython関数を実行するツールで、 シェルスクリプトをそのままFabricのメソッドrun()やsudo()メソッドで囲むだけで、使うことがきる。

インストール

今回Fabricをインストールするサーバ環境は、以下です。

CentOS 6.5
Python 2.7.9

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

f:id:hiraoy:20150624155726p:plain

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

f:id:hiraoy:20150624155350p:plain

実行コマンド

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するスクリプトを書いてみます。

f:id:hiraoy:20150624160024p:plain

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 世界最強のコンテンポラリージャズギタリスト是非聞いてみてください!