PowerVC で仮想マシンをデプロイする際に cloud-init の user_data を使用する方法

#### はじめに

PowerVC でデプロイする際に、cloud-init の user_data がどのように指定できるかを、GUI、OpenStack コマンド、curl コマンド、Ansible の 4通りの仮想マシンデプロイの方法で確認しました。


cloud-init の user data はデプロイ時に cloud-init の動作内で追加の処理を行うことができる仕組みです。
詳細は以下のドキュメントをご参考ください。

https://cloudinit.readthedocs.io/en/latest/explanation/format.html

---
#### 環境

PowerVC 2.1.1 (RHEL 8.6 on Power) 
　　デプロイするVM : AIX 7.3

---

#### user_data に使用するファイルを準備

検証用に次のファイルを user_data で設定します。

```cloud-config.cfg 
#cloud-config

runcmd:
 - touch /tmp/test.log
-  echo "cloud-config test" >> /tmp/test.log
```

=> /tmp/test.log ファイルを作成し"cloud-config test" をファイルに書き込みを実行します。

---

#### 実行ケース

##### 1. PowerVC GUI で VMデプロイする場合

Deploy VM の GUI で Activation Input に設定したい user_data の内容を直接記載することで設定することが可能です。(この方法が一番簡単です)


![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/0cd3dc20-1621-cfa9-3fb2-02be6a1d9079.png)


GUI からデプロイ後の確認 (AIXサーバー)

```
# ssh root@xxx.xx.xxx.xx
Last unsuccessful login: Mon May 29 04:36:20 CDT 2023 on ssh from xxx.xx.xxx.xx
Last login: Tue May  2 06:01:22 CDT 2023 on /dev/vty0 from aix7301
*******************************************************************************
*                                                                             *
*                                                                             *
*  Welcome to AIX Version 7.3!                                                *
*                                                                             *
*                                                                             *
*  Please see the README file in /usr/lpp/bos for information pertinent to    *
*  this release of the AIX Operating System.                                  *
*                                                                             *
*                                                                             *
*******************************************************************************
## oslevel -s
7300-00-01-2148

# ls -l /tmp/test.log
-rw-r--r--    1 root     system           18 May 29 04:20 /tmp/test.log

# cat /tmp/test.log
cloud-config test
#
```
=> cloud-init user_data により、デプロイ後に /tmp/test.log が作成され、"cloud-config test" が入力されていることが確認できました。

---
##### 2. OpenStack コマンドでデプロイする場合

PowerVC サーバーから OpenStack コマンドを実行してサーバー作成を行う際の user_data の指定方法です。
<font color="Silver">(PowerVC では OpenStackコマンド使用は一応、推奨されていません)</font>

参考：

https://docs.openstack.org/ja/user-guide/cli-provide-user-data-to-instances.html

コマンド実行準備

```
# source /opt/ibm/powervc/powervcrc
# export OS_USERNAME=root
# export OS_PASSWORD=<パスワードを記入>
```

openstack server create のオプションに --user-data "<ファイル>" を指定することで user_data を使用した仮想マシン作成が可能です。

```
# openstack server create --image <image ID> --flavor <flavor ID> --user-data cloud-init-test.cfg --network <network name or ID> testvm01
```

=> ログは省略しますが、デプロイ後に cloud-init user_data により /tmp/test.log が作成され、"cloud-config test" が入力されていることを実機で確認しました。



---

##### 3. curl コマンドでデプロイする場合

１.<font color="Red">"cloud_initのuser_data ファイルを base64でエンコードした文字列" </font>を作成


API で実行する場合は base64 へのエンコードが必要の様子です。

https://docs.openstack.org/api-ref/compute/?expanded=create-server-detail#create-server

> user_data (Optional) Configuration information or scripts to use upon launch. Must be Base64 encoded. Restricted to 65535 bytes.


・base64 で 対象のファイルをエンコード

```
# base64 cloud-init-test.cfg
I2Nsb3VkLWNvbmZpZwoKaG9zdG5hbWU6ICIke2hvc3RuYW1lfSIKcnVuY21kOgogLSB0b3VjaCAvdG1wL3Rlc3QubG9nCiAtIGVjaG8gImNsb3VkLWNvbmZpZyB0ZXN0IiA+PiAvdG1wL3Rlc3QubG9nCgo=
```


