Ansible uri モジュールを使用して PowerVC API で仮想マシンを作成する

#### はじめに

PowerVC の API を用いて、Ansible uri モジュール実行での仮想マシンのデプロイを確認しました。


参考：
・[PowerVC Supported OpenStack Compute (Nova) APIs](https://www.ibm.com/docs/en/powervc/2.0.2?topic=apis-supported-openstack-compute-nova)
・[OpenStack Compute API](https://docs.openstack.org/api-ref/compute/?expanded=create-server-detail)

---
#### 環境

・PowerVC 2.0.1 (RHEL 8.4, ppc64le on S824)
・Ansible 2.13.1, python 3.10.5 (Mac に導入して実行)

---
#### こだわりポイント

・Networkを３つ指定して固定IPアドレスを付けている
・flavorを直指定にし、powervm extra_specs を使用してストレージ接続グループを指定している

---
#### 実行スクリプト

```create_vm.yml
---
- name: Create a PowerVC Virtual Machine
  hosts: localhost
  tasks:
   - name: Get auth token
     uri:
       url: "https://<PowerVC_IP_Address>:5000/v3/auth/tokens"
       method: POST
       headers:
         Accept: application/json
       body: "{{ lookup('template', 'token.json') }}"  #<= token.json は外部ファイル
       body_format: json
       return_content: yes
       status_code: 201
       validate_certs: no
     register: auth_token

   - name: Set Variable OS_TOKEN
     set_fact: OS_TOKEN="{{ auth_token.x_subject_token }}"

   - name: Send Request for Server Deployment
     uri:
       url: 'https://<PowerVC_IP_Address>:8774/v2.1/<tenant ID>/servers'
       method: POST
       headers:
         X-Auth-Token: "{{ OS_TOKEN }}"
         Accept: application/json
       body_format: json
       body: "{{ lookup('template', 'create_vm.json') }}"    #<= create_vm.json は外部ファイル
       return_content: yes
       status_code: 202
       validate_certs: no
       timeout: 300
     register: deploy_vm
```

```token.json
{
    "auth":{
       "scope":{
          "project":{
             "name":"ibm-default",
             "domain":{
                "name":"Default"
             }
          }
       },
       "identity":{
          "methods":[
             "password"
          ],
          "password":{
             "user":{
                "domain":{
                   "name":"Default"
                },
                "name":"<実行ユーザー>",                #<=要編集
                "password":"<ユーザー・パスワード>"      #<=要編集
             }
          }
       }
    }
}
```

```create_vm.json
{  
    "server":{  
       "name":"<VM_name>",  #<=要編集
       "max_count":1,
       "imageRef":"<Image_ID>",   #<=要編集
       "flavor":{                 #<=必要なflavor値に要編集
          "ram":"4096",
          "vcpus":"1",
          "disk":"20",
          "extra_specs":{  
             "powervm:max_proc_units":"1",
             "powervm:shared_weight":"128",
             "powervm:min_mem":"4096",
             "powervm:max_mem":"4096",
             "powervm:uncapped":"true",
             "powervm:proc_units":"1",
             "powervm:dedicated_proc":"false",
             "powervm:max_vcpu":"2",
             "powervm:availability_priority":"127",
             "powervm:min_proc_units":"0.1",
             "powervm:min_vcpu":"1",
             "powervm:storage_connectivity_group":"<ストレージ接続グループID>" #<=要編集
          }
       },
       "config_drive": true,
       "networks":[
         {
            "uuid":"<Network_ID①>",　　　　　#<=要編集
            "fixed_ip":"<IP Address>"　　　　#<=要編集
         },
         {
            "uuid":"<Network_ID②>",　　　　　#<=要編集
            "fixed_ip":"<IP Address>"　　　　#<=要編集
         },
         {
            "uuid":"<Network_ID③>",　　　　　#<=要編集
            "fixed_ip":"<IP Address>"　　　　#<=要編集
         }
       ]
    }
 }
```

---
#### 実行

(ansible.cfg, inventory の定義内容は省略)


```
$ ansible-playbook deployvm.yml

PLAY [Create a PowerVC Virtual Machine] **********************************************************************************************

TASK [Gathering Facts] ***************************************************************************************************************
ok: [localhost]

TASK [Get auth token] ****************************************************************************************************************
ok: [localhost]

TASK [Set Variable OS_TOKEN] *********************************************************************************************************
ok: [localhost]

TASK [Send Request for Server Deployment] ********************************************************************************************
ok: [localhost]

PLAY RECAP ***************************************************************************************************************************
localhost                  : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

```

通りました。[Send Request for Server Deployment] の箇所で数分時間がかかっていました。



![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/eb0882be-75be-58f3-932c-d54f216067f5.png)
作成されています。




---
#### 課題

・この方法での実行でNPIV接続でストレージ側の"ホスト"が作成されていないことを発見...。おそらく使用しているStorage の Firmware レベルが低いことによる問題と思われます....
 => 別環境のPowerVC 2.0.2  で実施すると成功。PowerVC 2.0.1 または Storage FW の問題と思われます。

・boot volume を作成するストレージ・テンプレートをGUI同様に選びたかったのですが、"block_device_mapping_v2" の "volume_type" が unexpected でエラーとなり方法を確認できていません。(PowerVC がもつopenstack のバージョンが対応していないと推測)
　とりあえずは、PowerVC 側で使用したいストレージ・プールを持つテンプレートをデフォルト・テンプレートに変更することで解消しています。デプロイ時にストレージ・テンプレートも選べるようにできればと思います。

・ネットワークは、GUI で primary で指定できるところを指定していないので、primary ネットワークの指定の方法が不明です。(順番が一番目のネットワークで良いのかも?)
・テンプレート部分をもう少し汎用化することが必要と思います。
・VMデプロイ後にVMへのansible実行をできるようにすることで、OS設定にも繋げたいです。


以上です。