kikumotoのメモ帳

インフラ・ミドル周りを中心に、興味をもったことを適当な感じで。twitter : @takakiku

Rundeckで始めるstretcherによるPull型デプロイ

オートスケールとかもろもろの理由からPull型デプロイに変えていきたいと思い、そうすると

github.com

を使いたいなぁとか思うわけです。 でも、Consul やら Serf まで今必要ないよなぁ、ということで Rundeck と組み合わせてみるといい感じになるのではと思いやってみました。

stretcher 作者である id:sfujiwara さんのエントリー YAPC::Asia 2015で発表してきました & ConsulとStretcherについて - 酒日記 はてな支店 にもある通り、stretcher は Consul / Serf なしに使えます。

Rundeck はインストール済みとします。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 を使います。

f:id:kikumoto:20150916182731p:plain

"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

上記で登録したノードで実行されるようにします。下記のような感じです。

f:id:kikumoto:20150916183827p:plain

Thread Count

ここで1より大きい値を設定すれば、Rundeckは複数のノードに対して並行で処理を実行してくれます。

ただ、台数が数十台とかそれなりの台数になるなら Consul とかの別な方法で stretcher をキックする方が良さそうな気はします。

If a node fails

これ重要な設定です。これを下記のようにしておかないと、どこかのノードでデプロイが失敗すると、残りのノードで処理が実行されません。

f:id:kikumoto:20150916184520p:plain

あとは、好みで設定して Job を登録します。

Job 実行

Rundeckを使って stretcher をキックしていればその成否もわかるので、consul-kv-dashboardとかも不要で Rundeckに情報が集約されるのもよいです。

成功例

Job を実行して成功すると、以下のような結果を見ることができます。 f:id:kikumoto:20150916184906p:plain

"Log Output" に切り替えれば、stretcherの出力も見れます。

失敗例

デプロイに失敗しているホストも、下記のような感じで一目でわかります。 f:id:kikumoto:20150916185110p:plain

実行中

並列に実行されている様子も下記のようにわかります。(以下は、"Thread Count" を "2" にしています) f:id:kikumoto:20150916185421p:plain

と、こんな感じで結構気軽に stretcher の導入ができるので Rundeck との組み合わせはオススメですね。

これに先立ち個人的に IAM Role を割り当てたEC2インスタンスで stretcher を動かしたかったので、その Pull Request を出してマージしてもらいました。id:sfujiwara さん Thanks!

みなさんも stretcher 使って、Pull型デプロイしましょう。