Python
vmware
Ansible
pyvmomi

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

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

1. vmware_ovftool

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をダウンロード

---
- 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をデプロイ

- 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
- 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は以下のものを使用します。

---
- 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は以下のものを使用します。

- 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