AnsibleのVMwareモジュールについて
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