FabricとRailsと私 
z 
〜シンプルで、親密で、正確 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. 
by @chikaram
はじめに(注意点) 
1. 本プレゼンの内容は多少情緒的な面があります。 
2. Fabricは実業務では利用していません。 
※プライベートのなんちゃってRailsアプリなどに利 
用しているのみ。 
z 
3. そのためコード例は実業務には不適切な点があるか 
と思います。また主張にも理想論的なところがあり 
ます。 
何卒ご了承ください。 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
Fabricとは? 
Fabricとは、「Pythonic remote execution」 
つまり、「Pythonらしいリモート実行ツール」 
z 
でも、大方の反応はこうですよね? 
「Python分からないんだけど…」 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
Fabricとは? 
私もFabricと出会う前なら、Pythonと聞いただけで 
● Python?自分には関係ない話しだ 
● 私はRubyプログラマーだ、なぜわざわざPythonのツ 
ールを使わなくてはいけない 
z 
と思ったはず。 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
Pythonの知識は必要? 
むしろ、Pythonの会社ではない組織内で、かつチームで 
利用する場合は、Pythonの知識はない方がいい。 
z 
ほぼ不要。 
理由は、 
Pythonの高度な機能を利用すると、他の人が理解できな 
い。「あなたが分かる」と「みんなも分かる」は別物。 
※Pythonの会社でなければ、FabricのためにPythonの高 
度な機能を社員に学ばせるようなことは避けたい。(自 
分が学ぶのは自由) 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
Pythonの知識は必要? 
しかし、知識が完全にゼロだと実現できなことが「ま 
れ」にある。Fabric歴4ヶ月で以下を利用。 
○ 必ず利用する(サブコマンドの作成に必須) 
z 
● メソッドの定義 
● if文 
○ まぁまぁ利用する 
● リスト(配列)とfor inループ 
○ まれに利用する 
● 正規表現操作 
○ 一度だけ利用した 
※Python総学習時間約20分。ググって学んだだけ。 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
他の言語で同様のツールは? 
● What is Ruby's equivalent of Python's fabric? 
● Is there anything like Fabric for Perl? 
● Is there a deployment tool similar to Fabric written in 
● PHP alternative for Python's fabric 
z 
JavaScript? 
Stack Overflowより 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
他の言語で同様のツールは? 
● Ruby製のPython Fabricと同等のツールはなに? 
● PerlのFabricみたいなのある? 
● Fabricに似たJavaScriptで書かれたデプロイツールっ 
● PHPのPython Fabric代替品は? 
z 
てある? 
Stack Overflowより 
もうFabricでいいじゃん。Fabric使おうよ。 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
Fabricで何ができる? 
リモートホストでコマンド実行、つまり 
● サーバーの構築(構成管理) 
● 構築したサーバーのテスト 
● デプロイ 
● その他、面倒なタスクの定義(★ここ、重要!) 
z 
などが、Fabric一本でできる。 
Fabricは、構成管理、サーバーテスト、デプロイ、 
だけじゃない! 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
Fabricで何ができる? 
1. S3上のはずかしいファイルを削除して 
2. RDS上のはずかしいテーブルだけをtruncateして 
3. 法定相続人の公開鍵をEC2にセット 
4. Macのゴミ箱を空にして 
5. ツイッターに「ではさようz 
なら」とつぶやいて 
6. 最後に、これら一連の作業を行う実行ファイル 
例えば、、 
(fabfile.py)自体を消す! 
みたいな処理を死の間際の病床で実行しても多分動く! 
※いわゆるデプロイツールのマインドセットでは、「自 
分自身を消す」という発想自体出てこないはず。 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
Fabricの特徴 
他のメジャーなツールと最大の違いは 
「圧倒的な習得の容易さ」 
z 
● 5分程度で動かす事ができ 
● 30分程度でだいたいのことが理解可能 
※ツールの習得に挫折して、みじめな思いをすることは 
ないかと。 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
前置きが長くなりましたz 
が、使ってみましょう! 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
Fabric基本編(インストール) 
pipが入ってない場合は以下を実行。 
$ easy_install pip 
z 
$ pip install fabric 
$ fab -V 
Fabric 1.9.1 
Paramiko 1.14.0 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
Fabric基本編(おまじない) 
適当な場所にfabfile.pyを作成、中身は以下。 
from fabric.api import * 
from fabric.contrib.files import * 
from fabric.contrib.project import * 
※基本的な処理はfabric.apiだけでok。 
z 
以降、処理はこのfabfile.pyに追記する。 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
z 
Fabric基本編(run) 
@task 
def hello(): 
run('echo hello') 
@task 
def date(): 
run('date') 
サブコマンド一覧を表示する。 
$ fab -l 
リモートホストに例えばlocalhostと127.0.0.1の2台を指定。 
$ fab -H localhost,127.0.0.1 hello # helloを実行 
$ fab -H localhost,127.0.0.1 hello date # hello終了後dateを実行 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
Fabric基本編(run) 
ホストの指定をfabfile.pyに書く。 
env.hosts = ['localhost', '127.0.0.1'] 
env.user = 'chikaram' 
env.key_filename = '~/.ssh/id_rsa' 
するとホストの指定を省略できる。 
$ fab hello 
z 
$ fab hello date 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
z 
Fabric基本編(run) 
@task 
def staging(): 
env.hosts = ['localhost'] 
@task 
def production(): 
env.hosts = ['127.0.0.1'] 
staging(localhost)でhelloを実行。 
$ fab staging hello 
production(127.0.0.1)でhelloを実行。 
$ fab production hello 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
Fabric基本編(sudo, local) 
sudo('yum -y install mysql') # ここで失敗すると処理はストップする 
sudo('chkconfig mysql on') 
z 
リモートでsudoで実行。 
@task 
def setup_mysql(): 
ローカルで実行。 
@task 
def git_master(): 
local('git checkout master') # ここで失敗すると処理はストップする 
local('git pull origin master') 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
Fabric便利機能編(append, sed, uncomment) 
文字列の追記メソッド(内部はecho 文字列>> ファイル名) 
すでに同じ文字列がある場合は追記されない。(冪等) 
append('~/.bashrc', 'export RAILS_ENV=production') 
文字の変換メソッド(内部はsed) 
sed('/etc/ssh/sshd_config', 'Port 22', 'Port 2222', 
z 
use_sudo=True) # sudoで行うオプション 
コメント(デフォルトで#)を外すメソッド(内部はsed) 
uncomment('/etc/ssh/sshd_config', 'RSAAuthentication yes', 
use_sudo=True) # sudoで行うオプション 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
Fabric便利機能編(その他) 
○ ホスト毎にwebとdbを分ける場合など 
● コンファーム(fabric.contrib.console.confirm) 
○ if confirm('OK?', default=True): 
● プロンプト(fabric.operations.z 
prompt) 
● パッケージ化 
● ロール 
○ yes/noでなく入力値が欲しい場合など 
詳しく知りたい方はドキュメントを確認。 
http://docs.fabfile.org/ 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
Fabric応用編(Railsサーバーを作る例) 
run('¥curl -sSL https://get.rvm.io | bash -s stable --ruby') 
z 
@task 
def setup(): 
setup_ruby() 
setup_passenger() 
def setup_ruby(): 
def setup_passenger(): 
sudo('yum -y install httpd httpd-devel') 
sudo('chkconfig httpd on') 
run('gem install passenger') 
run('passenger-install-apache2-module --auto --languages ruby') 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
Fabric応用編(Railsサーバーをテストする例) 
その1: コマンドの返り値をPythonで確認して、問題が 
あればabortする。 
output = run('ruby -v') 
if not re.search('2.1.5', output): 
abort('Ruby 2.1.5 not installed.') 
z 
その2:【もっといいやり方】コマンドだけで確認する。 
run('ruby -v | grep 2.1.5') 
※grepは行が見つからない時エラーステータスを返すの 
で、Fabricもabortする。 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
Fabric応用編(Railsをデプロイする例) 
local_dir = '.', 
remote_dir = 'myapp', 
exclude = ['.git', 'log', 'tmp', 
'vendor/bundle', 'public/assets'], 
z 
@task 
def deploy(): 
output = rsync_project( 
delete = True, 
capture = True # rsyncの出力結果をキャプチャーするオプション 
) 
print output 
# 次のページにつづく 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
Fabric応用編(Railsをデプロイする例) 
# Gemfileに変更があればbundle installする(実際はdbロールに分ける) 
if re.search('Gemfile', output): 
run('cd myapp && bundle install --deployment') 
# assetsに変更があればprecompileする 
if re.search('(app|lib|vendor)/assets/', output): 
run('cd myapp && bundle exec rake assets:precompile') 
z 
# migrationに変更があればdb migrateする 
if re.search('db/migrate/', output): 
run('cd myapp && bundle exec rake db:migrate') 
# passengerを再起動 
run('touch myapp/tmp/restart.txt') 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
Fabric応用編(Railsをデプロイする例) 
● デプロイにかかる時間は約3秒! 
※Gemfile、assets、migrationに変更がない場合 
● 複数サーバーある場合は、@parallelアノテーション 
1. ローカルのFabric(1台)から 
2. リモートの中間デプロイサz 
ーバーのFabric(20台) 
で並列実行可能。 
を叩いて 
3. それらが20台にデプロイすれば 
400台くらいのデプロイは一瞬で終わるはず。 
※みたいなことは実際に試してから言え、ですが。 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
Fabric応用編(Railsをデプロイする例) 
参考) 
gitとshell scriptで1秒でやる例 
z 
http://factore.ca/blog/278-how-we-reduced-rails-deploy-times- 
to-under-one-second-with-plain-git 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
Fabric応用編(他にもこんなことが) 
本番サーバーのrails consoleとローカルから対話する。 
run('cd myapp && rails console') 
本番サーバーでrakeタスクを実行する。 
run('cd myapp && bundle exec rake my_task') 
z 
複数の本番サーバーのログを並列でtail -fして、ローカル 
でマージして表示する。(CPU食うので控えめに) 
@task 
@parallel 
def tail_log(): 
run('tail -f shared/log/production.log') 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
以上、あとはググz 
ってください! 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
Fabricのメリット 
● リモートサーバーの設定不要 
○ Fabricどころか、Pythonすら不要 
● 沢山のディレクトリーや設定ファイル不要 
○ 簡単なことなら1ファイルで完結 
○ ディレクトリーを分けてパッケージ化してもok 
z 
● ssh configの設定不要 
○ Fabric内でホスト群を管理でき、チームでホスト 
群の共有が容易(ssh configを設定してもok) 
● いざとなったら他のツールへの移行が簡単 
● DSLレスなのでDSLを覚える必要がない 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
DSLの功罪(特に内部DSL) 
1. DSLを利用してシンプルに書ける 
2. プログラマーでない人でも読み書きができる(かも 
z 
DSLのメリット 
しれない) 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
DSLの功罪(特に内部DSL) 
○ 記述法、思考法がそのDSLにロックインするため、 
z 
DSLのデメリット 
1. 覚えることが多い 
○ 書籍の鈍器化 
2. DSLにロックインする 
他のツールややり方に移行しにくい 
3. APIの変化の速度が早い 
○ インターフェースには「流行り廃れ」がある 
※ls、grep、yumは多分10年後でも使える 
○ 内部DSLの基盤言語の変化に引きずられる、かも 
※但し、デプロイ系ツールのAPI変更は少ない 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
DSLの功罪(特に内部DSL) 
4. プログラミングっぽいことをやりにくい 
○ if文やループ文が不格好に見える。罪悪感を感じる 
○ よりDSLらしくするために、さらにDSLが増える 
z 
DSLのデメリット 
DSLを利用するときはプログラミングをしている感覚を 
持てるようにすべきですし、(略) 
プログラムに手を加えるときは、プログラミング言語の 
環境にいることを意識させるようにすべきです。 
マーティン・ファウラー『ドメイン特化言語』P41 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
DSLの功罪(特に内部DSL) 
5. 内部実装が複雑なわりに、やってる仕事が小さい 
○ package_install(‘mysql’) # 抽象度や汎用性が高い 
sudo(‘yum -y install mysql’) # 結局このこと? 
z 
DSLのデメリット 
VS 
○ インターフェースがシンプル(使う側が楽)より 
も、実装がシンプル(コミッターが楽)の方が、 
最終的なメリットが大きいことが多い(と思う) 
○ なのでwith cd() とかも私はあえて使わない 
6. DSLとして提供されている機能も、非DSLな書き方 
で実行できてしまう(使う前に一通り覚えるべき) 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
DSLの功罪(特に内部DSL) 
3. と、ここまでデメリットがあっても、巨大な組織内 
で書き方をある程度統一できる、というメリットが 
勝ることはある。かな? 
z 
DSLのメリット 
大きな組織でFabricを使う場合、まずルールの制定から 
入らなければならない。 
※なので今の会社でFabric導入を提案する予定はない。 
cuisineやfabtoolsという選択肢もあるけど、そうなって 
きたらいっそAnsibleとかを使うのがいい気がする。 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
Unixの哲学 
1. 一つのことを行い、またそれをうまくやるプログラ 
ムを書け。 
○ run、sudo、localメソッド 
2. 協調して動くプログラムを書け。 
○ 周知のコマンド(ls、grep、yum)との協調 
例) sudo(‘yum -y install z 
mysql’) 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
Fabricのデメリット 
● 習得が容易なため、履歴書に書けない 
● 習得が容易なため、情報が少ない 
● 習得が容易なため、勉強会もない(多分) 
● 習得が容易なため、『詳解Fabric』も発売されない 
● 習得が容易なため、Fabric Conf 2014はない 
● 習得が容易なため、1,500USz 
ドルのFabric 3-day 
Training in Palo Altoもない 
だってつまるところ、やってることはリモートのコマン 
ドを叩いてるだけなので。 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
シンプルであることは、なぜ難しいか 
何が正しいのかは、皆答えられる。 
=> この機能、おかしい 
何が一貫性があるかも、皆答えられる。 
=> この機能、他と違う 
z 
何が完全であるかも、皆答えられる。 
=> あの機能が実装されてない 
しかし、何がシンプルであるかは誰も答えられない。 
シンプルさとは、答えではなく、問いであるから。 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
Fabricと私 
Fabricは私のプログラマー人生の中で最高のツール。 
最高のツールの「中の一つ」、ではなく本当に「一番」 
最高のツール。 
私はSSHするサーバーがあるz 
限り、Fabricを使い続ける。 
つまり、Fabricは「仕事を超えた存在」。 
※みなさんがお使いのツール、仕事を引退しても使い続 
けますか? 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
Fabricと私 
作者(@bitprophet)にGratipay.comを通じて、 
毎週寄付してるよ! 
z 
週1ドルだけどね! 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
Love Fabric! 
z 
ではなく、 
おわりに 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
Love developing 
with Fabric! 
z 
おわりに 
※目的は「作る事」、Fabricはあくまで手段。 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
ご清聴ありがとz 
うございました。 
おわりに 
Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram

