cloud-initはサーバの初期設定を自動化する仕組みです。
cloud-initは多くのクラウドサービスで利用可能で、さくらのクラウドでも利用できるようになりました。
きっかけ
さくらのクラウドでWindows Serverにミドルウェアをプリインストールしてディスクからアーカイブを作成し、サーバを複製するような使い方をしようとしました。
しかし、ネットワーク情報の書き換え(IPアドレス等)とAdministratorのパスワード変更などを手動でする必要がありました。
そこでcloud-initが利用できないか試してみようと思い、検証してみました。
cloud-initが利用できるアーカイブイメージを作成する
提供されているWindows Serverのパブリックアーカイブはcloud-initに対応していないので、対応したアーカイブイメージを作成します。
対応したイメージを作成するために一旦サーバを作成します。
1. Windows Serverプランのサーバを作成する
さくらのクラウドにログインしコントロールパネルからサーバとディスクを作成します。
選択できるディスク容量はWindowsの場合100GBからになります。
サーバが作成されるまでしばらく待ちます。
2. 初期設定を行う
さくらのクラウドのコントロールパネルから作成したサーバを開き、コンソールからWindowsの初期設定を行います。
パスワードの設定まで完了すると、リモートディスクトップ接続ができるようになります。
3. 作成したサーバにリモートディスクトップ接続を行う
リモートディスクトップクライアントから接続を行います。
筆者はMacを使っているので、 Microsoft Remote Desktop for Mac をよく利用します。
さくらのクラウドのコントロールパネルからサーバのIPアドレスを確認し、
ユーザは、Administrator パスワードは初期設定で指定したパスワードを入力し接続します。
4. cloudinit-baseをWindows Serverにインストールする
Windows Serverでcloud-initを有効にするために、cloudinit-baseというソフトウェアをインストールします。
こちらからダウンロードできます。
Windows Server上でダウンロードするためにはセキュリティの設定を一時的に以下の手順で変更する必要があります。
- スタートメニューからサーバマネージャーを起動
- 左側メニューの
ローカル サーバー
を選択 - 右側に表示されている項目の中から、
IE セキュリティ強化の構成
を選択 - ダイアログが表示され、
Administrator グループ
とUsers グループ
のオフ
を選択しOKをクリック
変更後、Internat Explorerを開き https://cloudbase.it/cloudbase-init/ にアクセスします。
インストーラーは複数存在しますが、 Stable Cloudbase-Init x64
を選択します。
Nextをクリック
チェックし、Nextをクリック
Nextをクリック
Serial port for loggingでCOM1を選択
Run Cloudbase-Init service as LocalSystemをチェック
Nextをクリック
Installをクリック
待ちます
このままFinishをクリック
5. cloudbase-initの設定を行う
ファイルの作成と設定ファイルの変更を行います。
手動での手順も説明していますが、PowerShellでこれらの作業を自動で行えるようにしました。
以下からps1ファイルをダウンロードしていただき、実行してください。
https://raw.githubusercontent.com/tar-xzvff/sacloud-cloudbase-init/main/cloudbase-init.ps1
手動の手順
以下のディレクトリにファイルを作成します。
C:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\Lib\site-packages\cloudbaseinit\metadata\services\sakuracloudservice.py
リンク先の内容をコピーしてファイルを作成します。
このファイルはさくらのクラウドが提供するmeta-dataを元にネットワーク設定情報を生成するPythonのコードです。
https://raw.githubusercontent.com/tar-xzvff/sacloud-cloudbase-init/main/sakuracloudservice.py
以下の設定ファイルの内容を変更します。
C:\Program Files\Cloudbase Solutions\Cloudbase-Init\conf\cloudbase-init.conf
リンク先の内容をコピーして変更します。
https://raw.githubusercontent.com/tar-xzvff/sacloud-cloudbase-init/main/cloudbase-init.conf
以上でcloud-initを使う準備が整いました。
6. サーバをシャットダウンする
シャットダウンします。
7. ディスクからアーカイブを作成する
cloudbase-initをインストールしたサーバのディスクからアーカイブを作成します。
手順は以下のリンクになります。
作成したアーカイブをサーバ作成時に指定するとでcloud-initに対応したWindowsServerのサーバを作成することが可能です。
cloud-initを動かしてみる
作成したアーカイブから新たにサーバを作成しても良いですが、ここでははじめに作成したサーバでcloud-initを動かしてみます。
さくらのクラウドのAPIでサーバの起動リクエスト時に UserBootVariables.CloudInit.UserData
を指定することでサーバに対してmeta-dataとuser-dataが渡されてそれに従ってcloud-initが動作します。
https://developer.sakura.ad.jp/cloud/api/1.1/server/#put_server_serverid_power
パスワードを変更する場合(P@assWordにする)
curl -i -X PUT \
--user 'Access token':'Access token secret' \
-H "Content-Type:application/json" \
-d \
'{
"UserBootVariables": {
"CloudInit": {
"UserData": "#ps1_sysnative \r\n $HostName = hostname \r\n [ADSI]$UpdateUser = \"WinNT://$HostName/Administrator,User\" \r\n $UpdateUser.SetPassword( \"P@assWord\" ) \r\n $UpdateUser.SetInfo()"
}
}
}' \
'https://secure.sakura.ad.jp/cloud/zone/<ゾーン>/api/cloud/1.1/server/<サーバのリソースID>/power'
ホスト名を変更する場合(cloudbase-init-test.example.comに変更する)
curl -i -X PUT \
--user 'Access token':'Access token secret' \
-H "Content-Type:application/json" \
-d \
'{
"UserBootVariables": {
"CloudInit": {
"UserData": "#cloud-config \r\n set_hostname: cloudbase-init-test.example.com"
}
}
}' \
'https://secure.sakura.ad.jp/cloud/zone/<ゾーン>/api/cloud/1.1/server/<サーバのリソースID>/power'
起動するとフル コンピューター名がset_hostnameで指定した値になっています。
注意点
ホスト名を変更をした後にログインしようとしたところパスワードが異なるようでログインできませんでした。
そのため、パスワードを変更 -> シャットダウン -> ホスト名を変更 という流れで動作確認をしました。
1回cloud-initからパスワード設定が必要なのかなと思いました。
この辺りはcloudbase-initのドキュメントなどを読みながら動きを今後理解したいと思います。
参考させていただいたWebサイト等
https://intl.cloud.tencent.com/jp/document/product/213/32364
https://manual.iij.jp/p2/pub/f-1-3.html