Rundeckで始めるstretcherによるPull型デプロイ
オートスケールとかもろもろの理由からPull型デプロイに変えていきたいと思い、そうすると
を使いたいなぁとか思うわけです。 でも、Consul やら Serf まで今必要ないよなぁ、ということで Rundeck と組み合わせてみるといい感じになるのではと思いやってみました。
stretcher 作者である id:sfujiwara さんのエントリー YAPC::Asia 2015で発表してきました & ConsulとStretcherについて - 酒日記 はてな支店 にもある通り、stretcher は Consul / Serf なしに使えます。
Rundeck はインストール済みとします。Rundeck については下記リンクあたりをご参照いただくのがよいかと。
- 痒いところに手が届くバッチコントローラ「Rundeck」をご紹介! | 株式会社ロックオン社員ブログ
- ジョブスケジューラ「Rundeck」を試してみる | Developers.IO
- Cronの代わりに『Rundeck』を使ってみたら良い感じですよ!
上記あたりを参照して、まず適当にProjectを作成しておきます。
ノード
ここでのノード構成は以下のような感じです。各デプロイ先にはRundeckで設定したSSHキーを使ってログインできる状態にしておきます。
- 10.240.0.2 - Rundeckサーバ
- 10.240.0.3 - デプロイ先その1
- 10.240.0.4 - デプロイ先その2
- 10.240.0.5 - デプロイ先その3
Projectを作成すると /var/rundeck/projects/<プロジェクト名>/etc/resources.xml というファイルができているはずなので、これにデプロイ先のノード情報を登録します。以下のような感じ。
<?xml version="1.0" encoding="UTF-8"?> <project> <node name="localhost" description="Rundeck server node" tags="" hostname="localhost" osArch="amd64" osFamily="unix" osName="Linux" osVersion="3.19.0-28-generic" username="rundeck"/> <node name="node1" description="app node 01" tags="" hostname="10.240.0.3" username="appuser"/> <node name="node2" description="app node 02" tags="" hostname="10.240.0.4" username="appuser"/> <node name="node3" description="app node 03" tags="" hostname="10.240.0.5" username="appuser"/> </project>
各デプロイ先に、stretcher をインストールしておきます。おおよそ下記手順です。
$ go get github.com/fujiwara/stretcher $ cd $GOPATH/src/github.com/fujiwara/stretcher $ make get-deps $ make $ make install
なお、ここではmakeしてできたバイナリファイル:stretcherを、/usr/bin にコピーしてあることを前提としています。
Job 登録
実際に Job を作成していきます。
Options
マニフェストファイルを指定できるように Options を使います。
"Required" も "Yes" にしておきます。
Workflow
Step を追加します。ここでは inline script を追加います。 以下はスクリプトの内容です。
echo $1 | AWS_CONFIG_FILE=/path/to/aws_credentials /usr/bin/stretcher
また、"Arguments" には、
${option.manifest_url}
を指定しておきます。これにより、上記の Options で入力されたマニフェストURLが使われます。
Nodes
上記で登録したノードで実行されるようにします。下記のような感じです。
Thread Count
ここで1より大きい値を設定すれば、Rundeckは複数のノードに対して並行で処理を実行してくれます。
ただ、台数が数十台とかそれなりの台数になるなら Consul とかの別な方法で stretcher をキックする方が良さそうな気はします。
If a node fails
これ重要な設定です。これを下記のようにしておかないと、どこかのノードでデプロイが失敗すると、残りのノードで処理が実行されません。
あとは、好みで設定して Job を登録します。
Job 実行
Rundeckを使って stretcher をキックしていればその成否もわかるので、consul-kv-dashboardとかも不要で Rundeckに情報が集約されるのもよいです。
成功例
Job を実行して成功すると、以下のような結果を見ることができます。
"Log Output" に切り替えれば、stretcherの出力も見れます。
失敗例
デプロイに失敗しているホストも、下記のような感じで一目でわかります。
実行中
並列に実行されている様子も下記のようにわかります。(以下は、"Thread Count" を "2" にしています)
と、こんな感じで結構気軽に stretcher の導入ができるので Rundeck との組み合わせはオススメですね。
これに先立ち個人的に IAM Role を割り当てたEC2インスタンスで stretcher を動かしたかったので、その Pull Request を出してマージしてもらいました。id:sfujiwara さん Thanks!
みなさんも stretcher 使って、Pull型デプロイしましょう。