この投稿は、[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
実行前の VM の確認
今回は、VM「vm01」を隔離して、通信遮断してみます。Prism Central から見た遮断前の VMの様子です。まだ隔離マークがついていません。

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 の通信が遮断されているはずです。

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