"Ansible を使用した PowerVC の自動化" の試行 - VM 作成、削除


以前の記事、["Ansible を使用した PowerVC の自動化" の試行](https://qiita.com/c_u/items/3b04bcd919c2cd03495a) の続きで VM作成と削除を実行した記録です。

[Tutorial: Ansible を使用した PowerVC の自動化](https://developer.ibm.com/tutorials/automating-powervc-using-ansible/) を参照しています。

なお、この方法では Ansible の OpenStack モジュールを使用しているので、VM作成に Terraform を使用していません。

---
#### 環境
Ansible Server:  Local Mac PC　(ansible version 2.9.9)
        python: 3.7.3
target: PowerVC_Server -> [前の記事](https://qiita.com/c_u/items/e51114c14af2f4b15d5f)で導入した PowerVC 2.0 サーバー(RHEL 8.3)

----

#### 準備

①ssh鍵交換

1) Local Mac PC で ssh-keygen コマンド で ssh key を作成
2) PowerVC_Server に public key を転送
3) PowerVC_Server の /root/.ssh/authorized_keys を作成し、2) で転送した pubic key を追記

---

②ssh の configファイルの設定
 Local Mac の <home>/.ssh/config に以下の設定する

```
  Host PowerVC_Server
  HostName xx.xx.xx.xx
  User root
  IdentityFile ~/.ssh/id_rsa          #<= ①で作成した secret keyを指定
```

これでパスワード入力なしで Local Mac PC と PowerVC_Server が ssh 接続できるようになります。

---
③サンプル・モジュールをダウンロードする
https://github.com/ppc64le/devops-automation/tree/master/ansible/powervc

ダウンロードしたモジュールを移動し、配置した場所を ansible 実行ディレクトリとしています。

---

④inventory の設定

invenrory ファイルを以下のように設定します。

```inventory
[test]
PowerVC_Server ansible_python_interpreter=/usr/bin/python3
```

---



⑤ansible.cfg の設定

```ansible.cfg
[defaults]
inventory = ./inventory
interpreter_python=/usr/bin/python
remote_user = root
[inventory]

interpreter_python=/usr/bin/python
```

---

⑥ PowerVC_Server から /opt/ibm/powervc/powervcrc と/etc/pki/tls/certs/powervc.crt をAnsible 実行サーバーである Local Mac PC に取得し、実行ディレクトリに配置します。

powervcrc 内の powervc.crt の指定を配置場所に変更します。

```powervcrc
$ cat powervcrc
# Copy this file to your user's home directory and edit as necessary.
# In particular, you may wish to set these values:
#    - OS_USERNAME     : Your PowerVC user name
#    - OS_PASSWORD     : Your PowerVC password. If not set, openstack CLIs
#                        will prompt for the password as needed.
#    - OS_PROJECT_NAME : If you have multiple projects, specify which project
#                        you want to access; else you can leave this as
#                        ibm-default.
#
# NOTE: You should not add your password to this file until/unless its file
# permissions prevent other users from reading it. This is one reason to copy
# the file to your home directory and edit it there. Or you may wish to not
# add your password at all and have the CLI prompt you, as noted above.

export OS_IDENTITY_API_VERSION=3
export OS_AUTH_URL=https://xx.xx.xx.xx:5000/v3/
export OS_CACERT=./powervc.crt                   #<= 配置場所に記載変更
export OS_REGION_NAME=RegionOne
export OS_PROJECT_DOMAIN_NAME=Default
export OS_PROJECT_NAME=ibm-default
export OS_TENANT_NAME=$OS_PROJECT_NAME
export OS_USER_DOMAIN_NAME=Default
#export OS_USERNAME=
#export OS_PASSWORD=
export OS_COMPUTE_API_VERSION=2.46
export OS_NETWORK_API_VERSION=2.0
export OS_IMAGE_API_VERSION=2
export OS_VOLUME_API_VERSION=3
```


----

#### 稼働検証


実行ディレクトリに配置しているファイルのご参考

```
$ ls -l
-rw-r--r--  1 user  staff   205 Dec 17 15:03 ansible.cfg
-rw-r--r--  1 user  staff  1154 Sep 18 23:22 create_vm.yml
-rw-r--r--  1 user  staff   469 Sep 16 17:27 imagelist.yml
-rw-r--r--  1 user  staff    58 Dec 17 16:09 inventory
-rw-r--r--  1 user  staff   451 Sep 18 23:22 list_flavors.yml
-rw-r--r--  1 user  staff   468 Sep 18 23:22 list_images.yml
-rw-r--r--  1 user  staff   246 Sep 18 23:21 list_network.yml
-rw-r--r--  1 user  staff    60 Sep 16 16:14 openstack.yml
-rw-r--r--  1 user  staff  1192 Dec 12 09:52 powervc.crt
-r--r--r--  1 user  staff  1267 Dec 17 14:55 powervcrc
-rw-r--r--  1 user  staff   135 Sep 27 21:44 service.yml
```


