『デプロイは気持ちいい』という事について、デプロイ王子と合意したcloudpack津村です。
コマンド1発でインスタンスが生えてきたりスクリプトを展開したりするのは気持ちいモノですね…。

VyattaCoreのHAクラスタを自動構成するスクリプトを公開

先日のブログで書いたVyattaCoreのHA構成について、インスタンスのフェールオーバーに必要な部分の作り込みを自動化するスクリプトを開発、公開しました。
スクリプトはgithubにて公開しており、誰でも無償で使うことが可能です。

aws-vyatta-clustering-builder (gitfub.com)
標準機能でできた!商用版VYATTAのマルチAZ化

このスクリプトがやっている事

まず、このスクリプトはVyattaCoreでのみ動作します。
これは、/bin/shが/bin/sh.distribになる等、環境依存する部分がハードコーディングされている為です。

動作として、まずawsコマンドをインストールする為に、Python等をダウンロードし、自動でインストールします。
これは、以下のブログを参考にさせて頂きました。
VyattaにPython版AWSコマンドラインインターフェース(CLI)をインストールしてみた – suz-lab blog

ここで、「--nodownload」「--configonly」オプションを使うことができます。
--nodownloadでは、外部のパッケージのダウンロードをスキップします。インターネットに疎通しない環境でお使いください。
--configonlyでは、Python + awscliのインストールとダウンロードをスキップします。Configを再生成する場合などにお使いください。

次に、 /etc/profile.d/awscli.sh を生成します。
これにより、ログインした環境でawsコマンドのオートコンプリートを有効にします。

次に、「associate-nat」「associate-eip」コマンド、及び設定ファイルを生成します。

associate-natコマンドは、NATインスタンス等で使われるROUTE TABLEのエントリを書き換えます。
例えば「0.0.0.0/0」のエントリを書き換える場合、置換処理になる為、事前にエントリを生成する必要があります。

associate-eipコマンドは、設定されたEIPを自身に付け替えます。
この際、PublicIPで接続されているセッションは全て切断される為、クラスタの挙動を監視する場合などは事前にVPC内に踏み台を用意するなどして下さい。

最後に、「/etc/init.d/failover」を生成します。
フェールオーバーした際にこのコードがHeartbeatからコールされます。
デフォルトでは、「associate-nat」「associate-eip」がコメントアウトされた状態ですので、適宜編集してください。

スクリプトの実行が終了すると、以下のようなコメントとサンプルConfigが表示されます。

**************************
*** CONFIGURE COMPLETE ***
**************************

Can use aws-cli after re-login vyatta user.
Please edit setting files.
o /root/.aws/credentials - AWSCLI config.
o /etc/sysconfig/associate-eip - EIP Failover config.
o /etc/sysconfig/associate-nat - ROUTE TABLE Failover config.
o /etc/init.d/failover - Failover Script.

Edit AWSCLI credentials file first.
If use IAM role, delete credentials file.

Vyatta clustering sample config on vpc.
o vyatta-a - Primary 169.254.0.1/30
o vyatta-c - Secondary 169.254.0.2/30
* local-ip is this instanse ip addr.
---
set system host-name vyatta-a
set interfaces tunnel tun00 address '169.254.0.[1-2]/30'
set interfaces tunnel tun00 encapsulation 'gre'
set interfaces tunnel tun00 local-ip '10.0.0.1' // ※自身のLocalIP
set interfaces tunnel tun00 remote-ip '[Peer LocalIP]'
set interfaces tunnel tun00 multicast enable

set cluster interface tun00
set cluster pre-shared-secret mikalab
set cluster group aws
set cluster group aws primary vyatta-a
set cluster group aws secondary vyatta-c

Config内のlocal-ipは、自身のLocalIPを取得して表示しています。
Peer LocalIPとhostname、事前共有鍵、トンネルインターフェースのIPアドレスを書き換えてください。

おわりに

検証に4日、コーディングとテスト1日と、1週間の突貫開発でしたが、いかがでしたでしょうか。
だいたいHA構成のこの部分は手間取る割には使わないので、なかなかスクリプト化できない部分だと思います。
あとはお好みでカスタマイズしてください。

コードはちょっと冗長な部分がありますが、可読性とメンテナンスの容易性を意識して書いてみたつもりです。
また、このナレッジはグローバルで役立つ可能性もあると考え、コードやREADME含め全て英語にしてみました。(中学の英語のテストで5点を取った事がありますがw)
もしお気づきの点や、「このAMIで動いたよー」とかあれば、PullReqestかメール頂けると幸いです。

元記事はこちらです。
VyattaCoreのHA CLUSTERを自動構成するスクリプトを公開します