Ansible uri モジュールを使用してPowerVC API で snapshot を取得する

#### はじめに


PowerVC で Ansible の uri モジュールを用いて API での PowerVC VM snapshot 実行を確認しました。

参考：
・[Virtual machine snapshot and restore API](https://www.ibm.com/docs/en/powervc/2.0.2?topic=apis-virtual-machine-snapshot-restore-api)
・[仮想マシンのスナップショットまたはリストア](https://www.ibm.com/docs/ja/powervc/2.0.2?topic=machines-virtual-machine-snapshot-restore)
・[Ansible uri module](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/uri_module.html)


---
#### 環境

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

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


```snapshot.yml
---
- name: Create a PowerVC Virtual Machine Snapshot
  hosts: localhost
  vars:
    powervc_ip: <PowerVC IP address>      #<= 要編集
    tenant_id: <PowerVC Tenant ID>　　　   #<= 要編集
    target_vm_id: <取得対象のVM ID>        #<= 要編集
  tasks:
   - name: Get auth token
     uri:
       url: "https://{{ powervc_ip }}:5000/v3/auth/tokens"
       method: POST
       headers:
         Accept: application/json
       body: "{{ lookup('template', '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: Create Snapshot 
     uri:
       url: 'https://{{ powervc_ip }}:8774/v2.1/{{ tenant_id}}/servers/{{ target_vm_id }}/action'
       method: POST
       headers:
         X-Auth-Token: "{{ OS_TOKEN }}"
         Accept: application/json
       body_format: json
       body: "{{ lookup('template', 'snapshot.json') }}"   #<= 対象のsnapshot 定義を外部ファイルで読み込み
       return_content: yes
       status_code: 202
       validate_certs: no
       timeout: 300
     register: deploy_vm
```

vars で変数定義をスクリプトの上に持ってきました。
vars_files 指定に変更すると外部ファイル読み込みとなり、実行スクリプトの編集機会が減ってより汎化できそうです。


snapshot.json で対象のボリュームを指定

```snapshot.json
{						
	"vm-snapshot": {					
		"name": "VM_snapshot_test",				
		"description": "VM_snapshot_test_API",				
		"volumes": ["xxxxx-c102-47d1-xx-xxxxxxxxx"]				
	}					
}						
```

---


#### 実行

```
$ time ansible-playbook snapshot.yml

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

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

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

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

TASK [Create Snapshot] *****************************************************************************
ok: [localhost]

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

ansible-playbook snapshot.yml  1.32s user 0.42s system 21% cpu 8.103 total
$
```

所要時間 2 秒程度で終了しました。

対象の snapshot が作成されていることをGUIで確認しました。
snapshot.jsonで記載していた Description も入力されています。

![スクリーンショット 2022-08-19 13.40.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/fb7a7e6f-98c8-8afd-a5bb-b96fe7f6d55b.png)



---

おわりに

Ansibleでの実行は運用フェーズでも効果が大きいと思いますので、引き続きAnsibleでの PowerVC API 実行を確認しようと思います。




以上です。