vm.gowatana.jp

NEOにほんごVMware(仮)

VMware Cloud Director 10.4 を Ansible で操作してみる。Part-05 Edge Gateway NAT ルールの作成 / 削除

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 ヘッダで指定します。

gist.github.com

 

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 リファレンスは、下記のあたりです。

 

下記のように Playbook の YAML ファイルを作成しておきます。

  • NAT ルールを作成する Edge Gateway は「org-01-edge-01」
  • NAT ルールの種類は DNAT
  • NAT ルール名は「dnat-103」
  • 変換するアドレスは、192.168.31.103 → 10.0.6.100
  • すでに同名のルールが作成されていたらスキップします。

gist.github.com

 

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 ファイルを作成しておきます。

gist.github.com

 

5-2. Ansible Playbook の実行

Playbook を実行すると、DNAT ルール「dnat-103」が削除されるはずです。

$ ansible-playbook demo_delete_nat-rule.yml

 

以上、Ansible で VCD の NSX-T Edge Gateway NAT ルールを操作してみる話でした。

まとめはこちら。