NTNX>日記

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

Nutanix Flow で vNIC 遮断自動化くん。(Nutanix CE / REST API 編)

この投稿は、[4枚目]Nutanix Advent Calendar 2019 の 9日目です。

以前の投稿で、Nutanix CE + Prism Central 環境の Nutanix Flow での vNIC の通信を遮断してみました。今回は、GUI の代わりに REST API + Python で同じ遮断をしてみます。

今回の環境

今回 Python スクリプトを実行した環境です。

$ cat /etc/oracle-release
Oracle Linux Server release 7.7
$ python -V
Python 2.7.5

Nutanix CE と Prism Central の環境は、下記と同様です。

今回のスクリプト

demo-flow-quaratine.py

gist.github.com

実行前の VM の確認

今回は、VM「vm01」を隔離して、通信遮断してみます。Prism Central から見た遮断前の VMの様子です。まだ隔離マークがついていません。

f:id:gowatana:20191209225426p:plain

Nutanix CE の CVM にログインして、acli vm.list コマンドで vm01 の UUID を確認しておきます。

CVM$ acli vm.list
VM name  VM UUID
vm01     f431c783-ead8-46ba-b449-f4bf6cd86e8c
vm02     5d4be2ef-6d28-42e8-ab42-f3446126bc1e

下記のように、VM の UUID を REST API で取得することもできます。
(今回と方法がそろってませんが・・・)

スクリプトの実行

ログイン情報を記載した JSON ファイルを作成しておきます。192.168.20.16 は今回の Prism Central の IP アドレスです。

Linux$ cat ./login.json
{
    "prism_address": "192.168.20.16",
    "user_name": "admin",
    "password": "パスワード"
}

スクリプトを下記のように実行します。VM-UUID には vm01 の UUID、

Linux$ python ./demo-flow-quaratine.py ./login.json <VM-UUID> <on か off>

実行すると、下記のように設定するつもりの JSON(Config ---------- 以降)と、設定後の VM から取得した JSON(Return ---------- 以降)が表示されます。
実際には VM に、JSON 末尾の方にある「"Quarantine": "Default"」カテゴリ追加/削除しているだけです。

