VMware Cloud Director 10.4(VCD)で、Ansible を使用して Edge Gateway の NAT ルールを追加してみます。DNAT での接続先には、前回作成した経路指定 組織 VDC ネットワークに接続された仮想マシンを利用します。
前回はこちら。
Ansible の VCD モジュールと NSX-T Edge Gateway
これまでは下記のモジュールを利用していましたが、NSX-T(NSX 4.0)による Edge Gateway による NAT や Firewall の操作には対応していなそうです。
そこで、Ansible ビルトインされている uri モジュールと、VMware Cloud Director OpenAPI を利用してみます。
VMware Cloud Director OpenAPI
ちなみに、Ansible の VCD モジュールにある vcd_gateway_services で情報取得を試みると下記のようにエラーになってしまいました。
Firewall の場合のエラー メッセージ例
fatal: [localhost]: FAILED! => {"changed": false, "msg": "Status code: 400/None, None (request id: 03e3aaea-d687-4729-b977-bfda7362f69a)"}
NAT Rule の場合のエラー メッセージ例
fatal: [localhost]: FAILED! => {"changed": false, "msg": "Status code: 500/None, None (request id: 9cf88ecc-d8ac-49a7-99c7-edbb1fdbb320)"}
1. 変換先 IP アドレスを持つ仮想マシンの準備
今回は下記のように、経路指定 組織 VDC ネットワークに接続された仮想マシンを用意してあります。
- 仮想マシン: vm01
- IP アドレス: 10.0.6.100
2. Ansible uri モジュールによる VCD 認証トークンの取得
VMware Cloud Director OpenAPI では、従来の VCD の API と同様に最初にトークンを取得して、それをリクエスト ヘッダに指定して利用します。下記に POST メソッドのリクエストを送ることで、X_VMWARE_VCLOUD_ACCESS_TOKEN トークンを取得できます。
- テナントの場合
- URL: /cloudapi/1.0.0/sessions
- ユーザ: ユーザ名@組織名
- プロバイダの場合
- URL: /cloudapi/1.0.0/sessions/provider
- ユーザ: ユーザ名@system(administrator@system など)
これは、Ansible の uri モジュールでは下記のようなタスクになります。これは、このあと接続確認をかねて既存の NAT ルール取得の Playbook で実行します。
- name: get token ansible.builtin.uri: url: "https://lab-vcd-31.vcd.go-lab.jp/cloudapi/1.0.0/sessions" user: "org-01-admin@demo-org-01" password: "VMware1!" method: "POST" force_basic_auth: true headers: Accept: "application/json;version=37.0" status_code: 200 validate_certs: false register: token
3. NAT ルールの確認
まずは uri モジュールでの接続確認をかねて、Edge Geteway に既に設定されている NAT ルールの情報を取得してみます。
3-1. テナント ポータル(Web UI)での確認
VCD のテナント ポータルから確認すると、下記のように 2件の NAT ルールが作成されています。
3-2. Ansible Playbook の用意
下記のように Playbook の YAML ファイルを作成しておきます。
X_VMWARE_VCLOUD_ACCESS_TOKEN トークンは、各 API コールの Authorization ヘッダで指定します。
3-3. Ansible Playbook の実行
Playbook を実行します。
$ ansible-playbook demo_list_nat-rule.yml
実際に Playbook を実行すると、下記のように NAT ルールの情報が表示されます。この環境では、テナント ポータルでも表示されていた 2件のルールが取得できました。
# ansible-playbook demo-ansible-vcd/part-05/demo_list_nat-rule.yml [WARNING]: No inventory was parsed, only implicit localhost is available [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all' PLAY [List VCD Edge Gateway NAT Rules] *************************************************************************** TASK [get Token] ************************************************************************************************* [WARNING]: Module did not set no_log for password ok: [localhost] TASK [get Edge Gateways] ***************************************************************************************** ok: [localhost] TASK [set Edge Gateway ID] *************************************************************************************** ok: [localhost] TASK [output Edge Gateway ID] ************************************************************************************ ok: [localhost] => { "edge_gateway_id": "urn:vcloud:gateway:da240008-4afd-4731-aa43-9c3e4c3a41b7" } TASK [get Edge Gateway org-01-edge-01 NAT Rules] ***************************************************************** ok: [localhost] TASK [output Edge Gateway NAT Rules] ***************************************************************************** ok: [localhost] => { "edge_gateway_nat_rules.json['values']": [ { "applicationPortProfile": null, "appliedTo": null, "description": null, "dnatExternalPort": null, "enabled": true, "externalAddresses": "192.168.31.102", "firewallMatch": "MATCH_INTERNAL_ADDRESS", "id": "d7496134-248a-428a-95de-3d3323ae9daa", "internalAddresses": "10.0.1.100", "logging": false, "name": "dnat-01", "priority": 0, "ruleType": "DNAT", "snatDestinationAddresses": null, "systemRule": false, "type": "DNAT", "version": { "version": 0 } }, { "applicationPortProfile": null, "appliedTo": null, "description": null, "dnatExternalPort": null, "enabled": true, "externalAddresses": "192.168.31.101", "firewallMatch": "MATCH_INTERNAL_ADDRESS", "id": "a7d04cb5-b5f1-4fdd-b5ef-2adba00680ec", "internalAddresses": "10.0.0.0/16", "logging": false, "name": "snat-01", "priority": 0, "ruleType": "SNAT", "snatDestinationAddresses": null, "systemRule": false, "type": "SNAT", "version": { "version": 0 } } ] } PLAY RECAP ******************************************************************************************************* localhost : ok=6 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
4. NAT ルールの作成
今回は、DNAT ルールを作成します。戻り通信で必要になる SNAT ルールは、すでにこれまでのラボ構築で設定してあります。
4-1. Ansible Playbook の用意
Edge Gateway NAT Rule の API リファレンスは、下記のあたりです。
- https://developer.vmware.com/apis/vmware-cloud-director/v37.1/edge-gateway-nat-rules/
- https://developer.vmware.com/apis/vmware-cloud-director/v37.1/edge-gateway-nat-rule/
下記のように Playbook の YAML ファイルを作成しておきます。
- NAT ルールを作成する Edge Gateway は「org-01-edge-01」
- NAT ルールの種類は DNAT
- NAT ルール名は「dnat-103」
- 変換するアドレスは、192.168.31.103 → 10.0.6.100
- すでに同名のルールが作成されていたらスキップします。
4-2. Ansible Playbook の実行
Playbook を実行すると、NAT ルールが作成されます。
$ ansible-playbook demo_add_nat-rule.yml
テナント ポータルを画面更新すると、作成された DNAT ルールが表示されます。
dnat-103 の設定編集画面を開くと、Playbook で指定したとおりのパラメータが入力されています。
5. NAT ルールの削除
NAT ルールの削除では、NAT Rule ID を指定して DELETE メソッドを送信します。
5-1. Ansible Playbook の用意
下記のように Playbook の YAML ファイルを作成しておきます。
5-2. Ansible Playbook の実行
Playbook を実行すると、DNAT ルール「dnat-103」が削除されるはずです。
$ ansible-playbook demo_delete_nat-rule.yml
以上、Ansible で VCD の NSX-T Edge Gateway NAT ルールを操作してみる話でした。
まとめはこちら。