Nutanix CE(AHV)から、Nutanix REST API v2 で IP アドレスの情報を取得してみます。
リファレンスは、下記のあたりにあります。
- v2 API: Get list of networks. - /networks - API REFERENCE - Home
-
v3 API: Get a list of existing subnets - subnets - API REFERENCE - Home
今回の内容です。
環境について
- Nutanix CE(ce-2020.09.16-stable)
- ハイパーバイザは AHV
- クライアントは curl + jq(Linux から実行)
接続先情報の指定
今回は、あらかじめ下記情報を変数に代入しています。
- PRISM: Prism Element のアドレス。(CVM or Cluster VIP)
- USER: Prism ユーザ
- PASS: Prism ユーザのパスワード
$ PRISM=lab-nxce-01.go-lab.jp $ USER=admin $ PASS='nutanix/4u'
それでは、情報取得をしてみます。
IPAM 機能による IP アドレス プールの取得
AHV のネットワークには IP アドレス管理(IPAM)機能があり、VM への IP アドレスの割り当てや、IP プールの作成ができます。
あらかじめ Prism で、AHV のネットワークをいくつか作成してあります。
そしてネットワークには、IPAM で、IP アドレス プールを作成してあります。
v2 API の GET /networks では、次のように IP プールのレンジを取得できます。
- AHV のネットワーク名は一意ではないので、UUID も取得してみました。
- nw-vlan-20 ネットワークは IPAM / IP プールの設定なしです。
- nw-vlan-13 には IP プールが2つ設定されています。
$ curl -k -s -u "$USER:$PASS" "https://$PRISM:9440/PrismGateway/services/rest/v2.0/networks/" | jq -r '.entities[] | [ .name, .uuid, .ip_config.pool ]' [ "nw-vlan-20", "ec0ced9c-0a64-47d2-9712-22c1835cf529", [] ] [ "nw-vlan-11", "90a388c2-fbfd-4ca1-aead-35a1611f7862", [ { "range": "192.168.11.100 192.168.11.199" } ] ] [ "nw-vlan-13", "c07f9ec2-a29d-4f90-8113-76b499d49148", [ { "range": "192.168.13.10 192.168.13.19" }, { "range": "192.168.13.30 192.168.13.39" } ] ]
ちなみに、Prism Central 経由であれば v3 API がおすすめで、同様の情報は次のように取得できます。
- URL での $PRISM は、Prism Central にしてあります。
- 複数の Prism Element が管理対象となりうるので、クラスタ名(lab-nxce-01)も取得してみました。
$ curl -k -s -u "$USER:$PASS" -X POST -H "Content-Type: application/json" -H "Accept: application/json" -d "{}" "https://lab-nxpc-01.go-lab.jp:9440/api/nutanix/v3/subnets/list" | jq -r '.entities[] | [ .spec.cluster_reference.name, .spec.name, .metadata.uuid, .spec.resources.ip_config.pool_list]' [ "lab-nxce-01", "nw-vlan-20", "ec0ced9c-0a64-47d2-9712-22c1835cf529", null ] [ "lab-nxce-01", "nw-vlan-11", "90a388c2-fbfd-4ca1-aead-35a1611f7862", [ { "range": "192.168.11.100 192.168.11.199" } ] ] [ "lab-nxce-01", "nw-vlan-13", "c07f9ec2-a29d-4f90-8113-76b499d49148", [ { "range": "192.168.13.10 192.168.13.19" }, { "range": "192.168.13.30 192.168.13.39" } ] ]
割り当てられた IP アドレスの取得(VM から)
VM の IP アドレスは、v2 API の GET /vms/ から取得できます。vNIC の情報を取得するため、クエリ パラメータとして include_vm_nic_config=true を追加しています。
ここでは、IPAM 以外で設定された(手動設定や外部 DHCP サーバなどによる)IP アドレスも含まれます。
$ curl -k -s -u "$USER:$PASS" "https://$PRISM:9440/PrismGateway/services/rest/v2.0/vms/?include_vm_nic_config=true" | jq -r '.entities[] | [ .name, .uuid, .vm_nics[].ip_address ]' [ "lab-nxpc-01", "5fc2057e-bd99-4835-9b2f-4f5512daaf6c", "192.168.20.15" ] [ "test-vm-02", "82c95111-72bf-4c4d-b22e-cc6294b6fc94", "192.168.13.17" ] [ "test-vm-01", "8dba6b27-285e-4b9b-b55e-25a495eda089", "192.168.13.36" ] [ "test-web-01", "a13fb7cf-f22d-4ec1-8f9a-888b51f8a9e7", "192.168.11.177", "192.168.1.16" ]
IP アドレス(例では 192.168.1.16)から、VM を特定してみました。
$ curl -k -s -u "$USER:$PASS" "https://$PRISM:9440/PrismGateway/services/rest/v2.0/vms/?include_vm_nic_config=true" | jq -r '.entities[] | select(.vm_nics[].ip_address == "192.168.1.16") | [.name, .uuid, .vm_nics[].ip_address]' [ "test-web-01", "a13fb7cf-f22d-4ec1-8f9a-888b51f8a9e7", "192.168.11.177", "192.168.1.16" ]
ちなみに、test-web-01 VM は、Prism でも IP アドレスが 3つ付与されていることが分かります。
vNIC 情報は、絞らずに取得してみると次のようになっています。この VM には、いくつか実験的な設定をしてあります。
- 192.168.11.177 は、IPAM の IP プールから vNIC#1 に割り当てられた IP です。なぜか 192.168.11.177 が2つ出力されますが・・・
- 192.168.11.201 は、ゲスト OS にログインして vNIC#1 に手動追加した IP アドレスです。
- 192.168.1.16 は、IPAM を利用していないネットワークに接続した vNIC#2 に、外部 DHCP から割り当てられた IP です。
$ curl -k -s -u "$USER:$PASS" "https://$PRISM:9440/PrismGateway/services/rest/v2.0/vms/?include_vm_nic_config=true" | jq -r '.entities[] | select(.name == "test-web-01") | .vm_nics[]' { "mac_address": "50:6b:8d:c3:d5:63", "network_uuid": "90a388c2-fbfd-4ca1-aead-35a1611f7862", "nic_uuid": "ff6d1530-1955-489f-99e9-e938758f7357", "model": "", "ip_address": "192.168.11.177", "ip_addresses": [ "192.168.11.177", "192.168.11.177", "192.168.11.201" ], "requested_ip_address": "192.168.11.177", "vlan_mode": "Access", "is_connected": true } { "mac_address": "50:6b:8d:f8:59:2a", "network_uuid": "a36cf03a-5367-4bcd-9e9e-ed1f5c851b2b", "nic_uuid": "3a8f6fad-23bf-426f-bfe7-234cda813add", "model": "", "ip_address": "192.168.1.16", "ip_addresses": [ "192.168.1.16" ], "vlan_mode": "Access", "is_connected": true }
割り当てられた IP アドレスの取得(ネットワークから)
IPAM から割り当てられた IP アドレスは、ネットワーク単位で確認することもできます。
まずネットワーク UUID を取得しておきます。
$ UUID_LIST=$(curl -k -s -u "$USER:$PASS" "https://$PRISM:9440/PrismGateway/services/rest/v2.0/networks/" | jq -r '.entities[] | .uuid')
そして、GET /networks/$UUID/addresses で割り当て済みの IP アドレスを取得します。ここでの UUID は VM のものです。ただ、ここまでの例とは別タイミングで取得したので、若干 IP 割り当て状況が変わっています。
$ for UUID in $UUID_LIST; do curl -k -s -u "$USER:$PASS" "https://$PRISM:9440/PrismGateway/services/rest/v2.0/networks/$UUID/addresses" | jq -r '.entities[]'; done | jq -r '[.entity_uuid, .mac_address, .ip_address] | @csv' "5fc2057e-bd99-4835-9b2f-4f5512daaf6c","50:6b:8d:ed:4e:81", "9f61ec13-86ce-4158-81ab-d64f2b72872b","50:6b:8d:89:7b:eb","192.168.11.147" "4c9e7985-c8a0-4035-b7a9-ec91ae02d99d","50:6b:8d:ba:79:1e","192.168.11.131" "b83c7ad8-8411-44e4-9094-b7da69c17edb","50:6b:8d:ab:2f:d6","192.168.11.161" "d3341d66-3ac8-4206-b5e9-daad1bf5ad0e","50:6b:8d:bf:c1:40","192.168.11.132" "cc39fe9f-f478-4c0d-9894-de1bcdb2a44b","50:6b:8d:e9:b3:bc","192.168.11.123" "a13fb7cf-f22d-4ec1-8f9a-888b51f8a9e7","50:6b:8d:c3:d5:63","192.168.11.177" "a13fb7cf-f22d-4ec1-8f9a-888b51f8a9e7","50:6b:8d:f8:59:2a", "8dba6b27-285e-4b9b-b55e-25a495eda089","50:6b:8d:da:0f:2e","192.168.13.36" "82c95111-72bf-4c4d-b22e-cc6294b6fc94","50:6b:8d:9d:c8:78","192.168.13.17"
以上。