【SoftLayer】Provisioning Script で注文後の定型作業を楽にするには?

【SoftLayer】Provisioning Script で注文後の定型作業を楽にするには?

【SoftLayer】Provisioning Script で注文後の定型作業を楽にするには? はてなブックマーク - 【SoftLayer】Provisioning Script で注文後の定型作業を楽にするには?


本稿はSoftLayer Advent Calender 2014の12月9日分の担当記事です。

■面倒な作業から解放されたい!

サーバを注文したあと、必ず実行する定型作業はありませんか? 例えば、ログイン後にタイムゾーンの設定や、作業用のアカウントを作成したり、iptables でセキュリティを高めたりと、いろいろ面倒な手作業が発生します。これがサーバ1台だけならまだしも、複数台あると手間になり面倒。この問題を解決するのが、プロビジョニング・スクリプト(Provisioning Script)とメタデータ(metadata)です。

以降では、プロビジョニング・スクリプトやメタデータの説明と、Gist上に置いたスクリプトを使ってタイムゾーンを自動的に変更する具体的な方法、そして活用のためのアイディアをご紹介します。

■プロビジョニング・スクリプトとは?

サーバ注文直後の初回起動時に、1度だけ実行されるスクリプトです。サーバ注文時に次のような画面を見たことはありませんか? サーバのスペックを確定した次に表示される【 Provisioning Scripts 】が、プロビジョニング・スクリプトを指定する所です。

サーバの注文時にプロビジョニング・スクリプトのURLを指定すると、OS の起動直後、指定したスクリプトを対象サーバ上にダウンロードします。このとき、指定したURLが【 http:// 】であれば /root ディレクトリにファイルをダウンロードするだけですが、【 https:// 】であればダウンロードに加え、自動実行します。この機能を使って、面倒な定型作業を自動化させることができます。

ここで使うスクリプトは、どのウェブサーバに置いても構いません。インターネット側に置くことも出来ますし、SoftLayerのプライベートIPアドレスを指定することも出来ます。

ここでは、短いコードを無料で共有できる Gist サービスを利用します。Gist を使えば、サーバを用意する必要がありませんし、https の通信が利用できるので、実行可能なスクリプトを用意出来るからです。

■Gist上にコードを作成する

今回はサーバの中のタイムゾーンを自動的に日本標準時(JST)にするスクリプトを作成します。スクリプトの中身は次のようにゾーン情報のファイルを書き換えます。

#!/bin/sh
mv /etc/localtime /etc/localtime.orig
ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

Gistのサイトにアクセスしたあとは、画面右上の【 + 】ボタンをクリックします。

次の画面では、スクリプト名やコードなどを入力して、【 Create public Gist 】ボタンを押します。

作成が完了すると【 Raw 】ボタンをクリックします。

そしてコードだけが画面に表示されますので、この URL を控えます。この URL はコードの中身だけを返すものであり、プロビジョニング・スクリプトを指定するときに使います。

Gist の注意点としては、スクリプト公開時に “Create secret Gist”として保存した場合、その URL はインターネット上に公開されませんが、その URL を知っていれば、だれでも利用可能な点をご注意願います。どうしても公開したくない場合は、SoftLayerのプライベート・サブネット側にウェブサーバを用意し、サーバが新規追加されるVLANからしか接続できないようにする対策が必要です。

今回は Gist をご紹介しましたが、チームやプロジェクトでコードを共有する場合は、GitHub を使った管理のほうが効率的な場合もあります。運用方法にあわせて、使い分けるのが良いと思います。

■プロビジョニング・スクリプトを登録するには

サーバの注文s時、都度 URL を指定することもできますが、面倒なのでメニューに登録する方法を見ていきます。SoftLayer のカスタマー・ポータル上でスクリプトのURLを登録しておくと、サーバ追加時にプルダウン・メニューから選択できます。URL を登録するにはカスタマー・ポータルのメニューで【 Devices 】->【 Manage 】->【 Provisioning 】をクリックします。

表示された画面の右上にある【 Add Provisioning Script 】をクリックして、登録画面を開きます。

次の画面の【 Name 】にプロビジョニング・スクリプトとして登録する名前を入力し、【 URL 】に先ほど Gist で作成したスクリプトの URL を入れ、【 Add 】ボタンを押します。

登録に成功すると、成功したという表示と、今回追加したスクリプトが一覧に表示されていることが分かります。これで準備は終わりました。

■サーバ注文時の指定方法

それでは、実際にサーバ注文する時の手順をみていきます。サーバの注文時、はじめの入力フォームはスペック等を選びます。その次の画面で【 Provisioning Scripts 】の項目を探し、プルダウンメニューから今回作成したスクリプトを入力することで、自動的に登録済みの URL が指定されます。これだけで設定は完了です。なお、直下に “User Metadata” というメタデータを指定する箇所があります。いまま、ここで指定する場所があることだけを覚えておきます。

あとはサーバの注文をすすめ、サーバが起動したらログインします。【 date 】コマンドを実行すると、なにもしなくてもタイムゾーンが指定されていることが分かります。

[root@iam ~]# date
2014年 12月  9日 火曜日 12:12:26 JST

実際の応用シーンとしては、iptables を使ってセキュリティを高める方法が、一番実用的かつお勧めの使い方です。このあたりは、ソフトレイヤー探検隊の「SoftLayer Tips プロビジョニング・スクリプトとSSH鍵でのログイン」をご覧になることをお勧めします。

また、ソフトレイヤー活用技術資料の「1.2.4. インターネットからのログインを禁止するには?」という記事も参考になります。この記事では、メタデータとして公開するポート番号を明示し、その他のポートを自動的に公開しないように iptables の設定を自動的に行っています。

■メタデータと応用

さて、メタデータ(metadata)とは何でしょうか。これはサーバ起動時後、サーバ内で参照可能となるデータです。使い方は、プロビジョニング・スクリプトの中で、このメタデータを参照します。たとえば、サーバ固有の情報を取得してアプリケーションやパッケージを設定したり、iptables を動的に設定することができます。

ここで重要なのは、どのようにデータを取得するかです。先ほどの注文時、metadataに「test server」と入力しておけば、その情報はサーバ内で、REST API 経由で取得することができます。

[root@iam ~]# curl https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/UserMetadata.txt
test server

フォームから入力した情報のほかに、データセンタ名や、ホスト名、パブリック・プライベート双方の IP アドレスや VLAN 番号なども取得できます。例えば、データセンターとパブリック側の IP アドレスを取得するには、次のようにします。

[root@iam ~]# curl https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/Datacenter
"sjc01"
[root@iam ~]# curl https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/PrimaryIpAddress
"158.85.xxx.xxx"

この方法を使えば、セットアップ後の様々な作業を楽にすることができます。たとえば、ChefやPuppet等の構成管理ツールを使って自動的にミドルウェアの構築を実行するトリガにできます。あるいは、ホスト名や IP アドレスの情報が分かれば、監視ツールの登録を自動化するような応用もできると思います。他にも色々なデータが取得できますので、詳しくは、SoftLayer のリファレンスが参考になると思います。

ResourceSoftLayer_Resource_Metadata | SoftLayer Development Network
http://sldn.softlayer.com/reference/services/SoftLayer_Resource_Metadata

■参考資料