=>出力結果の <font color="MediumBlue">"I2Nsb3VkLWNvbmZpZwoKaG9zdG5hbWU6ICIke2hvc3RuYW1lfSIKcnVuY21kOgogLSB0b3VjaCAvdG1wL3Rlc3QubG9nCiAtIGVjaG8gImNsb3VkLWNvbmZpZyB0ZXN0IiA+PiAvdG1wL3Rlc3QubG9nCgo="</font> を "body_deploy_vm.json" 内 の　<font color="Red">"cloud_initのuser_data ファイルを base64でエンコードした文字列" </font> に記載します。




２. body_deploy_vm.json　の準備

```body_deploy_vm.json
{
   "server":{
      "name":"<仮想マシン名>",
      "max_count":1,
      "imageRef":"<イメージID>",
      "availability_zone":"Default Group",
      "block_device_mapping_v2":[{
                                  "boot_index": "0",
                                  "uuid": "<ストレージ・テンプレートID>",
                                  "source_type": "image",
                                  "destination_type": "volume"
      }],
      "user_data": "cloud_initのuser_data ファイルを base64でエンコードした文字列",   #<= ここに入力
      "flavor":{
         "ram": "4096",
         "vcpus": "1",
         "disk": "25",
         "extra_specs":{
            "powervm:min_proc_units":"0.1",
            "powervm:proc_units":"0.2",
            "powervm:max_proc_units":"2",
            "powervm:min_mem":"2048",
            "powervm:max_mem":"4096",
            "powervm:shared_weight":"128",
            "powervm:uncapped":"true",
            "powervm:dedicated_proc":"false",
            "powervm:max_vcpu":"2",
            "powervm:availability_priority":"128",
            "powervm:min_vcpu":"1",
            "powervm:processor_compatibility": "POWER10",
            "powervm:storage_connectivity_group":"<ストレージ接続グループIDを指定>"
         }
      },
      "config_drive": true,
      "networks":[
         {
            "uuid": "<ネットワークID>",
            "fixed_ip": "<IPアドレス①>"
         },
         {
            "uuid": "<ネットワークID>",
            "fixed_ip": "<IPアドレス②>"
         }
      ],
   }
}
```

３. curl コマンドを実行するため OpenStack の token を取得して変数 OS_TOKEN に設定

```
# source /opt/ibm/powervc/powervcrc
# export OS_USERNAME=root
# export OS_PASSWORD=<パスワードを記入>
# export OS_TOKEN=`openstack token issue | grep "| id" | awk '{print $4}'`
```

４. curl でサーバー作成コマンドを実行


```
curl -k -X POST -H "X-Auth-Token: $OS_TOKEN" -H "Content-Type: application/json" --data @body_deploy_vm.json "https://<PowerVC_IPアドレス>:8774/v2.1/<tenant_id>/servers"
```

=> ログは省略しますが、デプロイ後にcloud-init user_data により /tmp/test.log が作成され、"cloud-config test" が入力されていることを実機で確認しました。


---

(補足)tenant_id を確認する方法

```
# source /opt/ibm/powervc/powervcrc
# export OS_USERNAME=root
# export OS_PASSWORD=<パスワードを記入>
# openstack catalog list
```

  -> tenant_id を含むサービス・エンドポイントがリストされます。



---

##### 4. ansible でデプロイする場合



body_deploy_vm.json は "curl コマンドでデプロイする場合" と同じファイルが使用可能です。

実行方法は以下参考：

https://qiita.com/c_u/items/95daed5b6171cc79321d


=> ログは省略しますが、デプロイ後にcloud-init user_data により /tmp/test.log が作成され、"cloud-config test"が入力されていることを実機で確認しました。



---

##### (参考) PowerVS の場合

IBM Cloud Power Systems Virtual Server の API でも cloud-init user_data が指定できます。

https://cloud.ibm.com/apidocs/power-cloud#pcloud-pvminstances-post

> userData : Cloud init user defined data

今回は オンプレミス PowerVCでのデプロイのため PowerVS の方は確認していませんが、また機会があれば別途確認します。


---


以上です。