ニフクラ ブログ

ニフクラやクラウドの技術について、エンジニアが語るブログです。

サーバータイプの追加、起動時スクリプト実行、グローバルNICの取り外し機能をリリースしました。

2011年10月26日、ニフティクラウドのアップデートを行い、以下の機能が利用できるようになりました。

6vCPU、ハイメモリサーバータイプの追加

サーバータイプに以下の5タイプが追加になりました。

6vCPU モデル
・extra-large16 6vCPU/16GBメモリ
・extra-large24 6vCPU/24GBメモリ
・extra-large32 6vCPU/32GBメモリ
ハイメモリモデル
・small8 1vCPU/8GBメモリ
・medium16 2vCPU/16GBメモリ
CPUリソース、メモリリソースを大量に使用するアプリケーション等に最適なモデルです。
サーバー起動時スクリプト

コントロールパネル・APIから OS 起動時に実行できるスクリプトを流し込むことができます。
サーバー作成と同時にアプリケーションのインストールや設定を行うことができるようになり、サーバー作成後の負担を大幅に軽減することができます。

グローバルNICの取り外し

サーバーからグローバルNICの取り外しができるようになりました。
これまでも ifconfig で落としてグローバルからの疎通を遮断することは可能でしたが、今回のアップデートでNICごと取り外しができるようになりました。
グローバルとの通信を必要としないサーバーで、よりセキュアな状態で運用したい場合に、効果的にご利用いただけるオプション機能です。

今回は、この中からサーバー起動時スクリプトについて、詳しくご紹介したいと思います。
起動時スクリプトについての詳しい使い方は以下から。

起動時スクリプトを使ってみる

起動時スクリプトとは?

コントロールパネルやAPIから、スクリプトを送り込み、OS起動時に実行することができる機能です。
Linux の rc スクリプトに近いものになりますが、大きな違いはコントロールパネル・APIといった、サーバーの外部からスクリプトを送り込める点です。
アプリケーションのインストールから設定までをスクリプトで組んでおき、サーバー作成と同時にスクリプトを送り込むことで、セッティングがすべて完了した状態のサーバーがあがってきます。
サーバーにログインして、コマンドを打ち込む必要はありませんので、サーバー作成後の負担を大幅に軽減することができる機能になります。

さっそく使ってみる

では、さっそく使ってみたいと思います。
今回はコントロールパネルから、サーバー作成時にスクリプトを送り込んで実行させてみたいと思います。
サーバー一覧から「サーバー作成」ボタンをクリックします。
Create_server

イメージ選択~アカウント設定

アカウント設定までは、通常のサーバー作成と同じ流れです。
今回流し込むスクリプトCentOS 5.6 64bit Plain で検証していますので、イメージは CentOS 5.6 64bit Plain を選択してください。(試していませんが他のイメージでも動くと思います。) Server_image

スクリプト設定

アカウント設定の次が今回のキモ、スクリプト設定です。
Server_script
「する」にチェックをつけましょう。
スクリプト入力エリアが出現しますので、ひとまず、以下の内容を入力エリアにコピー&ペーストして次に進みます。中身の詳細はのちほど・・・。

#!/bin/sh
/usr/sbin/usermod -p 12CsGd8FRcMSM root
/usr/sbin/useradd -g 100 -p 12CsGd8FRcMSM -d /home/nifty -m nifty
/bin/mkdir -p -m 700 /home/nifty/.ssh
/bin/cp /root/.ssh/authorized_keys /home/nifty/.ssh/.
/bin/chown -R nifty:users /home/nifty/.ssh
/bin/sed -ie 's/^PermitRootLogin .*/PermitRootLogin no/' /etc/ssh/sshd_config
HN=$(/usr/sbin/vmtoolsd --cmd 'info-get guestinfo.hostname')
/bin/sed -ie 's/HOSTNAME=.*/HOSTNAME='${HN}'/' /etc/sysconfig/network
/bin/cp -p /etc/rc.d/rc.local{,.org}
/bin/cat <<EOF1 >> /etc/rc.d/rc.local
/bin/sed -ie 's/exclude=/#exclude=/' /etc/yum.conf
/usr/bin/yum update -y
/bin/sed -ie 's/#exclude=/exclude=/' /etc/yum.conf
/bin/cat <<EOF2 >> /etc/rc.d/rc.local.new
#!/bin/sh
/usr/sbin/vmware-tools-upgrader -p "-d"
/bin/mv /etc/rc.d/rc.local.org /etc/rc.d/rc.local && /sbin/shutdown -r now
EOF2
/bin/chmod 755 /etc/rc.d/rc.local.new
/bin/mv /etc/rc.d/rc.local.new /etc/rc.d/rc.local && /sbin/shutdown -r now
EOF1

※注意※
2 行目の usermod と、3 行目の useradd の -p オプションはパスワード(crypt(3)で暗号化したもの)です。
以下のコマンド等で crypt(3) で暗号化したパスワードを出力して、適宜書き換えてご利用ください。

perl -e 'print crypt "password", "salt"'
サーバー作成

ファイアウォール設定、確認まで進んだら「作成する」ボタンをクリックします。
Server_confirm
しばらくすると、サーバー一覧のコンソールボタンがアクティブになると思いますので、クリックしてコンソールを眺めてみてください。
Console_button
yum update →再起動→vmware-tools update→再起動の流れが確認できるかと思います。

スクリプトの中身とできあがったサーバーの確認

今回流したスクリプトは以下の処理をおこなっています。

root アカウントのパスワード設定
/usr/sbin/usermod -p 12CsGd8FRcMSM root

