Contents
Ansible 2.9まではAnsibleのコアとコミュニティーなどが一つにまとまって配布されていましたが、2.10以降からはコア以外はCollectionsとして外出しになります。
VMwareモジュールもCollectionsに移動するため一足先に使ってみました。(collectionsは2020/03/20現在まだ移行途中になっています)
Collectionsの種類
VMwareのCollectionsは2つあります。
vmware
vmware
はVMware社がOSSで公開しているライブラリの pyvmomi と vsphere-automation-sdk-python に依存した作りなっています。
APIはSOAP(mob)とRESTの両方を使う(従来の)モジュールが提供されています。
vmware_rest
vmware_rest
はVMware社が公開しているライブラリに依存しない作りになっています。
コミュニティーがvSphereのREST APIの仕様に基づいて独自にユーティリティを開発しています。
ただし、まだ開発が始まったばかりなのと現時点ではvSphere REST API(vSphere 7だとどれくらいできるようになるんだろう?)で出来ることに限りがあるので、まだモジュールも vmware
よりは用意されていません。
今後、開発されていくと思います。
vmware_restが出てきた背景や期待されること
vSphereがSOAPだけではなく、REST APIの機能も追加されるようになりました。
SOAPの場合、サードパーティー製のライブラリ(pyvmomiやAutomation SDK)をインストールする必要がありますが、RESTの場合はインストールしなくてもすぐ使えるようになります。
また、今までのモジュールではタスク毎に認証情報を書く必要がありましたが(環境変数に認証情報を設定すれば省略することは可能です)、vmware_restの場合はHTTP Pluginが用意されており、タスク毎に認証情報を書かなくても例えばinventoryにvCenterの情報を書くだけで対応できるようになります。
今までのモジュールはコミュニティーでサポートされていましたが、開発方法やパラメーターの標準化・正規化が出来ていなかったのが課題だったようです。
HTTP Pluginの導入によっていくつかの部分が標準化されたり、その結果パフォーマンスが向上し依存関係を減らすことが期待できるようです。
(例えば、vmware_guestとか複雑且つ処理が重いので、これを将来的には分割したりできるのかもしれない)
Collectionsのインストール
ここでは以下の環境を準備して試しました。
項目 | バージョン |
---|---|
OS | CentOS 7.5.1804 |
Python | 3.6.8 |
Ansible | 2.10.0.dev0 |
環境準備
virtualenvの準備
virtualenv環境を作ります。
1 2 3 4 |
[root@localhost collections]# python3 -m venv venv [root@localhost collections]# . venv/bin/activate (venv) [root@localhost collections]# |
Ansibleのインストール
開発版のAnsibleをインストールします。
1 2 3 4 5 6 7 8 9 |
(venv) [root@localhost collections]# git clone http://github.com/ansible/ansible.git (venv) [root@localhost collections]# cd ansible/ (venv) [root@localhost ansible]# pip install -r requirements.txt (venv) [root@localhost ansible]# . hacking/env-setup (venv) [root@localhost ansible]# ansible --version ansible 2.10.0.dev0 (snip) (venv) [root@localhost ansible]# cd .. |
Collectionをインストールするディレクトリを作成
デフォルトでは ~/.ansible/collections/ansible_collections/
にCollectionsがインストールされますが、ここでは以下のディレクトリを作成して意図的にインストール先を指定します。
1 2 |
(venv) [root@localhost collections]# mkdir collections |
vmwareインストール
Collectionsの vmware
をインストールします。
注意点としては、vmware
を使うために必要なライブラリをインストールする時にpipのバージョンが古いとAutomation SDKをインストールする時にエラーが発生するのでバージョンアップします。
1 2 3 4 |
(venv) [root@localhost collections]# pip install --upgrade pip (venv) [root@localhost collections]# ansible-galaxy collection install community.vmware -p collections/ (venv) [root@localhost collections]# pip install -r collections/ansible_collections/community/vmware/requirements.txt |
vmware_restインストール
Collectionsの vmware_rest
をインストールします。
この記事を書いている時点(2020/03/20)では、Galaxyに登録されていなかったのでリポジトリをクローンしてインストールします。
namespaceがansibleになっているけど、これは将来communityになると思っています(多分)
1 2 3 |
(venv) [root@localhost collections]# git clone https://github.com/ansible-collections/vmware_rest.git collections/ansible_collections/ansible/vmware_rest (venv) [root@localhost collections]# pip install -r collections/ansible_collections/community/vmware_rest/requirements.txt |
Collectionsの使い方
vmware
collectionsのvmwareで提供されている vmware_guest_info
モジュールを使用した例です。
使用するモジュールをFQCNで指定する場合は namespace.collection_name.module_name
として指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
--- - name: Collections vmware sample playbook hosts: localhost gather_facts: no vars: vcenter_hostname: vcenter host vcenter_username: administrator@vsphere.local vcenter_password: password datacenter_name: DC vm_name: docker03 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: "{{ vm_name }}" register: result - debug: var=result |
または collections
で指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
--- - name: Collections vmware sample playbook hosts: localhost gather_facts: no collections: - community.vmware vars: vcenter_hostname: vcenter host vcenter_username: administrator@vsphere.local vcenter_password: password datacenter_name: DC vm_name: docker03 tasks: - name: Gather info for VM vmware_guest_info: hostname: "{{ vcenter_hostname }}" username: "{{ vcenter_username }}" password: "{{ vcenter_password }}" validate_certs: no datacenter: "{{ datacenter_name }}" name: "{{ vm_name }}" register: result - debug: var=result |
以下は実行例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
(venv) [root@localhost collections]# ansible-playbook main.yml (snip) PLAY [Collections vmware sample playbook] ********************************************************************************************************************************* TASK [Gather info for VM] ************************************************************************************************************************************************* ok: [localhost] TASK [debug] ************************************************************************************************************************************************************** ok: [localhost] => { "result": { "changed": false, "failed": false, "instance": { "annotation": "", "current_snapshot": { "creation_time": "2018-10-14T22:46:08.789807+00:00", (snip) |
vmware_rest
collectionsのvmware_restで提供されている vmware_core_info
モジュールを使用した例です。
使用するモジュールをFQCNで指定する場合は namespace.collection_name.module_name
として指定します。
1 2 3 4 5 6 7 8 9 10 11 12 |
--- - name: Collections vmware_rest sample playbook hosts: all gather_facts: no tasks: - name: Gather info for datacenter ansible.vmware_rest.vmware_core_info: object_type: datacenter register: result - debug: var=result |
または collections
で指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
--- - name: Collections vmware_rest sample playbook hosts: all gather_facts: no collections: - ansible.vmware_rest tasks: - name: Gather info for datacenter vmware_core_info: object_type: datacenter register: result - debug: var=result |
inventoryファイルは以下のように作成しています。
1 2 3 4 5 6 7 8 9 10 11 |
[all] vcenter ansible_host=vcenter host [all:vars] ansible_connection=httpapi ansible_network_os=vmware ansible_user=administrator@vsphere.local ansible_httpapi_password=password ansible_httpapi_use_ssl=true ansible_httpapi_validate_certs=false |
以下は実行例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
(venv) [root@localhost collections]# ansible-playbook main.yml -i inventory [WARNING]: You are running the development version of Ansible. You should only run Ansible from "devel" if you are modifying the Ansible engine, or trying out features under development. This is a rapidly changing source of code and can become unstable at any point. PLAY [Collections vmware_rest sample playbook] **************************************************************************************************************************** TASK [hoge] *************************************************************************************************************************************************************** ok: [vcenter] TASK [debug] ************************************************************************************************************************************************************** ok: [vcenter] => { "result": { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "datacenter": { "value": [ { "datacenter": "datacenter-2", "name": "DC" } ] }, "failed": false } } PLAY RECAP **************************************************************************************************************************************************************** vcenter : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 |
今後は、VMwareのRESTの機能拡張によってAnsibleのモジュールも増えていくと思います 🙂
ただ、今はまだまだSOAPの方が出来ることが多いので、しばらくはSOAPメインが続きそうな予感はします(vSphere 7だとどうかは要確認!)