IBM Power Virtual Server (PowerVS)での仮想マシンデプロイ時の cloud-init 拡張構成設定の確認

#### はじめに

以前には存在していませんでしたが、IBM Cloud のPower Virtual Server サービスで仮想マシン・デプロイ時のブート・イメージセクションに ***"拡張構成"*** が追加されていることを確認しました。

<br>

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/2507ea79-9e73-b900-024a-b241bfa2a78b.png)

<br>

右端の三角を操作すると画面が広がります。
この状態では有効化されていないようなので、有効化を実施します。


![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/3b9fa3cc-ba02-4905-8d8b-2b25e0733c30.png)

<br>

ユーザー・データ貼り付け部分が表示されました。
つまり、cloud-init の user_data 部分が GUI から設定が可能です。

![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/eecffcf1-9ade-4e82-dba7-2104501cbf70.png)



IBM Cloud Docsの内容: [ユーザー定義スクリプトの受け渡し](https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-set-full-Linux#cloud-init-fls)

---

#### cloud-init ユーザー・データ設定例 (AIX) 

AIX デプロイ後の次のブート時に、cloud-init が起動しないための設定を例として追加します。
以下のような内容を拡張構成に追加します。

```
#cloud-config
runcmd:
  - rm /etc/rc.d/rc2.d/S01cloud-init-local
  - rm /etc/rc.d/rc2.d/S02cloud-init
  - rm /etc/rc.d/rc2.d/S03cloud-config
  - rm /etc/rc.d/rc2.d/S04cloud-final
  - chdev -l sys0 -a clouddev=0
```

こちらの処理についてですが、cloud-init が稼働していると、OS再起動などで意図せず IPアドレス設定が飛ぶことがあるので、運用時には停止しておくことが多いため、デプロイ後の停止処理を入れることがよくあります。

<br>


![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/2c59c8bf-b9bc-1dcf-4b20-b2ea5dce646c.png)


データの検証を押すと、記載した内容を検証してくれるようです。

"データの検証"を押します。

![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/de7e42cb-27d0-e958-4579-5d736950a2a3.png)

緑マークのチェックが返ってきており、内容に問題ないことが確認できました。


---

#### OS起動後の確認方法 (AIX) 

##### ユーザー・データの設定確認

上記で指定した処理で、仮想マシン(AIX) で /etc/rc.d/rc2.d のリンクが切れているか、clouddev=0 が設定されているかどうかを確認します。

```
# ls -l /etc/rc.d/rc2.d/
total 32
-r-xr-xr-x    1 root     system          325 Oct 25 2023  Ksshd
-r-x------    1 root     system         2534 Oct 25 2023  Kwpars
-r-xr-x---    1 bin      bin             726 Aug 02 2023  S00ct_boot
-r-xr-xr-x    1 root     system          326 Oct 25 2023  Ssshd
#
# lsattr -El sys0 -a clouddev
clouddev 0 Recreate ODM devices on next boot True
#
```

想定通りの結果です。S01cloud-init-local、S02cloud-init、S03cloud-config、S04cloud-finalのリンクファイルは存在しておらず、clouddev は 0です。
cloud-init ユーザー・データ処理が行われていることが確認できました。

<br> 


cloud-init のログは /var/log 下にあります。

```
# ls -l /var/log | grep cloud
-rw-r-----    1 root     adm           31814 Jul 31 04:08 cloud-init-output.log
-rw-r--r--    1 root     system        94428 Jul 31 04:08 cloud-init.log
```


/var/log/cloud-init.log の最終行を確認すると、最後まで実行されているかが確認できます。
以下では、modules-final で SUCCESS で完了していることが確認できています。

```
# tail -n 10 /var/log/cloud-init.log
2024-07-31 09:08:18,162 - util.py[DEBUG]: Writing to /opt/freeware/var/lib/cloud/instances/43d944e4-5c3b-499c-8fa1-56ccdc480a3c/sem/config_power_state_change - wb: [644] 27 bytes
2024-07-31 09:08:18,182 - helpers.py[DEBUG]: Running config-power-state-change using lock (<FileLock using file '/opt/freeware/var/lib/cloud/instances/43d944e4-5c3b-499c-8fa1-56ccdc480a3c/sem/config_power_state_change'>)
2024-07-31 09:08:18,183 - cc_power_state_change.py[DEBUG]: no power_state provided. doing nothing
2024-07-31 09:08:18,183 - handlers.py[DEBUG]: finish: modules-final/config-power-state-change: SUCCESS: config-power-state-change ran successfully
2024-07-31 09:08:18,183 - main.py[DEBUG]: Ran 11 modules with 0 failures
2024-07-31 09:08:18,225 - atomic_helper.py[DEBUG]: Atomically writing to file /var/lib/cloud/data/status.json (via temporary file /var/lib/cloud/data/tmpek01_h31) - w: [644] 593 bytes/chars
2024-07-31 09:08:18,287 - atomic_helper.py[DEBUG]: Atomically writing to file /var/lib/cloud/data/result.json (via temporary file /var/lib/cloud/data/tmpgma6dgcb) - w: [644] 96 bytes/chars
2024-07-31 09:08:18,348 - util.py[DEBUG]: Creating symbolic link from '/run/cloud-init/result.json' => '../../var/lib/cloud/data/result.json'
2024-07-31 09:08:18,417 - util.py[DEBUG]: cloud-init mode 'modules' took 2.728 seconds (2.73)
2024-07-31 09:08:18,418 - handlers.py[DEBUG]: finish: modules-final: SUCCESS: running modules for final
#
```

/var/lib/cloud/data 下にも cloud-init 起動ログの出力があります。


```
# ls -l /var/lib/cloud/data
total 16
-rw-r--r--    1 root     system           96 Jul 31 04:08 result.json
-rw-r--r--    1 root     system          593 Jul 31 04:08 status.json
```

cloud-init は各モジュールで段階的にスクリプトが実行される挙動をとっています。
"/var/lib/cloud/data/status.json" を見ると、cloud-init の各モジュールの開始、終了時間を(UNIX TIME ですが、)見ることができます。

<br>

finished に時間が入っていると、そのcloud-init のスクリプト部分は終了していることが確認できます。


```
# cat /var/lib/cloud/data/status.json
{
 "v1": {
  "datasource": "DataSourceConfigDrive [net,ver=2][source=cd0]",
  "init": {
   "errors": [],
   "finished": 1722416891.9121,
   "start": 1722416865.6246789
  },
  "init-local": {
   "errors": [],
   "finished": 1722416864.998497,
   "start": 1722416839.718933
  },
  "modules-config": {
   "errors": [],
   "finished": 1722416894.914691,
   "start": 1722416892.72805
  },
  "modules-final": {
   "errors": [],
   "finished": 1722416898.1835709,
   "start": 1722416895.747396
  },
  "modules-init": {
   "errors": [],
   "finished": null,
   "start": null
  },
  "stage": null
 }
}
#
```

datasource, init-local, modules-config, modules-final の4つのモジュール稼働がありましたが、いずれも finished が記録されています。

<br>



ちなみに /var/lib/cloud/data/result.json は datasource 部分のみが書かれた内容でした。

```
# cat /var/lib/cloud/data/result.json
{
 "v1": {
  "datasource": "DataSourceConfigDrive [net,ver=2][source=cd0]",
  "errors": []
 }
}
#
```


---

#### cloud-init ユーザー・データ設定例 (RHEL) 

以下は、RHEL で同様にデプロイ時の cloud-init ユーザー・データを使用して次回ブート時に cloud-init が起動しないようにする書き方です。

```
#cloud-config
runcmd:
  - touch /etc/cloud/cloud-init.disabled
  - systemctl disable cloud-init-local.service
  - systemctl disable cloud-init.service
  - systemctl disable cloud-config.service
  - systemctl disable cloud-final.service
```

RHEL の場合でもログの場所や見方は、cloud-init のバージョンに依存するところはあると思いますが、おおよそ同じです。


#### ご参考



・cloud-init のマニュアル参考：
https://cloudinit.readthedocs.io/en/latest/reference/examples.html#

<br>


PowerVCでは以下で確認していました。

https://qiita.com/c_u/items/1eb2553dbe81281d88db


PowerVC で実装されている機能で PowerVS への実装がだんだん増えています。




以上です。