hidemium's blog

日々学んだことをアウトプットする。

AnsibleのVMwareモジュールについて

Ansibleを利用すると、ESXiやvCenter、仮想マシンに対しての操作を自動化することができます。AnsibleのVMwareモジュールについて最近の状況について確認してみたいと思います。

構成

  • vCenter 7.0 U2
  • ESXi 7.0 Update 2
  • Ubuntu 20.04 (Ansible実行環境)

VMwareモジュールについて

Ansible 2.9まではAnsibleのコアとコミュニティーなどが一つにまとまって配布されていましたが、2.10以降からはコア以外はCollectionsとして外出しとなりました。

2022/6/15現在、Ansibleのバージョンは5となっており、community.vmware というVMwareのCollectionsのモジュールは以下で確認できます。

Community.Vmware — Ansible Documentation

community.vmware` のVMwareのCollectionsのモジュールは以下のGitHubリポジトリで開発されています。

GitHub - ansible-collections/community.vmware: Ansible Collection for VMware

VMwareモジュールには、VMware vSphere APIPython SDKのpyVmomiが必要になります。

$ pip install pyvmomi

また、NSX-TやVMware Cloud on AWS向けに vSphere Automation Python SDK が必要となります。

$ pip install --upgrade git+https://github.com/vmware/vsphere-automation-sdk-python.git

また、 vmware.vmware_rest というVMwareのCollectionsのモジュールもあり、こちらは、pyVmomiやvSphere Automation Python SDKに依存せずに、vSphereのREST APIの仕様に基づいてコミニュティーが開発しているものになります。

Vmware.Vmware_Rest — Ansible Documentation

vmware.vmware_restVMwareのCollectionsのモジュールは以下のGitHubリポジトリで開発されています。

GitHub - ansible-collections/vmware.vmware_rest: Ansible Collection for VMWare (REST modules)

インストール

community.vmware を利用したAnsibleが実行できる環境を準備してみようと思います。

Python 3.8以降がインストールされている必要があります。

venvの環境をインストールします。(Ansibleの公式サイトでは、virtualenvを使っていましたが、Python 3.3からはvenvがPython標準ライブラリとなったためこちらを利用します。)

$ python3 --version
Python 3.8.10
$ sudo apt install python3.8-venv
$ mkdir ansible-vmware
$ cd ansible-vmware
$ python3 -m venv venv (python3 -m venv [仮想環境ディレクトリ名])

venvというフォルダが作成されました。

$ tree -L 4
.
└── venv
    ├── bin
    │   ├── activate
    │   ├── activate.csh
    │   ├── activate.fish
    │   ├── Activate.ps1
    │   ├── easy_install
    │   ├── easy_install-3.8
    │   ├── pip
    │   ├── pip3
    │   ├── pip3.8
    │   ├── python -> python3
    │   └── python3 -> /usr/bin/python3
    ├── include
    ├── lib
    │   └── python3.8
    │       └── site-packages
    ├── lib64 -> lib
    ├── pyvenv.cfg
    └── share
        └── python-wheels
            ├── appdirs-1.4.3-py2.py3-none-any.whl
            ├── CacheControl-0.12.6-py2.py3-none-any.whl
            ├── certifi-2019.11.28-py2.py3-none-any.whl
            ├── chardet-3.0.4-py2.py3-none-any.whl
            ├── colorama-0.4.3-py2.py3-none-any.whl
            ├── contextlib2-0.6.0-py2.py3-none-any.whl
            ├── distlib-0.3.0-py2.py3-none-any.whl
            ├── distro-1.4.0-py2.py3-none-any.whl
            ├── html5lib-1.0.1-py2.py3-none-any.whl
            ├── idna-2.8-py2.py3-none-any.whl
            ├── ipaddr-2.2.0-py2.py3-none-any.whl
            ├── lockfile-0.12.2-py2.py3-none-any.whl
            ├── msgpack-0.6.2-py2.py3-none-any.whl
            ├── packaging-20.3-py2.py3-none-any.whl
            ├── pep517-0.8.2-py2.py3-none-any.whl
            ├── pip-20.0.2-py2.py3-none-any.whl
            ├── pkg_resources-0.0.0-py2.py3-none-any.whl
            ├── progress-1.5-py2.py3-none-any.whl
            ├── pyparsing-2.4.6-py2.py3-none-any.whl
            ├── requests-2.22.0-py2.py3-none-any.whl
            ├── retrying-1.3.3-py2.py3-none-any.whl
            ├── setuptools-44.0.0-py2.py3-none-any.whl
            ├── six-1.14.0-py2.py3-none-any.whl
            ├── toml-0.10.0-py2.py3-none-any.whl
            ├── urllib3-1.25.8-py2.py3-none-any.whl
            ├── webencodings-0.5.1-py2.py3-none-any.whl
            └── wheel-0.34.2-py2.py3-none-any.whl

仮想環境のアクティベートし、Ansibleをインストールします。

$ source venv/bin/activate
(venv) $ python -m pip install ansible
(venv) $ pip list
$ deactivate #仮想環境を終了する場合
Package       Version
------------- -------
ansible       5.9.0  
ansible-core  2.12.6 
cffi          1.15.0 
cryptography  37.0.2 
Jinja2        3.1.2  
MarkupSafe    2.1.1  
packaging     21.3   
pip           20.0.2 
pkg-resources 0.0.0  
pycparser     2.21   
pyparsing     3.0.9  
PyYAML        6.0    
resolvelib    0.5.4  
setuptools    44.0.0

Ansibleをインストールすると、 .ansible というCollectionがインストールされるディレクトリが作成されます。

.ansible # Collection
ansible-vmware/venv # 仮想環境のディレクトリ

Collectionをインストールします。requirements.ymlを用意し、インストールしてみます。

$ vi requirements.yml
collections:
- name: community.vmware
$ ansible-galaxy collection install -r requirements.yml

collectionのフォルダ内にrequirements.txtがあり、こちらを利用し、pyvmomiとvSphere Automation Python SDKをインストールします。

(venv) $ python -m pip install -r ~/.ansible/collections/ansible_collections/community/vmware/requirements.txt
(venv) $ pip list
Package                            Version    
---------------------------------- -----------
ansible                            5.9.0      
ansible-core                       2.12.6     
certifi                            2022.5.18.1
cffi                               1.15.0     
charset-normalizer                 2.0.12     
cryptography                       37.0.2     
idna                               3.3        
Jinja2                             3.1.2      
lxml                               4.9.0      
MarkupSafe                         2.1.1      
nsx-policy-python-sdk              3.1.5.0.0  
nsx-python-sdk                     3.1.5.0.0  
nsx-vmc-aws-integration-python-sdk 3.1.5.0.0  
nsx-vmc-policy-python-sdk          3.1.5.0.0  
packaging                          21.3       
pip                                20.0.2     
pkg-resources                      0.0.0      
pycparser                          2.21       
pyOpenSSL                          22.0.0     
pyparsing                          3.0.9      
pyvmomi                            7.0.3      
PyYAML                             6.0        
requests                           2.28.0     
resolvelib                         0.5.4      
setuptools                         44.0.0     
six                                1.16.0     
urllib3                            1.26.9     
vapi-client-bindings               3.8.0      
vapi-common-client                 2.34.0     
vapi-runtime                       2.34.0     
vmc-client-bindings                1.59.0     
vmc-draas-client-bindings          1.19.0     
vSphere-Automation-SDK             1.77.0

まずはシンプルに、vCenterに接続し、仮想マシンの情報を取得する処理を実行してみます。delegate_to: localhost を記載することで、Ansibleの実行ホストでplaybookを実行するように指定します。

$ vi test.yml
---
- name: Collections vmware sample playbook
  hosts: all
  gather_facts: no
  vars:
    vcenter_hostname: <vCenter Name>
    vcenter_username: administrator@vsphere.local
    vcenter_password: <password>
    datacenter_name: <Datacenter Name>
  tasks:
    - name: Gather info for VM
      community.vmware.vmware_guest_info:
        hostname: "{{ vcenter_hostname }}"
        username: "{{ vcenter_username }}"
        password: "{{ vcenter_password }}"
        validate_certs: no
        datacenter: "{{ datacenter_name }}"
        name: "{{ inventory_hostname}}"
      delegate_to: localhost
      register: result

    - debug: var=result

vmグループを定義し、その中に情報を取得したいVM名を記載します。

$ vi hosts
[vm]
<VM Name>

playbookを実行し、仮想マシンの情報が取得できていることを確認します。

$ ansible-playbook -i hosts test.yml

PLAY [Collections vmware sample playbook] ************************************************************************************************************************************************

TASK [Gather info for VM] ****************************************************************************************************************************************************************
ok: [<VM name> -> localhost]

TASK [debug] *****************************************************************************************************************************************************************************
ok: [<VM name>] => {
    "result": {
        "changed": false,
        "failed": false,
        "instance": {
            "advanced_settings": {
                "ethernet0.pciSlotNumber": "192",

~ 中略 ~
            "vimref": "vim.VirtualMachine:vm-2028",
            "vnc": {}
        }
    }
}

PLAY RECAP *******************************************************************************************************************************************************************************
<VM name>                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

参考

https://sky-joker.tech/2020/03/20/ansible%E3%81%AEvmware-collections%E3%82%92%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95/