Contents
既存のNSX-TのAnsibleモジュールで対応していないオペレーションに対して柔軟に対応できるよう
nsxt_rest
というモジュールを作ってみました。このモジュールはNSX-TのREST APIを簡単に実行できるモジュールです。
ここでは、モジュールの使い方とNSX-T APIの調査方法について説明したいと思います。
ansible-for-nsxt
nsxt_rest
一応、PRはしていますがマージしてくれるかは微妙かも..。
正直、このリポジトリは活発に動いてるのか分からないけど、今後の発展に期待。
環境
項目 | バージョン |
---|---|
Python | 3.6.8 |
Ansible | 2.9.7 |
準備
前提
以下が実行済みであることが前提となります。
モジュールのダウンロード
モジュールをダウンロードします。
1 2 3 4 |
(venv) [root@localhost ansible-for-nsxt]# pwd /root/nsxt/ansible-for-nsxt (venv) [root@localhost ansible-for-nsxt]# curl -L https://raw.githubusercontent.com/vmware/ansible-for-nsxt/72770996f1778e86e80fe904f5dd556f12bf651d/library/nsxt_rest.py -o library/nsxt_rest.py |
これで準備完了です 🙂
モジュールがサポートしているパラメーター
以下は、共通パラメーター(hostnameやpasswordなど)以外のnsxt_restがサポートしているパラメーターです。
パラメーター | 説明 |
---|---|
method | HTTPメソッド(get,post,put,patch,delete)を指定します |
path | APIをコールするURIを指定します |
src | payloadが書かれたファイルのパスを指定します(srcを使う場合はcontentが無視されます) |
content | payloadを直接指定します |
実行
ここでは、簡単なセグメントの作成、変更、削除をやってみようと思います。
※ちなみに、セグメントを作るモジュールは既存で存在しています
※セグメントのオペレーションを例にしたのは、シンプルで分かりやすいと思ったからです
セグメントの作成
作成用のPlaybookを作ります。
1 2 |
(venv) [root@localhost ansible-for-nsxt]# vi nsxt_rest_example.yml |
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 32 33 34 35 36 |
--- - name: nsxt_rest example playbook hosts: localhost gather_facts: no vars: # auth info nsxt_hostname: nsxt-manager nsxt_username: admin nsxt_password: secret # segment param segment_name: segment gateway_address: 192.168.0.1/24 tasks: - name: create a new segment nsxt_rest: hostname: "{{ nsxt_hostname }}" username: "{{ nsxt_username }}" password: "{{ nsxt_password }}" validate_certs: false method: put path: "/policy/api/v1/infra/segments/{{ segment_name }}" content: { "display_name": "{{ segment_name }}", "subnets": [ { "gateway_address": "{{ gateway_address }}" } ] } register: create_segment_result - debug: var=create_segment_result |
これを実行します。
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
(venv) [root@localhost ansible-for-nsxt]# ansible-playbook nsxt_rest_example.yml [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all' PLAY [nsxt_rest example playbook] **************************************************************************************************************************************** TASK [create a new segment] ********************************************************************************************************************************************** changed: [localhost] TASK [debug] ************************************************************************************************************************************************************* ok: [localhost] => { "create_segment_result": { "body": { "_create_time": 1588577253544, "_create_user": "admin", "_last_modified_time": 1588577253551, "_last_modified_user": "admin", "_protection": "NOT_PROTECTED", "_revision": 0, "_system_owned": false, "admin_state": "UP", "display_name": "segment", "id": "segment", "marked_for_delete": false, "overridden": false, "parent_path": "/infra", "path": "/infra/segments/segment", "relative_path": "segment", "replication_mode": "MTEP", "resource_type": "Segment", "subnets": [ { "gateway_address": "192.168.0.1/24", "network": "192.168.0.0/24" } ], "type": "DISCONNECTED", "unique_id": "e8807433-6bf9-466f-b834-7f6f85fc035e" }, "changed": true, "failed": false } } PLAY RECAP *************************************************************************************************************************************************************** localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 |
このように作成したセグメント情報が戻り値で返ってきます。
以下は、トランスポートゾーンとVLANを指定して作成した時の例です。
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
--- - name: nsxt_rest example playbook hosts: localhost gather_facts: no vars: # auth info nsxt_hostname: nsxt-manager nsxt_username: admin nsxt_password: secret # segment param segment_name: segment gateway_address: 192.168.0.1/24 transport_zone_name: external vlan_ids: - 1 - 2 tasks: - name: get transport zone list nsxt_transport_zones_facts: hostname: "{{ nsxt_hostname }}" username: "{{ nsxt_username }}" password: "{{ nsxt_password }}" validate_certs: false register: transport_zone_list_result - name: set transport_path variable set_fact: transport_path: "/infra/sites/default/enforcement-points/default/transport-zones/{{ item.id }}" loop: "{{ transport_zone_list_result.results }}" when: - item.host_switch_name == transport_zone_name - name: create a new segment nsxt_rest: hostname: "{{ nsxt_hostname }}" username: "{{ nsxt_username }}" password: "{{ nsxt_password }}" validate_certs: false method: put path: "/policy/api/v1/infra/segments/{{ segment_name }}" content: { "display_name": "{{ segment_name }}", "transport_zone_path": "{{ transport_path }}", "vlan_ids": "{{ vlan_ids }}", "subnets": [ { "gateway_address": "{{ gateway_address }}" } ] } register: create_segment_result when: - transport_path is defined - debug: var=create_segment_result |
これを実行します。
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
(venv) [root@localhost ansible-for-nsxt]# ansible-playbook nsxt_rest_example.yml (snip) TASK [create a new segment] ********************************************************************************************************************************************** changed: [localhost] TASK [debug] ************************************************************************************************************************************************************* ok: [localhost] => { "create_segment_result": { "body": { "_create_time": 1588579676403, "_create_user": "admin", "_last_modified_time": 1588579676405, "_last_modified_user": "admin", "_protection": "NOT_PROTECTED", "_revision": 0, "_system_owned": false, "admin_state": "UP", "display_name": "segment", "id": "segment", "marked_for_delete": false, "overridden": false, "parent_path": "/infra", "path": "/infra/segments/segment", "relative_path": "segment", "replication_mode": "MTEP", "resource_type": "Segment", "subnets": [ { "gateway_address": "192.168.0.1/24", "network": "192.168.0.0/24" } ], "transport_zone_path": "/infra/sites/default/enforcement-points/default/transport-zones/b6c17b01-ef01-4eb1-b36f-8d7a03d9e2a4", "type": "DISCONNECTED", "unique_id": "5b33cb00-c79d-483a-942a-cc805defd567", "vlan_ids": [ "1", "2" ] }, "changed": true, "failed": false } } PLAY RECAP *************************************************************************************************************************************************************** localhost : ok=5 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 |
セグメント情報の変更
変更する場合は、contentまたはsrcのJSONを変更して実行すればいいです。
セグメントの削除
セグメントの削除は delete
メソッドを使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
--- - name: nsxt_rest example playbook hosts: localhost gather_facts: no vars: # auth info nsxt_hostname: nsxt-manager nsxt_username: admin nsxt_password: secret # segment param segment_name: segment tasks: - name: delete a segment nsxt_rest: hostname: "{{ nsxt_hostname }}" username: "{{ nsxt_username }}" password: "{{ nsxt_password }}" validate_certs: false method: delete path: "/policy/api/v1/infra/segments/{{ segment_name }}" |
実行します。
1 2 3 4 5 6 7 8 9 10 11 |
(venv) [root@localhost ansible-for-nsxt]# ansible-playbook nsxt_rest_example.yml [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all' PLAY [nsxt_rest example playbook] **************************************************************************************************************************************** TASK [delete a segment] ************************************************************************************************************************************************** changed: [localhost] PLAY RECAP *************************************************************************************************************************************************************** localhost : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 |
これで、セグメントが削除されました 🙂
NSX-T REST APIの調査方法
REST APIドキュメントを見る
NSX-T 3.0のREST APIドキュメントは、マネージャーにバンドルされています。
以下のように参照できます。
NSX-T REST APIドキュメント確認方法 from sky_joker on Vimeo.
Chromeのデベロッパーツールを使う
最初のうちはドキュメントを見ただけでは、実際にやりとりしている内容やJSON構造のイメージが付かないかもしれません。
そこで、GUIでやった操作をChromeのデベロッパーツールを使ってどのURIに対してどういったpayloadが送信されたのか確認することができます。
次の動画では、セグメントを追加するオペレーションを実行し、実際にリクエストされたURIとメソッドおよびpayloadについて確認している例です。
NSX-T REST APIのリクエストをGoogle Chromeのデベロッパーツールを使って確認する from sky_joker on Vimeo.
このように、リクエスト先のURIとメソッドとpayloadが分かれば nsxt_rest
で簡単にAPIを実行することができます 🙂