NTNX>日記

個人的な趣味による Nutanix Community Edition 日記。Japanese のみですみません。

Nutanix v2 API で IPAM IP プールと IP アドレスを確認してみる。(curl + jq)

Nutanix CE(AHV)から、Nutanix REST API v2 で IP アドレスの情報を取得してみます。

リファレンスは、下記のあたりにあります。

今回の内容です。

環境について

  • 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 のネットワークをいくつか作成してあります。

f:id:gowatana:20210423020312p:plain

そしてネットワークには、IPAM で、IP アドレス プールを作成してあります。

f:id:gowatana:20210423020518p:plain

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つ付与されていることが分かります。

f:id:gowatana:20210423022623p:plain

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"

以上。

©2021 gowatana
クリエイティブ・コモンズ・ライセンスこの 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。