Ansibleで実行できるVMwareのovftoolモジュールを作ってみた

Ansibleモジュールでovfのダウンロードやデプロイをするモジュールが標準では無かったので作ってみました。(時間が経てば標準で出てくるとは思います。)

# 1. vmware_ovftool

[https://github.com/sky-joker/ore-ore-ansible/blob/master/modules/cloud/vmware/vmware_ovftool.py](https://github.com/sky-joker/ore-ore-ansible/blob/master/modules/cloud/vmware/vmware_ovftool.py)

`vmware_ovftool` はESXi及びvCenterで動作確認をしています。

# 2. Playbook例

## 2-1. OVFをダウンロード

```yaml
---
- name: OVF Download Task.
  vmware_ovftool:
    hostname: vCenter or ESXi
    username: Username
    password: Secret
    validate_certs: no
    method: download
    name: devel # myVMName
    path: ./devel # ovf download to local path(full or current directory path)
```

## 2-2. OVFをデプロイ

```yaml
- name: OVF Deploy Task.
  vmware_ovftool:
    hostname: vCenter
    username: Username
    password: Secret
    validate_certs: no
    method: deploy
    datacenter: DC
    compute_resource: Cluster
    name: new_devel
    path: ./devel
    folder: /vm/example
    datastore: NFS
```

```yaml
- name: OVF Deploy Task.
  vmware_ovftool:
    hostname: vCenter
    username: Username
    password: Secret
    validate_certs: no
    method: deploy
    datacenter: DC
    resource_pool: example
    name: new_devel
    path: ./devel
    datastore: NFS
```

# 3. 使用例

ESXiをホスト名で登録している場合は、vmware_ovftoolを実行するホストからESXiホストの名前解決ができなくてはいけません。

## 3-1. 必要なモジュールのインストール

```
[root@localhost ~]# pip install pyvmomi requests
```

## 3-2. モジュールのダウンロード

```
[root@localhost ~]# git clone https://github.com/sky-joker/ore-ore-ansible.git
```

## 3-3. OVFダウンロード

ESXiホストから `devel` という仮想マシンのOVFをダウンロードしてカレントパスの `./devel` フォルダへ保存します。
Playbookは以下のものを使用します。

```yaml
---
- name: OVF module test
  hosts: localhost
  gather_facts: no
  tasks:
    - name: OVF Download Task.
      vmware_ovftool:
        hostname: esxi-07.local
        username: root
        password: password
        validate_certs: no
        method: download
        name: devel
        path: ./devel
```

実行してみます。

```
[root@localhost ~]# mkdir devel
[root@localhost ~]# ansible-playbook ovf_download.yml --module-path ore-ore-ansible/modules/cloud/vmware/
 [WARNING]: Unable to parse /etc/ansible/hosts as an inventory source

 [WARNING]: No inventory was parsed, only implicit localhost is available

 [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'


PLAY [OVF module test] ***************************************************************************************************************************************************************************

TASK [OVF Download Task.] ************************************************************************************************************************************************************************
ok: [localhost]

PLAY RECAP ***************************************************************************************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0
[root@localhost ~]# ls devel/
devel.ovf  disk-0.vmdk
```

## 3-4. OVFデプロイ

vCenterへダウンロードしたOVFをデプロイしてみます。
以下では、デプロイ先を `Cluster` というクラスタ名を指定しています。
`/vm/example` は仮想マシンをデプロイするvCenter側のフォルダパスです。
`new_devel` は新規で作成する仮想マシン名です。
Playbookは以下のものを使用します。

```yaml
- name: OVF module test
  hosts: localhost
  gather_facts: no
  tasks:
    - name: OVF Deploy Task.
      vmware_ovftool:
        hostname: vcenter.local
        username: administrator@vsphere.local
        password: password
        validate_certs: no
        method: deploy
        datacenter: DC
        compute_resource: Cluster
        name: new_devel
        path: ./devel
        folder: /vm/example
        datastore: NFS
```

実行してみます。

```
[root@localhost ~]# ansible-playbook ovf_deploy.yml --module-path ore-ore-ansible/modules/cloud/vmware/
 [WARNING]: Unable to parse /etc/ansible/hosts as an inventory source

 [WARNING]: No inventory was parsed, only implicit localhost is available

 [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'


PLAY [OVF module test] ***************************************************************************************************************************************************************************

TASK [OVF Deploy Task.] **************************************************************************************************************************************************************************
ok: [localhost]

PLAY RECAP ***************************************************************************************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0
```

# 4. 最後に

これで、ESXi単体でもマスターテンプレートの仮想マシンを作成してOVFでダウンロードしておけば、クローンちっくなことができるようになりました。
ただ、これだけだとPowershellとかでも出来てしまうのでAnsibleやAnsible Tower(AWXとかも)と組み合わせた旨味(デプロイ + VM構成変更 + サーバ構築 + テストの自動化など)が出ないか色々やってみようと思います。
作った後に思ったのが以下のツールのような `argument_spec` にすればよかったなと後悔...
[https://github.com/ansible/ansible/blob/devel/lib/ansible/modules/cloud/vmware/vmware_guest_file_operation.py](https://github.com/ansible/ansible/blob/devel/lib/ansible/modules/cloud/vmware/vmware_guest_file_operation.py)