はじめに
知らない間にシリーズ化しはじめていますが (^^; 今回は、複数VMにまたがる構成を考えます。
前回は、Puppetを利用して、VMに対するOSインストールからアプリ導入・初期設定までを自動化しました。まとめると、下図のような「パーソナルクラウド(?)」の構築に成功したわけです。
図にすると不思議とカッコよく見えますね(笑)。次にやりたくなるのは、複数のVMにまたがる構成の自動化です。たとえば、DBの構成が終わったら、それに合せて、Webアプリケーションサーバでコネクションプールの設定をする、みたいなイメージです。
この場合、Puppetだけでは少しむずかしくなってきます。Puppetでは、複数サーバ間の設定順序を制御する仕組みがないためです。1つのやり方としては、PuppetのExecリソースを使って、他のサーバの状態を確認して、次に進むという方法があります。ちょっと工夫したやり方としては、各サーバが自分のジョブの進行状況をmemcachedとかに記録していくなどもあるでしょう。あるサーバは、他のサーバの状態をmemcachedから取得して、依存関係を解決していきます。
ただし。。。。この場合、基本的には、他のサーバの状態を各自がPollingする形になるので、依存関係が複雑になると、Pollingのタイムアウトの判断とか、Deadlockの検知とか、いろいろ面倒になりそうな気がしてきます。
で、次に考えられるやり方は、外部の「インストールサーバ」から一括して、各サーバを順番に構成する方式です。この場合は、インストールサーバ上で各サーバの設定の進行状況が把握できるので、処理フローの制御は簡単です。「各サーバが自律的に構成していく」という男の子の夢(?)っぽい雰囲気がなくなるのは残念ですが、今回は、まずはこの方法を試します。処理フローの記述も特別なツールは使わずに、まずは単純にシェルスクリプトで記述します。
やってみました
ネタはお得意(?)のGlusterFSクラスターです。まず、各ノード単体の構成は、Puppetで行います。前回作った「マニフェストをgithubから取得する手法」で行きます。使用するマニフェストはこちらです。
virt-constructを実行するKVMホストを「インストールサーバ」として利用するので、「ssh_authorized_key」リソースでKVMホストのSSH公開鍵を仕込むようにしています。その他には、ブリック領域のデバイスを指定する変数「$data_device」は、インストール時にKickStartから、環境変数「FACTER_data_device」経由で渡す前提です。
その上で、次をまとめて実行するシェルスクリプトを作成します。
・virt-constructから、複数のVMをインストールして、github上のマニフェストをPuppetで適用する。
・各VMの構成ができたら、SSHを使って、GlusterFSクラスタの構成とサンプルのボリュームを作成する。
まぁ。ある意味単純な話です。
関連するスクリプト類は、これで、virt-constructから指定するconfファイルは、こいつになります。
これらを用意した上で、こちらのスクリプトを実行します。スクリプトの内容だけ、参考までに、以下に晒しておきます。
#!/bin/sh -x virt_construct=~/bin/virt-construct.py sudo date # Only to cache temporary password authentication for sudo # # Create and install virtual machines # for i in $(seq 1 4); do sudo n=$i $virt_construct -c conf/gluster.conf -s & done wait # # Wait for virtual machines to start # for i in $(seq 1 4); do { res="" while [[ $res != "Linux" ]]; do res=$(ssh -o "StrictHostKeyChecking no" root@192.168.122.1$i uname) sleep 5 done } & done wait # # Excecute application configuration commands # ssh -o "StrictHostKeyChecking no" root@192.168.122.11 <<EOF gluster peer probe gluster02 gluster peer probe gluster03 gluster peer probe gluster04 sleep 1 gluster vol create vol01 \ gluster01:/data/brick01 \ gluster02:/data/brick01 \ gluster03:/data/brick01 \ gluster04:/data/brick01 sleep 1 gluster vol start vol01 EOF # vi:ts=4
このスクリプトを実行すると、4ノード構成のGlusterFSクラスタがさっくりと出来上がります。やっぱり自動化は楽しいですね。
この次は・・・
最後の手書きのスクリプトが、やはりアドホックな感じがしてしまいます。これをPuppetのようにDSLで宣言的に記述できるとよいのですが・・・。しばらく考えてみます。