#[fit] Stretcher in 5 min
A deployment tool with Consul / Serf event.
Consul / Serf と連携して動くデプロイツール
(実は Consul/Serf なしでも動きます)
(以前) rsync による中央ホストからのdeploy
オートスケールに対応できない
各ホストからrsyncでpull? → build中にrsyncされたら…
台数が多いと並列ssh + rsyncがつらい
AMI作り直し & インスタンス入れ替えは待てない
inspired by github.com/sorah/mamiya,
AWSじゃなくても動く
Goで書く(自身のdeployが楽)
rsyncしてからコマンド実行、というフローは踏襲
Consul eventでイベント通知
Consul とは疎結合 (consul watch
で起動)
Architecture
- アプリケーションをbuildしてtar.gzにする
- 手順書(manifest)を書く
- tar.gz, manifestをS3(or httpd)に上げる
- consul event で manifest URLを通知
consul event -name deploy s3://...
✄--------- ここまでstretcherではない -------✄
consul watch -type event -name deploy stretcher
✄------------ stretcherここから ------------✄
- eventからmanifest URLを取得
- tar.gzを取得してTMPDIRに展開
rsync -av --delete
で更新- post command実行
- アプリケーション再起動など
src: s3://example.com/app.tar.gz
checksum: e0840daaa97cd2cf2175f9e5d133ffb3324a2b93
dest: /home/stretcher/app
commands:
pre:
- echo 'staring deploy'
post:
- echo 'deploy done'
success:
- cat >> /path/to/success.log
failure:
- cat >> /path/to/failure.log
excludes:
- "*.pid"
- "*.socket"
AWS 上の某サービス (50〜100 instances)
tar.gz ~200MB
consul event 送信から約10秒で完了 (rollbackも!)
2015/08/05 14:58:30 Starting up stretcher agent
2015/08/05 14:58:30 Waiting for consul events from STDIN...
2015/08/05 14:58:30 Executing manifest: s3://...
2015/08/05 14:58:33 Extract archive: /dev/shm/stretcher539962129 to /dev/shm/stretcher_src648982332
2015/08/05 14:58:36 rsync [-av --delete --exclude-from
/dev/shm/stretcher_src648982332/conf/rsync_exclude.web
/dev/shm/stretcher_src648982332/ /home/xxx/web/]
2015/08/05 14:58:36 sending incremental file list
...
sent 787780 bytes received 5230 bytes 1586020.00 bytes/sec
total size is 359702435 speedup is 453.59
2015/08/05 14:58:36 invoking command: /home/xxx/web/refresh_services.sh
2015/08/05 14:58:41 success.
2015/08/05 14:58:41 Deploy manifest succeeded.
イベント送信元では全台の実行完了が分からない
- post commandで deploy ID を KV に送信
- Consul KV Dashboard で全台の ID が揃うのを待つ
台数が多いと…
- success/failure command で実行ログを KV に
- Consul KV Dashboard で状態が変化したらトリガ→通知
github.com/fujiwara/consul-kv-dashboard
speakerdeck.com/fujiwara3/consul-kv-dashboard
Consul KV に最新の manifest URL を保存
インスタンス起動後
consul join
- stretcher 実行
- 最新のmanifest URLをKVから取得
- 自分自身に event を送信
× AMIに残っている古いアプリが起動 ○ 最新の deploy IDでない場合は起動しない
deploy時: unique な ID を発行
- ファイルに書いて tar に入れる
- Consul KV にも入れる
起動時:ローカルファイルの ID と KV を比較
- 食い違ってたら sleep 10 && exit → daemontoolsで再起動
serf agent -event-handler="user:deploy=stretcher"
serf event deploy "s3://..."
環境変数 SERF_USER_EVENT
で動作切り替え
なので…
echo "s3://..." | SERF_USER_EVENT=deploy stretcher
実は Consul / Serf でなくても起動可能
YAPC::Asia 2015でもっといろいろ話します
2015-8-21 13:10~