Après 3 parties très orientées sur l’interface graphique de NSX-T, je vous propose cette fois-ci un petit tour d’horizon de l’API ReST, grande richesse de NSX-T, s’il en est.
De notre coté, et pour le moment, nous allons utiliser en priorité les APIs pour la supervision des composants de notre nouvelle infrastructure. Pour autant, il est évidemment possible de piloter entièrement NSX-T par la programmation. Nous allons d’ailleurs commencer à nous former et progresser sur cet aspect en utilisant Ansible, mais c’est un autre sujet ! (j’y reviendrai dans un prochain billet, d’ici quelques semaines/mois).
En attendant, voici un florilège des requests que nous allons exploiter de manière pragmatique pour le moment. Aujourd’hui, point de syntaxe compliquée, nous utiliserons directement le bon vieux curl (promis, Timo, je regarde httpie dès que possible ^^) accompagné de “jq”, un outil en ligne de commande bien pratique pour parser une sortie JSON.
Pour ce qui est du management cluster (les appliances NSX Manager), voici une liste d’URL que vous pouvez utiliser pour interroger l’état de divers services :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
https://managervip.yoyodyne.fr/api/v1/cluster/status https://managervip.yoyodyne.fr/api/v1/cluster/nodes/status https://managervip.yoyodyne.fr/api/v1/node/services/cluster_manager/status https://managervip.yoyodyne.fr/api/v1/node/services/cm-inventory/status https://managervip.yoyodyne.fr/api/v1/node/services/ui-service/status https://managervip.yoyodyne.fr/api/v1/node/services/mgmt-plane-bus/status https://managervip.yoyodyne.fr/api/v1/node/services/ssh/status https://managervip.yoyodyne.fr/api/v1/node/services/node-mgmt/status https://managervip.yoyodyne.fr/api/v1/node/services/http/status https://managervip.yoyodyne.fr/api/v1/node/services/nsx-message-bus/status https://managervip.yoyodyne.fr/api/v1/node/services/manager/status https://managervip.yoyodyne.fr/api/v1/capacity/usage https://managervip.yoyodyne.fr/api/v1/transport-zones/transport-node-status |
On y trouve notamment un moyen d’obtenir rapidement l’état général de votre cluster de management :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
[cedric]@supervisioneur:~$ curl -H 'authorization: Basic XXXXXXXX' -sk "https://managervip.yoyodyne.fr/api/v1/cluster/status" { "cluster_id" : "54ce15f9-81fe-4c16-ba2b-3facc1852e0f", "mgmt_cluster_status" : { "status" : "STABLE", "online_nodes" : [ { "uuid" : "d3e23042-bfdf-1cb5-a174-b62d4192e99e", "mgmt_cluster_listen_ip_address" : "172.27.XXX.1" }, { "uuid" : "6ef4e2c6-4044-448b-8f47-1b9fe3118817", "mgmt_cluster_listen_ip_address" : "172.27.XXX.2" }, { "uuid" : "e4c0ad0d-bede-4004-9330-ea3314f35fc4", "mgmt_cluster_listen_ip_address" : "172.27.XXX.3" } ] }, "control_cluster_status" : { "status" : "STABLE" } } [cedric]@supervisioneur:~$ curl -H 'authorization: Basic XXXXXXXX' -sk "https://managervip.yoyodyne.fr/api/v1/cluster/status" | jq '.mgmt_cluster_status.status' "STABLE" [cedric]@supervisioneur:~$ |
Vous noterez que l’authentification est réalisé avec la méthode “Basic” qui consiste à encoder en base64 le user et son password sous la forme “USER:PASSWORD”. On peut également obtenir l’état complet de l’ensemble des transport nodes (edges nodes et compute nodes) via une simplement commande :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[cedric]@supervisioneur:~$ curl -H 'authorization: Basic XXXXXXXX' -sk "https://managervip.yoyodyne.fr/api/v1/transport-zones/transport-node-status" | jq '.results[] | .node_display_name, .status' "nsxedgeprd1" "UP" "nsxedgeprd2" "UP" "esx01.yoyodyne.fr" "UP" "esx02.yoyodyne.fr" "UP" (...) "esx20.yoyodyne.fr" "UP" [cedric]@supervisioneur:~$ |
Vous pouvez aussi interroger en détail un transport node pour obtenir son état complet, en rajoutant son ID dans l’URL :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
[cedric]@supervisioneur:~$ curl -H 'authorization: Basic XXXXXXXX' -sk "https://managervip.yoyodyne.fr/api/v1/transport-nodes/51ec1630-d6f3-46e9-8c28-ae7be537d072" { "node_id" : "51ec1630-d6f3-46e9-8c28-ae7be537d072", "host_switches" : [ { "host_switch_name" : "nvdsprd", "host_switch_profile_ids" : [ (...) ], "pnics" : [ { "device_name" : "vmnic2", "uplink_name" : "uplink-1" }, { "device_name" : "vmnic3", "uplink_name" : "uplink-2" } ], "static_ip_pool_id" : "1da64034-515b-4e5e-8e21-cbdddacb33a5" } ], "host_switch_spec" : { "host_switches" : [ { "host_switch_name" : "nvdsprd", "host_switch_profile_ids" : [ (...) ], "is_migrate_pnics" : false, "ip_assignment_spec" : { "ip_pool_id" : "1da64034-515b-4e5e-8e21-cbdddacb33a5", "resource_type" : "StaticIpPoolSpec" }, "cpu_config" : [ ], "vmk_install_migration" : [ ], "pnics_uninstall_migration" : [ ], "vmk_uninstall_migration" : [ ], "not_ready" : false } ], "resource_type" : "StandardHostSwitchSpec" }, "transport_zone_endpoints" : [ { "transport_zone_id" : "5b8536c4-34ee-44e5-9e5f-4bdefe3730be", "transport_zone_profile_ids" : [ { "resource_type" : "BfdHealthMonitoringProfile", "profile_id" : "52035bb3-ab02-4a08-9884-18631312e50a" } ] }, { "transport_zone_id" : "33566d34-2f85-4953-9bc2-b6bc0568d846", "transport_zone_profile_ids" : [ { "resource_type" : "BfdHealthMonitoringProfile", "profile_id" : "52035bb3-ab02-4a08-9884-18631312e50a" } ] } ], "maintenance_mode" : "DISABLED", "node_deployment_info" : { "os_type" : "ESXI", "os_version" : "6.7.0", "managed_by_server" : "172.27.xxx.xxx", "discovered_node_id" : "85a02929-e6c0-4362-89db-d216a7d31d97:host-1117893", "resource_type" : "HostNode", "id" : "51ec1630-d6f3-46e9-8c28-ae7be537d072", "display_name" : "esx12.yoyodyne.fr", "external_id" : "51ec1630-d6f3-46e9-8c28-ae7be537d072", "fqdn" : "esx12.yoyodyne.fr", "ip_addresses" : [ "172.27.150.12", "169.254.198.30" ], "discovered_ip_addresses" : [ (...) ], "_create_user" : "admin", "_create_time" : 1558440629859, "_last_modified_user" : "admin", "_last_modified_time" : 1558440629859, "_protection" : "NOT_PROTECTED", "_revision" : 0 }, "is_overridden" : false, "resource_type" : "TransportNode", "id" : "51ec1630-d6f3-46e9-8c28-ae7be537d072", "display_name" : "esx12.yoyodyne.fr", "_create_user" : "admin", "_create_time" : 1558440641512, "_last_modified_user" : "system", "_last_modified_time" : 1558521953617, "_system_owned" : false, "_protection" : "NOT_PROTECTED", "_revision" : 2 } [cedric]@supervisioneur:~$ |
On peut aussi récupérer l’état général du edge cluster (regroupant les deux edge nodes) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
[cedric]@supervisioneur:~$ curl -H 'authorization: Basic XXXXXXXX' -sk "https://managervp.yoyodyne.fr/api/v1/edge-clusters/" | jq '.results[]' { "deployment_type": "VIRTUAL_MACHINE", "members": [ { "member_index": 0, "transport_node_id": "e7e904e9-1943-46f0-880f-627c4386487c" }, { "member_index": 1, "transport_node_id": "e3da0c77-7727-4881-be9d-a7a9c865db2b" } ], "cluster_profile_bindings": [ { "resource_type": "EdgeHighAvailabilityProfile", "profile_id": "33a9c0e9-6823-4e1f-ad3a-951d37d613e0" } ], "member_node_type": "EDGE_NODE", "resource_type": "EdgeCluster", "id": "3d1f1dba-17d2-4852-866a-d6842c71c3db", "display_name": "edgecluster-ght", "description": "Edge Cluster GHT", "tags": [], "_create_user": "admin", "_create_time": 1558442020556, "_last_modified_user": "admin", "_last_modified_time": 1558445013257, "_system_owned": false, "_protection": "NOT_PROTECTED", "_revision": 2 } [cedric]@supervisioneur:~$ curl -H 'authorization: Basic XXXXXXXX' -sk "https://managervip.yoyodyne.fr/api/v1/edge-clusters/3d1f1dba-17d2-4852-866a-d6842c71c3db/status?source=realtime" { "edge_cluster_id" : "3d1f1dba-17d2-4852-866a-d6842c71c3db", "member_status" : [ { "transport_node" : { "target_id" : "e3da0c77-7727-4881-be9d-a7a9c865db2b", "is_valid" : true }, "status" : "UP" }, { "transport_node" : { "target_id" : "e7e904e9-1943-46f0-880f-627c4386487c", "is_valid" : true }, "status" : "UP" } ], "last_update_timestamp" : 1559311766619, "edge_cluster_status" : "UP" } [cedric]@supervisioneur:~$ curl -H 'authorization: Basic XXXXXXXX' -sk "https://managervip.yoyodyne.fr/api/v1/edge-clusters/3d1f1dba-17d2-4852-866a-d6842c71c3db/status?source=realtime" | jq '.edge_cluster_status' "UP" [cedric]@supervisioneur:~$ |
Toujours au chapitre de la consultation, vous pouvez récupérer la liste et les propriétés de tous les composants que vous voulez au sein de NSX-T. Ici un listing simple des routeurs logiques :
1 2 3 4 5 6 7 8 |
[cedric]@supervisioneur:~$ curl -H 'authorization: Basic XXXXXXXX' -sk "https://managervip.yoyodyne.fr/api/v1/logical-routers" | jq '.results[] | .router_type, .display_name' "TIER1" "t1-yoyodyne" "TIER1" "t1-obiwankenobi" "TIER0" "tier0-heberg" [cedric]@supervisioneur:~$ |
Plus intéressant, étant donné qu’il n’existe pas – encore – de section spécifique sur l’interface d’admin pour gérer les tags en direct, vous pouvez récupérer tous les tags utilisés dans vos NS Groups. Cela vous permet au moins de faire l’inventaire de ceux que vous êtes sensés exploiter dans votre tagging de VM, par exemple, pour vos politiques de sécurité :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[cedric]@supervisioneur:~$ curl -H 'authorization: Basic XXXXXXXX' -sk "https://managervip.yoyodyne.fr/api/v1/ns-groups" | jq '.results[] | .resource_type, .display_name' "NSGroup" "ServiceInsertion_NSGroup" "NSGroup" "default.sg-fullip" "NSGroup" "default.sg-linux" "NSGroup" "default.sg-quarantaine" "NSGroup" "default.sg-windows" [cedric]@supervisioneur:~$ curl -H 'authorization: Basic XXXXXXXX' -sk "https://managervip.yoyodyne.fr/api/v1/ns-groups" | jq '.results[] | .tags' | grep tag "tag": "/infra/domains/default/groups/sg-fullaccess" "tag": "/infra/domains/default/groups/sg-linux" "tag": "/infra/domains/default/groups/sg-quarantaine" "tag": "/infra/domains/default/groups/sg-windows" [cedric]@supervisioneur:~$ |
Au final, comme la plupart des API REST récentes, l’accès aux fonctions NSX-T est relativement simple et ne nécessite pas d’expertise particulière en développement, dans un premier temps tout du moins. Pour votre info, vous trouverez la documentation complète chez VMware à cette adresse.
Pour info, la doc de l’API est fourni au format OpenAPI, ca permet de l’intégrer dans Postman par exemple ou son propre swagger, très pratique. En verion yaml ou json : /api/v1/spec/openapi/nsx_api.yaml ou /api/v1/spec/openapi/nsx_api.json
Merci Joffrey ! Effectivement, bien pratique avec Postman :)
Yep, j’allais le dire: http://cloudmaniac.net/nsx-t-api-embedded-documentation-and-postman-collection/