Ansibleを利用すると、ESXiやvCenter、仮想マシンに対しての操作を自動化することができます。AnsibleのVMwareモジュールについて最近の状況について確認してみたいと思います。
構成
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 APIのPython 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_rest
のVMwareの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