さくらのクラウドのWindows Serverプランでcloud-initを使ってIP設定とログインパスワードを変更する

cloud-initはサーバの初期設定を自動化する仕組みです。

cloud-initは多くのクラウドサービスで利用可能で、さくらのクラウドでも利用できるようになりました。

https://cloud-news.sakura.ad.jp/2021/09/30/cloud-init-controlpanel/

# きっかけ
さくらのクラウドでWindows Serverにミドルウェアをプリインストールしてディスクからアーカイブを作成し、サーバを複製するような使い方をしようとしました。
しかし、ネットワーク情報の書き換え(IPアドレス等)とAdministratorのパスワード変更などを手動でする必要がありました。
そこでcloud-initが利用できないか試してみようと思い、検証してみました。

# cloud-initが利用できるアーカイブイメージを作成する
提供されているWindows Serverのパブリックアーカイブはcloud-initに対応していないので、対応したアーカイブイメージを作成します。
対応したイメージを作成するために一旦サーバを作成します。
## 1. Windows Serverプランのサーバを作成する

さくらのクラウドにログインしコントロールパネルからサーバとディスクを作成します。
選択できるディスク容量はWindowsの場合100GBからになります。

サーバが作成されるまでしばらく待ちます。

https://manual.sakura.ad.jp/cloud/server/create-delete.html

https://manual.sakura.ad.jp/cloud/server/os-packages/windows-server-plan/windows-server-setup.html

## 2. 初期設定を行う
さくらのクラウドのコントロールパネルから作成したサーバを開き、コンソールからWindowsの初期設定を行います。
パスワードの設定まで完了すると、リモートディスクトップ接続ができるようになります。

## 3. 作成したサーバにリモートディスクトップ接続を行う

リモートディスクトップクライアントから接続を行います。
筆者はMacを使っているので、 Microsoft Remote Desktop for Mac をよく利用します。

さくらのクラウドのコントロールパネルからサーバのIPアドレスを確認し、
ユーザは、Administrator パスワードは初期設定で指定したパスワードを入力し接続します。

## 4. cloudinit-baseをWindows Serverにインストールする

Windows Serverでcloud-initを有効にするために、cloudinit-baseというソフトウェアをインストールします。
こちらからダウンロードできます。

https://cloudbase.it/cloudbase-init/

Windows Server上でダウンロードするためにはセキュリティの設定を一時的に以下の手順で変更する必要があります。
1. スタートメニューからサーバマネージャーを起動
2. 左側メニューの `ローカル サーバー` を選択
3. 右側に表示されている項目の中から、 `IE セキュリティ強化の構成` を選択
4. ダイアログが表示され、 `Administrator グループ` と `Users グループ` の `オフ` を選択しOKをクリック

変更後、Internat Explorerを開き https://cloudbase.it/cloudbase-init/ にアクセスします。

インストーラーは複数存在しますが、  `Stable Cloudbase-Init x64` を選択します。

実行をクリックします。
![スクリーンショット 2022-05-25 11.40.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58803/56461f8e-a84a-49fc-e807-8c3851e7ae87.png)

Nextをクリック
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58803/58fe6fff-edce-1014-1547-5e1ccc569874.png)
チェックし、Nextをクリック
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58803/c8cc3422-3d0e-3069-0970-0bcce75f592e.png)
Nextをクリック
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58803/8bc80d20-2e41-e6e4-6e60-17bef550d046.png)
Serial port for loggingでCOM1を選択
Run Cloudbase-Init service as LocalSystemをチェック
Nextをクリック
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58803/9e7220ca-6590-936b-8b10-a2ec6cc2739e.png)
Installをクリック
![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58803/69215b2e-5f69-2b56-9acc-ab68a06424bf.png)
待ちます
![7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58803/543b4592-3ae2-1fb9-6b42-1e30623880de.png)
このままFinishをクリック
![8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58803/29dcdad7-c239-638b-cf1a-4f5edd4b7cd4.png)

## 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をインストールしたサーバのディスクからアーカイブを作成します。
手順は以下のリンクになります。

https://manual.sakura.ad.jp/cloud/storage/archive.html#id8

作成したアーカイブをサーバ作成時に指定するとで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にする)
```bash
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に変更する)
```bash
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で指定した値になっています。
![9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58803/6eaeebef-9c5e-076c-dfa7-bd012d41c6fc.png)

## 注意点
ホスト名を変更をした後にログインしようとしたところパスワードが異なるようでログインできませんでした。
そのため、パスワードを変更 -> シャットダウン -> ホスト名を変更 という流れで動作確認をしました。
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