FabricとRailsと私

  • 1.
    FabricとRailsと私 z 〜シンプルで、親密で、正確 Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. by @chikaram
  • 2.
    はじめに(注意点) 1. 本プレゼンの内容は多少情緒的な面があります。 2. Fabricは実業務では利用していません。 ※プライベートのなんちゃってRailsアプリなどに利 用しているのみ。 z 3. そのためコード例は実業務には不適切な点があるか と思います。また主張にも理想論的なところがあり ます。 何卒ご了承ください。 Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 3.
    Fabricとは? Fabricとは、「Pythonic remoteexecution」 つまり、「Pythonらしいリモート実行ツール」 z でも、大方の反応はこうですよね? 「Python分からないんだけど…」 Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 4.
    Fabricとは? 私もFabricと出会う前なら、Pythonと聞いただけで ●Python?自分には関係ない話しだ ● 私はRubyプログラマーだ、なぜわざわざPythonのツ ールを使わなくてはいけない z と思ったはず。 Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 5.
    Pythonの知識は必要? むしろ、Pythonの会社ではない組織内で、かつチームで 利用する場合は、Pythonの知識はない方がいい。 z ほぼ不要。 理由は、 Pythonの高度な機能を利用すると、他の人が理解できな い。「あなたが分かる」と「みんなも分かる」は別物。 ※Pythonの会社でなければ、FabricのためにPythonの高 度な機能を社員に学ばせるようなことは避けたい。(自 分が学ぶのは自由) Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 6.
    Pythonの知識は必要? しかし、知識が完全にゼロだと実現できなことが「ま れ」にある。Fabric歴4ヶ月で以下を利用。 ○ 必ず利用する(サブコマンドの作成に必須) z ● メソッドの定義 ● if文 ○ まぁまぁ利用する ● リスト(配列)とfor inループ ○ まれに利用する ● 正規表現操作 ○ 一度だけ利用した ※Python総学習時間約20分。ググって学んだだけ。 Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 7.
    他の言語で同様のツールは? ● Whatis Ruby's equivalent of Python's fabric? ● Is there anything like Fabric for Perl? ● Is there a deployment tool similar to Fabric written in ● PHP alternative for Python's fabric z JavaScript? Stack Overflowより Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 8.
    他の言語で同様のツールは? ● Ruby製のPythonFabricと同等のツールはなに? ● PerlのFabricみたいなのある? ● Fabricに似たJavaScriptで書かれたデプロイツールっ ● PHPのPython Fabric代替品は? z てある? Stack Overflowより もうFabricでいいじゃん。Fabric使おうよ。 Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 9.
    Fabricで何ができる? リモートホストでコマンド実行、つまり ●サーバーの構築(構成管理) ● 構築したサーバーのテスト ● デプロイ ● その他、面倒なタスクの定義(★ここ、重要!) z などが、Fabric一本でできる。 Fabricは、構成管理、サーバーテスト、デプロイ、 だけじゃない! Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 10.
    Fabricで何ができる? 1. S3上のはずかしいファイルを削除して 2. RDS上のはずかしいテーブルだけをtruncateして 3. 法定相続人の公開鍵をEC2にセット 4. Macのゴミ箱を空にして 5. ツイッターに「ではさようz なら」とつぶやいて 6. 最後に、これら一連の作業を行う実行ファイル 例えば、、 (fabfile.py)自体を消す! みたいな処理を死の間際の病床で実行しても多分動く! ※いわゆるデプロイツールのマインドセットでは、「自 分自身を消す」という発想自体出てこないはず。 Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 11.
    Fabricの特徴 他のメジャーなツールと最大の違いは 「圧倒的な習得の容易さ」 z ● 5分程度で動かす事ができ ● 30分程度でだいたいのことが理解可能 ※ツールの習得に挫折して、みじめな思いをすることは ないかと。 Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 12.
    前置きが長くなりましたz が、使ってみましょう! Copyright2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 13.
    Fabric基本編(インストール) pipが入ってない場合は以下を実行。 $easy_install pip z $ pip install fabric $ fab -V Fabric 1.9.1 Paramiko 1.14.0 Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 14.
    Fabric基本編(おまじない) 適当な場所にfabfile.pyを作成、中身は以下。 fromfabric.api import * from fabric.contrib.files import * from fabric.contrib.project import * ※基本的な処理はfabric.apiだけでok。 z 以降、処理はこのfabfile.pyに追記する。 Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 15.
    z Fabric基本編(run) @task def hello(): run('echo hello') @task def date(): run('date') サブコマンド一覧を表示する。 $ fab -l リモートホストに例えばlocalhostと127.0.0.1の2台を指定。 $ fab -H localhost,127.0.0.1 hello # helloを実行 $ fab -H localhost,127.0.0.1 hello date # hello終了後dateを実行 Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 16.
    Fabric基本編(run) ホストの指定をfabfile.pyに書く。 env.hosts= ['localhost', '127.0.0.1'] env.user = 'chikaram' env.key_filename = '~/.ssh/id_rsa' するとホストの指定を省略できる。 $ fab hello z $ fab hello date Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 17.
    z Fabric基本編(run) @task def staging(): env.hosts = ['localhost'] @task def production(): env.hosts = ['127.0.0.1'] staging(localhost)でhelloを実行。 $ fab staging hello production(127.0.0.1)でhelloを実行。 $ fab production hello Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 18.
    Fabric基本編(sudo, local) sudo('yum-y install mysql') # ここで失敗すると処理はストップする sudo('chkconfig mysql on') z リモートでsudoで実行。 @task def setup_mysql(): ローカルで実行。 @task def git_master(): local('git checkout master') # ここで失敗すると処理はストップする local('git pull origin master') Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 19.
    Fabric便利機能編(append, sed, uncomment) 文字列の追記メソッド(内部はecho 文字列>> ファイル名) すでに同じ文字列がある場合は追記されない。(冪等) append('~/.bashrc', 'export RAILS_ENV=production') 文字の変換メソッド(内部はsed) sed('/etc/ssh/sshd_config', 'Port 22', 'Port 2222', z use_sudo=True) # sudoで行うオプション コメント(デフォルトで#)を外すメソッド(内部はsed) uncomment('/etc/ssh/sshd_config', 'RSAAuthentication yes', use_sudo=True) # sudoで行うオプション Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 20.
    Fabric便利機能編(その他) ○ ホスト毎にwebとdbを分ける場合など ● コンファーム(fabric.contrib.console.confirm) ○ if confirm('OK?', default=True): ● プロンプト(fabric.operations.z prompt) ● パッケージ化 ● ロール ○ yes/noでなく入力値が欲しい場合など 詳しく知りたい方はドキュメントを確認。 http://docs.fabfile.org/ Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 21.
    Fabric応用編(Railsサーバーを作る例) run('¥curl -sSLhttps://get.rvm.io | bash -s stable --ruby') z @task def setup(): setup_ruby() setup_passenger() def setup_ruby(): def setup_passenger(): sudo('yum -y install httpd httpd-devel') sudo('chkconfig httpd on') run('gem install passenger') run('passenger-install-apache2-module --auto --languages ruby') Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 22.
    Fabric応用編(Railsサーバーをテストする例) その1: コマンドの返り値をPythonで確認して、問題が あればabortする。 output = run('ruby -v') if not re.search('2.1.5', output): abort('Ruby 2.1.5 not installed.') z その2:【もっといいやり方】コマンドだけで確認する。 run('ruby -v | grep 2.1.5') ※grepは行が見つからない時エラーステータスを返すの で、Fabricもabortする。 Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 23.
    Fabric応用編(Railsをデプロイする例) local_dir ='.', remote_dir = 'myapp', exclude = ['.git', 'log', 'tmp', 'vendor/bundle', 'public/assets'], z @task def deploy(): output = rsync_project( delete = True, capture = True # rsyncの出力結果をキャプチャーするオプション ) print output # 次のページにつづく Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 24.
    Fabric応用編(Railsをデプロイする例) # Gemfileに変更があればbundleinstallする(実際はdbロールに分ける) if re.search('Gemfile', output): run('cd myapp && bundle install --deployment') # assetsに変更があればprecompileする if re.search('(app|lib|vendor)/assets/', output): run('cd myapp && bundle exec rake assets:precompile') z # migrationに変更があればdb migrateする if re.search('db/migrate/', output): run('cd myapp && bundle exec rake db:migrate') # passengerを再起動 run('touch myapp/tmp/restart.txt') Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 25.
    Fabric応用編(Railsをデプロイする例) ● デプロイにかかる時間は約3秒! ※Gemfile、assets、migrationに変更がない場合 ● 複数サーバーある場合は、@parallelアノテーション 1. ローカルのFabric(1台)から 2. リモートの中間デプロイサz ーバーのFabric(20台) で並列実行可能。 を叩いて 3. それらが20台にデプロイすれば 400台くらいのデプロイは一瞬で終わるはず。 ※みたいなことは実際に試してから言え、ですが。 Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 26.
    Fabric応用編(Railsをデプロイする例) 参考) gitとshellscriptで1秒でやる例 z http://factore.ca/blog/278-how-we-reduced-rails-deploy-times- to-under-one-second-with-plain-git Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 27.
    Fabric応用編(他にもこんなことが) 本番サーバーのrails consoleとローカルから対話する。 run('cd myapp && rails console') 本番サーバーでrakeタスクを実行する。 run('cd myapp && bundle exec rake my_task') z 複数の本番サーバーのログを並列でtail -fして、ローカル でマージして表示する。(CPU食うので控えめに) @task @parallel def tail_log(): run('tail -f shared/log/production.log') Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 28.
    以上、あとはググz ってください! Copyright2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 29.
    Fabricのメリット ● リモートサーバーの設定不要 ○ Fabricどころか、Pythonすら不要 ● 沢山のディレクトリーや設定ファイル不要 ○ 簡単なことなら1ファイルで完結 ○ ディレクトリーを分けてパッケージ化してもok z ● ssh configの設定不要 ○ Fabric内でホスト群を管理でき、チームでホスト 群の共有が容易(ssh configを設定してもok) ● いざとなったら他のツールへの移行が簡単 ● DSLレスなのでDSLを覚える必要がない Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 30.
    DSLの功罪(特に内部DSL) 1. DSLを利用してシンプルに書ける 2. プログラマーでない人でも読み書きができる(かも z DSLのメリット しれない) Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 31.
    DSLの功罪(特に内部DSL) ○ 記述法、思考法がそのDSLにロックインするため、 z DSLのデメリット 1. 覚えることが多い ○ 書籍の鈍器化 2. DSLにロックインする 他のツールややり方に移行しにくい 3. APIの変化の速度が早い ○ インターフェースには「流行り廃れ」がある ※ls、grep、yumは多分10年後でも使える ○ 内部DSLの基盤言語の変化に引きずられる、かも ※但し、デプロイ系ツールのAPI変更は少ない Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 32.
    DSLの功罪(特に内部DSL) 4. プログラミングっぽいことをやりにくい ○ if文やループ文が不格好に見える。罪悪感を感じる ○ よりDSLらしくするために、さらにDSLが増える z DSLのデメリット DSLを利用するときはプログラミングをしている感覚を 持てるようにすべきですし、(略) プログラムに手を加えるときは、プログラミング言語の 環境にいることを意識させるようにすべきです。 マーティン・ファウラー『ドメイン特化言語』P41 Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 33.
    DSLの功罪(特に内部DSL) 5. 内部実装が複雑なわりに、やってる仕事が小さい ○ package_install(‘mysql’) # 抽象度や汎用性が高い sudo(‘yum -y install mysql’) # 結局このこと? z DSLのデメリット VS ○ インターフェースがシンプル(使う側が楽)より も、実装がシンプル(コミッターが楽)の方が、 最終的なメリットが大きいことが多い(と思う) ○ なのでwith cd() とかも私はあえて使わない 6. DSLとして提供されている機能も、非DSLな書き方 で実行できてしまう(使う前に一通り覚えるべき) Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 34.
    DSLの功罪(特に内部DSL) 3. と、ここまでデメリットがあっても、巨大な組織内 で書き方をある程度統一できる、というメリットが 勝ることはある。かな? z DSLのメリット 大きな組織でFabricを使う場合、まずルールの制定から 入らなければならない。 ※なので今の会社でFabric導入を提案する予定はない。 cuisineやfabtoolsという選択肢もあるけど、そうなって きたらいっそAnsibleとかを使うのがいい気がする。 Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 35.
    Unixの哲学 1. 一つのことを行い、またそれをうまくやるプログラ ムを書け。 ○ run、sudo、localメソッド 2. 協調して動くプログラムを書け。 ○ 周知のコマンド(ls、grep、yum)との協調 例) sudo(‘yum -y install z mysql’) Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 36.
    Fabricのデメリット ● 習得が容易なため、履歴書に書けない ● 習得が容易なため、情報が少ない ● 習得が容易なため、勉強会もない(多分) ● 習得が容易なため、『詳解Fabric』も発売されない ● 習得が容易なため、Fabric Conf 2014はない ● 習得が容易なため、1,500USz ドルのFabric 3-day Training in Palo Altoもない だってつまるところ、やってることはリモートのコマン ドを叩いてるだけなので。 Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 37.
    シンプルであることは、なぜ難しいか 何が正しいのかは、皆答えられる。 =>この機能、おかしい 何が一貫性があるかも、皆答えられる。 => この機能、他と違う z 何が完全であるかも、皆答えられる。 => あの機能が実装されてない しかし、何がシンプルであるかは誰も答えられない。 シンプルさとは、答えではなく、問いであるから。 Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 38.
    Fabricと私 Fabricは私のプログラマー人生の中で最高のツール。 最高のツールの「中の一つ」、ではなく本当に「一番」 最高のツール。 私はSSHするサーバーがあるz 限り、Fabricを使い続ける。 つまり、Fabricは「仕事を超えた存在」。 ※みなさんがお使いのツール、仕事を引退しても使い続 けますか? Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 39.
    Fabricと私 作者(@bitprophet)にGratipay.comを通じて、 毎週寄付してるよ! z 週1ドルだけどね! Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 40.
    Love Fabric! z ではなく、 おわりに Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 41.
    Love developing withFabric! z おわりに ※目的は「作る事」、Fabricはあくまで手段。 Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram
  • 42.
    ご清聴ありがとz うございました。 おわりに Copyright 2014 MIRAIBOX co.,ltd.All rights reserved. FabricとRailsと私〜シンプルで、親密で、正確by @chikaram