読者です 読者をやめる 読者になる 読者になる

めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

アプリケーション環境構築の自動化をまじめに考えてみる(4)

はじめに

知らない間にシリーズ化しはじめていますが (^^; 今回は、複数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で宣言的に記述できるとよいのですが・・・。しばらく考えてみます。