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に移行していこうと思います。