① 環境変数の設定

```
$ source powervcrc
$ export OS_USERNAME=root
$ export OS_PASSWORD="PowerVC_Serverの PowerVC 実行ユーザー password"
```

② 疎通確認

ping モジュールを実行します。

```
$ ansible test -m ping
PowerVC_Server | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
```

(個人の好みです。わたしはこの ping - pong が見たくて実行しています...)


③ モジュール確認

サンプル・ファイル [create_vm.yml](https://github.com/ppc64le/devops-automation/blob/master/ansible/powervc/create_vm.yml) を実行します。


create_vm.yml の内容参考です。
image_id、flavor_id、network名は事前取得、記入が必要です。
(list_images.yml、list_flavors.yml、list_network.yml を実行して確認、または GUIで確認。)

```create_vm.yml
 ---
- name: Create a PowerVC Virtual Machine
  hosts: localhost
  vars:
    image_id: "<image id を入力>"      
    flavor_id:" "<flavor id を入力>"    
    network_name: "<network名を入力>"  
  tasks:
    - name: Create an SSH Key Pair
      os_keypair:
        state: present
        name: ansible-ssh-key
        public_key_file: "{{ ansible_env.HOME }}/.ssh/id_rsa.pub"

    - name: Create a new VM instance
      os_server:
        state: present
        name: deploytest　　　　　　　　     # <= 修正
        image: "{{ image_id }}"
        flavor: "{{ flavor_id }}"
        key_name: ansible-ssh-key
        nics:
          - net-name: "{{ network_name }}"
        meta:
          hostname: deploytest　　　　　　　　     # <= 修正
          group: ansible-vms
      register: vm

    - name: Print VM's public IP address
      debug:
        var: vm.openstack.public_v4

#    - name: Waits for SSH port 22 to open
#      wait_for:
#        host: "{{ vm.openstack.public_v4 }}"
#        port: 22#

#    - name: Add VM host key to known hosts
#      shell: "ssh-keyscan -H {{ vm.openstack.public_v4 }} >> ~/.ssh/known_hosts"
```

Local PC とデプロイ先のVM はネットワークがつながっていないので、ssh 確認の箇所とknown_hosts への書き込みはコメントアウトしています。(当実行環境の特有の問題です。)


----

##### 実行

create_vm.yml を実行します。

```
$ ansible-playbook create_vm.yml

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

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

TASK [Create an SSH Key Pair] ****************************************************************************************************
ok: [localhost]

TASK [Create a new VM instance] **************************************************************************************************
changed: [localhost]

TASK [Print VM's public IP address] **********************************************************************************************
ok: [localhost] => {
    "vm.openstack.public_v4": "xx.xx.xx.xx"
}

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

```

成功!

----

##### 確認

GUI で確認しました。

![deployetest.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/93344ef6-9d5a-0b70-8b61-ace34749cd0e.jpeg)

ちゃんとできています!

-----

ついでに削除も実行してみます。

##### 削除の実行

以下は削除に使用した ymlファイルです。create_vm.yml から編集しました。

```delete_vm.yml
---
- name: delete a PowerVC Virtual Machine
  hosts: localhost
  tasks:

    - name: delete a VM instance
      os_server:
        state: absent
        name: deploytest
        meta:
          hostname: deploytest
          group: ansible-vms

```

実行

```
$ ansible-playbook delete_vm.yml

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

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

TASK [delete a VM instance] **************************************************************************************************
changed: [localhost]

PLAY RECAP ***********************************************************************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
```

成功しました。


GUI で確認

![スクリーンショット 2021-03-03 15.25.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/958bf865-dbb5-496c-3dbb-59efcae9f0e7.png)

VM はなくなっています。

VM delete もできることが確認できました。

----

#### 終わりに

Ansible の OpenStack Pluginを利用してPowerVC で サンプル・ファイル create_vm.yml で VM 作成および 簡単に作成した delete_vm.yml で VM 削除を実行しました。
ディスク作成なども加えられたらと思います。


以上です。