root アカウントのパスワードはデフォルトでは設定されていないので usermod で更新しておきます。
こうすることでサーバー作成後すぐにコンソールから root アカウントで入ることができます。
コンソールから設定したパスワードで root ログインできることを確認してみてください。

一般アカウント(nifty)の作成とSSH秘密鍵のコピー
/usr/sbin/useradd -g 100 -p 12CsGd8FRcMSM -d /home/nifty -m nifty
/bin/mkdir -p -m 700 /home/nifty/.ssh
/bin/cp /root/.ssh/authorized_keys /home/nifty/.ssh/.
/bin/chown -R nifty:users /home/nifty/.ssh

一般アカウント(ここでは nifty としています)を作成して、root アカウントにある SSH 秘密鍵をコピーします。
こうすることでコントロールパネルで作成、設定した鍵を使い一般アカウントで即 SSH ログインができます。 一般アカウントで SSH ログインができることを確認してみてください。

root アカウントでの SSH 禁止設定
/bin/sed -ie 's/^PermitRootLogin .*/PermitRootLogin no/' /etc/ssh/sshd_config

一般アカウントでの SSH ログイン、root パスワードの設定ができたので、root アカウントでの SSH ログインは不可にしておきます。
root での SSH ログインができないことを確認してみてください。

ホスト名の設定
HN=$(/usr/sbin/vmtoolsd --cmd 'info-get guestinfo.hostname')
/bin/sed -ie 's/HOSTNAME=.*/HOSTNAME='${HN}'/' /etc/sysconfig/network

コントロールパネルで設定したサーバー名は guestinfo.hostname で引き渡されてますのでこれをホスト名に設定します。
hostname コマンドでホスト名が設定されていることを確認してみてください。

カーネルのアップデートも含めた yum update
/bin/cat <<EOF1 >> /etc/rc.d/rc.local
/bin/sed -ie 's/exclude=/#exclude=/' /etc/yum.conf
/usr/bin/yum update -y
/bin/sed -ie 's/#exclude=/exclude=/' /etc/yum.conf

EOF1

yum update ですが、起動時スクリプトはネットワークがあがる前に実行されるため、そのまま流し込んでも update されずに終わってしまいます。
ここではネットワーク起動後に実行されるように、rc.local にスクリプトを流し込んでいます。

vmware-tools のアップデート
/bin/cat <<EOF2 >> /etc/rc.d/rc.local.new
#!/bin/sh
/usr/sbin/vmware-tools-upgrader -p "-d"
/bin/mv /etc/rc.d/rc.local.org /etc/rc.d/rc.local && /sbin/shutdown -r now
EOF2
/bin/chmod 755 /etc/rc.d/rc.local.new
/bin/mv /etc/rc.d/rc.local.new /etc/rc.d/rc.local && /sbin/shutdown -r now

カーネルアップデート後は、vmware-tools をアップデートする必要があります。
カーネルアップデート→再起動→tools アップデート→再起動、という手順を踏む必要があるので、ここでは一旦 rc.local.new というテンポラリに tools アップデートのスクリプトを流し込んでおき、カーネルアップデート完了後に rc.local への差し替えと再起動をしています。

カーネルアップデート、vmware-tools アップデートは、ニフティクラウド探検隊 お手軽ワンライナーでカーネルアップデートしてみた。【取扱注意!】に詳しくまとめられています。確認手順もここに記載されていますので、確認してみてください。

起動時スクリプトを利用する際の注意点
起動タイミング

起動タイミングは以下の通り、S05niftycloud_init で実行されます。
 /etc/rc3.d/S03vmware-tools
 /etc/rc3.d/S04niftycloud_update
 /etc/rc3.d/S05niftycloud_init
ネットワークが起動してくる前なので、yum 等ネットワークを利用するものは rc.local に埋め込んで迂回実行させるなど工夫が必要です。

作成済みサーバーへの流し込み

新規作成だけでなく、作成済みのサーバーでも起動時、再起動時にスクリプトを流し込むことができます。
ただし、10/26 以前に作成したサーバーで利用する場合には OS 初期化スクリプトをインストールする必要があります。
OS初期化スクリプトのご利用設定の手順にそってインストールしておきましょう。
10/26 以降、新規作成するサーバーはセッティング済みなのでそのまま利用できます。

データとして利用したい場合

流し込んだスクリプトは /.niftycloud_user_data に保存されます。
スクリプトとしてでは無く、データとして OS 内部のアプリ等から利用したい場合は、上記のファイルで受け渡しができます。

スクリプトのサイズ

スクリプトのサイズは base64 エンコード後で 8KB になります。
サイズの大きいスクリプトを利用したい場合は、スクリプト本体を別途適当な Web サーバーに配置しておき、起動スクリプトで本体を curl で取得して sh に渡すという方法をおすすめします。

 

まとめ


以上、起動スクリプトの簡単なご紹介でしたがいかがでしたでしょうか。

今回のサンプルは OS まわりの設定と yum update をするといった簡単なものでしたが、例えば、

15分でRails3環境を作ってみよう

15分でCakePHP環境を作ってみよう

上の記事にある設定スクリプトを起動スクリプトに流し込むことで、RailsCakePHP 環境構築済みのサーバーを立てたり、Chef、Puppet といったシステム管理のクライアントを立ててサーバー作成と同時に管理下に置いたり、などなど、使い方や他のツールとの組み合わせによっては単純な作業負荷軽減を超えて完全自動化までできる機能となっていますので、ぜひ有効に活用いただければと思います。