OSSのクラウド基盤「Eucalyptus」を使う(8)--応用編〜おわりに

高橋浩和、箕浦真(VA Linux Systems Japan)
2009-08-04 15:35:01
  • このエントリーをはてなブックマークに追加

スクリプトの解説

 まずはユーザーデータを取得します。デバッグ用に、スクリプトに引数が渡されていれば、それを代わりに使います。

nobuild=
nohalt=
bucket=eucabuild
if [ $# -eq 0 ]; then
    curl -s -o /tmp/ud$$ http://169.254.169.254/latest/user-data || exit 11
    ud=`cat /tmp/ud$$`
    set -- $ud
fi
args=`getopt nhb: $*`
if [ $? -ne 0 ]; then
    echo 'Usage: ec2run -d "[-n] [-h] [-b ]"' `curl -s http://169.254.169.254/latest/meta-data/ami-id`
    exit 12
fi
set -- $args

while [ $# -gt 0]; do
    case "$1" in
    -n)  nobuild=1;;
    -h)  nohalt=1;;
    -b)  bucket=$2
         shift;;
    --)  shift
         break;;
    esac
    shift
done
if [ $# -gt 0]; then
    echo 'Usage: ec2run -d "[-n] [-h] [-b ]"' `curl -s http://169.254.169.254/latest/meta-data/ami-id`
    exit 13
fi

 ここでは、ユーザーデータをcurlで取得してその値をそのままgetopt(1)に渡しています。オプションの分析結果はシェル変数「nobuild」「nohalt」「bucket」に反映させます。

 EBSをインスタンスに割り当てる部分を見てみましょう。試験などのためには、既に割り当てられていたらスキップするような処理があるとよいでしょう。

    MYID=`curl -s http://169.254.169.254/latest/meta-data/instance-id`
    case "$MYID" in
i-????????)
;;
*)
echo "Cannot get my instance ID"
return
;;
    esac

    if [ ! -d /sys/block/sdb1 ]; then
ec2-attach-volume -K $EC2_PRIVATE_KEY -C $EC2_CERT -U $EC2_URL $VOLUME -i $MYID -d sdb1
i=0
while [ $i -lt 30 ]; do
    if [ -d /sys/block/sdb1 ]; then
break
    fi
    sleep 1
    i=$(($i+1))
done
if [ $i -ge 30 ]; then
     echo "Failed to attach EBS"
    return
        fi
    fi
    if [ ! -d /mnt/eucalyptus ]; then
mount /dev/sdb1 /mnt
    fi

 ここで「EC2_PRIVATE_KEY」「EC2_CERT」「EC2_URL」は、それぞれeucarcの変数と同じです。また、VOLUMEはEBSのID、つまり「vol-????????」です。

 EBSを含むすべてのブロックデバイスは、「/sys/block」の下にエントリを持ちますので、EBSがインスタンスに割り当てられているか否かの判断に使えます。

 ec2-attach-volumeコマンドが終了しても、実際に割り当てられるまでには時間がかかりますので、しばらくポーリングしています。

 Bazaarのリポジトリから最新版を取得した後、ソースコードに含まれているspecファイルを編集します。ビルド毎にバージョンを変えるのが目的ですから、specファイルの「Release:〜」の行の最後にビルド番号を追加することにします。specファイル名が一度変わっているのでそれに対応しました。また、合わせてtarボールとSRPMを作ります。

    if [ ! -f /mnt/revno ]; then
revno=0
    else
revno=`cat /mnt/revno`
    fi
    revno=$(($revno+1))
    echo $revno > /mnt/revno
    if [ -f /mnt/eucalyptus/eucalyptus.spec ]; then
specfile=eucalyptus/eucalyptus.spec
    elif [ -f /mnt/eucalyptus/eucalyptus.spec.centos ]; then
specfile=eucalyptus/eucalyptus.spec.centos
    else
echo "specfile not found"
return
    fi
    sed -e "/^Release:/s/\$/.$revno/" /mnt/$specfile > /usr/src/redhat/SPECS/eucalyptus.spec
    version=`rpm -q --specfile /usr/src/redhat/SPECS/eucalyptus.spec --qf "%{VERSION}\n" | head -1`
    cd /mnt
    find eucalyptus -name .bzr -prune -o -print | sort | pax -wd | gzip -9v > /usr/src/redhat/SOURCES/eucalyptus-${version}.tgz
    rpmbuild -bs --nodeps /usr/src/redhat/SPECS/eucalyptus.spec

 この後、念のため依存パッケージを調べてyumでインストールします。

    rpm -q -p /usr/src/redhat/SRPMS/eucalyptus-*.src.rpm -R | sed -e 's% *$%%' | xargs -d '\n' yum -y install
    rpmbuild -bb /usr/src/redhat/SPECS/eucalyptus.spec

 最後に、できたRPMファイルとここまでのログをWalrusにアップロードします。アップロードには、ホスト名を修正した「S3 curl」を使います。

s3-curl.pl --id=foo --createBucket=$bucket -- $S3_URL/$bucket
for file in `find /usr/src/redhat/RPMS /usr/src/redhat/SRPMS -name \*.rpm`; do
    s3-curl.pl --id=foo --put=$file -- $S3_URL/$bucket/`basename $file`
done
s3-curl.pl --id=foo --put=/tmp/log -- $S3_URL/$bucket/log

 それでは以上の実行環境を整えてみましょう。いつものようにインスタンスを起動してログインします。以下のような作業は定石として実行しておきます。

  • yumのBaseグループのインストール(yum groupinstall Base)
  • firstbootコマンドによる各種設定
  • アカウント設定、.sshのauthorized_keys編集
  • ホスト名変更

 firstbootコマンドはBaseグループに含まれていますが、一度実行しておかないと、起動の度に実行されることになります。

 Eucalyptusビルド環境用に必要な処理としては、以下があります。

  • Baseグループに加えてDevelopment Toolsグループも合わせてインストール。rpmbuildなどが含まれます。
  • Eucalyptusのソースコードリポジトリに使われているBazaarのコマンドラインツールbzrのインストール。bzrは例によってEPELにありますが、Eucalyptusが依存しているいくつかのパッケージもEPELにありますので、EPELのリリースファイル「epel-release-5-3.noarch.rpm」も入れておくのがよいと思います。
  • Amazon API Toolsのインストール。インスタンス内部からEBSを割り当てるのに使います。
  • Java実行環境のインストール。API ToolsがJavaで書かれているため必要になります。
  • Walrus用に修正したS3 curlのインストール。できたパッケージやログをアップロードするのに使います。
  • API ToolsとS3 curlの設定。具体的には、EucalyptusアカウントのX.509証明書や、「$HOME/.s3curl」をコピーしておきます。
  • 依存パッケージのインストール、またはバンドルされている依存パッケージのyumリポジトリ化。依存パッケージが変わることを考慮すると、後者がよいと思われます。チェックアウトしたソースコードとともに、EBSに置くのがよいのではないでしょうか。
  • axis2の展開。Eucalyptusのspecファイルでは、eucalyptus-src-depsに含まれるaxis2-1.4.tgzが、/opt/packages以下に展開されていることを前提にしています。
  • fstabの編集。一時ディスクsda2が、/usr/src/redhatにmountされるようにします。
このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]