No Web Service No Life

メルカリUS/UK版のPM。ブロダクトマネジメント・インターネットについて

Fabricで複数サーバに一括でコマンド実行する

最新のアプリ・Webサービスを紹介するサービスサファリを運営しています。

社内ハッカソンでデプロイの効率化に取り組んだのでメモ。

デプロイに限らず、複数サーバで同じコマンドを実行することが多々あるのですが、以下の観点から、一元化したいなーと思っていました。

  • 時間がかかる(各サーバにSSH接続して、コマンド叩いて~)
  • 台数が増えるほどオペミスのリスクが高まる

真っ先に思い浮かんだのがCapistranoとFabric。最初、周りに使っている人が多いからCapistranoにしようと思ったのですが、世界的にはFabricの方が人気みたいなので、ミーハーな私は人気な方を選びました。
参考:Googleでのそれぞれの検索量

インストール

sudo yum -y update
sudo yum install python-devel wget -y
sudo yum groupinstall "Development Tools" -y
cd /usr/local/src
sudo wget http://peak.telecommunity.com/dist/ez_setup.py
sudo python ez_setup.py
sudo easy_install pip
sudo pip install fabric

動作確認

インストールが完了したら、Pythonでコマンド定義を書いていき、fabコマンドで実行したいコマンド群とファイルを指定することで、ローカルやリモートホスト上でコマンドを実行できます。

  • ソース例
from fabric.api import local, env, run, sudo, cd

env.user = 'username'
env.hosts = ['host a', 'host b']
env.password = 'password'

def test():
    run('echo hoge')
def piyo():
    with cd('/tmp'):
        run('ls')
def sudo():
    sudo('/etc/init.d/httpd restart')
  • 実行

env.hostsで指定した全てのホスト上でecho hogeが実行されます。

fab hoge -f sample.py

ディレクトリ移動して実行したい場合は、実行したいコマンドの前にwith cdを記述し、移動先パスを引数に渡します。sudo実行もできます。
hostsの指定もかなり細かくできるようです。

  • 複雑なコマンド(例:rsync)

簡単なコマンドは実行関数の引数としてベタ書きできるのですが、複雑なもの?は、それようの関数が用意されていて、引数でそのコマンドの引数やオプションを渡します。
rsyncがちょっとむずかしいです。。。別途projectのインポートが必要。
公式ドキュメントが一番参考になる。

from fabric.contrib import project

def rsync():
    project_path = 'パス'
    with cd(project_path):
        exclude = ['hoge/', '*.log']       
        project.rsync_project(project_path, project_path, exclude = exclude, delete = True)


色々な操作をFabricに移行していこうと思います。


最新のWebサービス・スマホアプリの情報が毎日メールで受信できるキュレーションサービス『Service Safari』を運営しています。
エンジニアを募集していますので、ご興味のある方はFacebookやTwitterからご連絡ください。