Linux$ python ./demo-flow-quaratine.py ./login.json f431c783-ead8-46ba-b449-f4bf6cd86e8c on
Config ----------
{
  "spec": {
    "name": "vm01",
    "resources": {
      "num_threads_per_core": 1,
      "vnuma_config": {
        "num_vnuma_nodes": 0
      },
      "serial_port_list": [],
      "nic_list": [
        {
          "nic_type": "NORMAL_NIC",
          "uuid": "8fa8117d-fb56-4a2d-8b17-1153cc56bfa1",
          "ip_endpoint_list": [
            {
              "ip": "192.168.20.132",
              "type": "ASSIGNED"
            }
          ],
          "mac_address": "50:6b:8d:58:32:dd",
          "subnet_reference": {
            "kind": "subnet",
            "name": "vlan-0-ipam",
            "uuid": "c5afa215-90d4-406c-a489-90407e29f85f"
          },
          "is_connected": true
        }
      ],
      "num_vcpus_per_socket": 1,
      "num_sockets": 1,
      "gpu_list": [],
      "memory_size_mib": 1024,
      "power_state": "ON",
      "hardware_clock_timezone": "UTC",
      "power_state_mechanism": {
        "guest_transition_config": {
          "should_fail_on_script_failure": false,
          "enable_script_exec": false
        },
        "mechanism": "HARD"
      },
      "vga_console_enabled": true,
      "disk_list": [
        {
          "data_source_reference": {
            "kind": "image",
            "uuid": "0e228e1b-a8df-4c1d-92a0-b00dfccdd213"
          },
          "device_properties": {
            "device_type": "DISK",
            "disk_address": {
              "device_index": 0,
              "adapter_type": "SCSI"
            }
          },
          "uuid": "a2984b2e-ef34-46cc-81fc-16acc00617d6",
          "disk_size_bytes": 8589934592,
          "disk_size_mib": 8192
        },
        {
          "device_properties": {
            "device_type": "CDROM",
            "disk_address": {
              "device_index": 3,
              "adapter_type": "IDE"
            }
          },
          "uuid": "41beb19e-d760-4d2a-be77-81fadc573554",
          "disk_size_bytes": 382976,
          "disk_size_mib": 1
        },
        {
          "device_properties": {
            "device_type": "CDROM",
            "disk_address": {
              "device_index": 0,
              "adapter_type": "IDE"
            }
          },
          "uuid": "b3422531-fca0-4c6d-9eaf-2775e385cd00"
        }
      ]
    },
    "cluster_reference": {
      "kind": "cluster",
      "name": "lab-ntnx-01",
      "uuid": "00059788-a2b4-4e5f-1a6e-005056b688d2"
    }
  },
  "api_version": "3.1",
  "metadata": {
    "kind": "vm",
    "uuid": "f431c783-ead8-46ba-b449-f4bf6cd86e8c",
    "project_reference": {
      "kind": "project",
      "name": "default",
      "uuid": "eb8a8aaa-5ab0-48d7-8a1f-82309f8f4f2e"
    },
    "creation_time": "2019-11-22T12:38:41Z",
    "spec_version": 24,
    "owner_reference": {
      "kind": "user",
      "uuid": "00000000-0000-0000-0000-000000000000",
      "name": "admin"
    },
    "categories": {
      "Quarantine": "Default"
    }
  }
}
Return ----------
{
  "status": {
    "state": "PENDING",
    "execution_context": {
      "task_uuid": "80ec97a0-1b7a-4ec0-98d0-f0cee9be76f2"
    }
  },
  "spec": {
    "name": "vm01",
    "resources": {
      "num_threads_per_core": 1,
      "vnuma_config": {
        "num_vnuma_nodes": 0
      },
      "serial_port_list": [],
      "nic_list": [
        {
          "nic_type": "NORMAL_NIC",
          "uuid": "8fa8117d-fb56-4a2d-8b17-1153cc56bfa1",
          "ip_endpoint_list": [
            {
              "ip": "192.168.20.132",
              "type": "ASSIGNED"
            }
          ],
          "mac_address": "50:6b:8d:58:32:dd",
          "subnet_reference": {
            "kind": "subnet",
            "name": "vlan-0-ipam",
            "uuid": "c5afa215-90d4-406c-a489-90407e29f85f"
          },
          "is_connected": true
        }
      ],
      "num_vcpus_per_socket": 1,
      "num_sockets": 1,
      "gpu_list": [],
      "memory_size_mib": 1024,
      "power_state": "ON",
      "hardware_clock_timezone": "UTC",
      "power_state_mechanism": {
        "guest_transition_config": {
          "should_fail_on_script_failure": false,
          "enable_script_exec": false
        },
        "mechanism": "HARD"
      },
      "vga_console_enabled": true,
      "disk_list": [
        {
          "data_source_reference": {
            "kind": "image",
            "uuid": "0e228e1b-a8df-4c1d-92a0-b00dfccdd213"
          },
          "device_properties": {
            "device_type": "DISK",
            "disk_address": {
              "device_index": 0,
              "adapter_type": "SCSI"
            }
          },
          "uuid": "a2984b2e-ef34-46cc-81fc-16acc00617d6",
          "disk_size_bytes": 8589934592,
          "disk_size_mib": 8192
        },
        {
          "device_properties": {
            "device_type": "CDROM",
            "disk_address": {
              "device_index": 3,
              "adapter_type": "IDE"
            }
          },
          "uuid": "41beb19e-d760-4d2a-be77-81fadc573554",
          "disk_size_bytes": 382976,
          "disk_size_mib": 1
        },
        {
          "device_properties": {
            "device_type": "CDROM",
            "disk_address": {
              "device_index": 0,
              "adapter_type": "IDE"
            }
          },
          "uuid": "b3422531-fca0-4c6d-9eaf-2775e385cd00"
        }
      ]
    },
    "cluster_reference": {
      "kind": "cluster",
      "name": "lab-ntnx-01",
      "uuid": "00059788-a2b4-4e5f-1a6e-005056b688d2"
    }
  },
  "api_version": "3.1",
  "metadata": {
    "kind": "vm",
    "uuid": "f431c783-ead8-46ba-b449-f4bf6cd86e8c",
    "project_reference": {
      "kind": "project",
      "name": "default",
      "uuid": "eb8a8aaa-5ab0-48d7-8a1f-82309f8f4f2e"
    },
    "creation_time": "2019-11-22T12:38:41Z",
    "spec_version": 25,
    "spec_hash": "ccefc53eb6b26c85cc864e9b7eaecde1d4fe72b2",
    "owner_reference": {
      "kind": "user",
      "name": "admin",
      "uuid": "00000000-0000-0000-0000-000000000000"
    },
    "categories": {
      "Quarantine": "Default"
    }
  }
}

隔離した VM の様子

Prism Central で Web ブラウザを更新すると、対象の VM に隔離マークがついたことが確認できるはずです。VM の通信が遮断されているはずです。

f:id:gowatana:20191209230640p:plain

そして、スクリプト実行時の末尾のオプションを「off」(実は on 以外)にすると、「"Quarantine": "Default"」カテゴリが削除されて、隔離が解除できるはずです。

以上。

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