本节介绍了如何安装、配置和使用 NSX Advanced Load Balancer Go SDK 包,以满足各种自动化要求。

NSX Advanced Load Balancer Go SDK 是一种 Go 包,可提供其他 API 以便与 NSX Advanced Load Balancer REST API 进行通信。NSX Advanced Load Balancer Go SDK 包还提供实用程序,这些实用程序可用于简化和自动执行 NSX Advanced Load Balancer 控制器 上的负载均衡配置。以下是 NSX Advanced Load Balancer Go SDK 包的基本功能:

  • 使用 NSX Advanced Load Balancer 会话类并提供实用程序,以简化与 NSX Advanced Load Balancer 控制器 的集成。

  • 在不同的 API 会话调用中,帮助进行会话身份验证并保留会话缓存,以避免发生多次连接和断开情况。

  • NSX Advanced Load Balancer 控制器 自动更新会话 Cookie 和 CSRF 令牌,并为 NSX Advanced Load Balancer 对象提供帮助程序 API 和模板。

  • 处理 X-AVI-TENANT(租户)标头,并提供常见负载均衡示例的示例源代码。

SDK 目录

NSX Advanced Load Balancer Go SDK 包是用于进行 NSX Advanced Load Balancer 控制器 配置的 Go SDK 源。无需下载包。Go 将负责处理包安装。

以下是一些重要的 NSX Advanced Load Balancer Go SDK 目录:

  1. examples:Go 示例位于 go/examples 目录中。create_vs.go 提供了用于在 NSX Advanced Load Balancer 控制器 上进行以下配置的自动化示例:

    • 创建会话

    • 连接到 NSX Advanced Load Balancer 控制器 的通用客户端

    • 创建具有一个服务器的池,创建 SSL 虚拟服务,并按名称获取对象

  2. clients:包含使用 NSX Advanced Load Balancer 会话类在 Go SDK 与 NSX Advanced Load Balancer 控制器 之间建立连接的 NSX Advanced Load Balancer 客户端。每个资源都有其用于建立连接的客户端。

  3. session:包含用于 NSX Advanced Load Balancer 会话的 REST API 调用的所有通用代码,以及 REST API 调用中的帮助程序例程。此目录会为指定资源创建和维护会话。

  4. models:包含捕获 API 响应所需的所有模型。这些模型是用于获取和存储相应 NSX Advanced Load Balancer REST API 调用的数据的结构。

必备条件

必须先安装 Go Lang 包,然后再安装 NSX Advanced Load Balancer Go SDK 包。要安装 Go Lang 包,请参阅 Go Lang 安装

有关 Go 编程语言的更多信息,请参阅 Go Lang 文档

安装 NSX Advanced Load Balancer Go SDK 包

以下是安装 NSX Advanced Load Balancer Go SDK 包的语法:

$ mkdir -p src/github.com/avinetworks/
$ cd src/github.com/avinetworks/
$ git clone https://github.com/avinetworks/sdk.git
#GOPATH will be path till src dir.
$ export GOPATH=~/src

用例

要创建会话、池和基本虚拟服务 (my-test-vs),请执行 create_vs.go 文件。在执行此脚本之前,请在 create_vs.go 文件中指定 NSX Advanced Load Balancer 控制器 IP 地址、用户名、密码和租户。

导入 NSX Advanced Load Balancer 会话、模型和客户端
package main

import (
	"github.com/avinetworks/sdk/go/clients"
	"github.com/avinetworks/sdk/go/models"
	"github.com/avinetworks/sdk/go/session"
	)
创建 NSX Advanced Load Balancer API 会话

以下示例语法可创建具有以下属性的会话:

  • 客户端会话 IP 地址:10.10.25.25

  • 租户:admin

  • 会话类型:不安全

aviClient, err := clients.NewAviClient("10.10.25.25", "admin",
		session.SetPassword("something"),
		session.SetTenant("admin"),
		session.SetInsecure)
创建池

以下语法可创建具有以下属性的池:

  • 池名称:my-test-pool

  • 服务器 IP 地址:10.90.20.12

pobj := models.Pool{}
pobj.Name = "my-test-pool"
serverobj := models.Server{}
serverobj.Enabled = true
serverobj.IP = &models.IPAddr{Type: "V4", Addr: "10.90.20.12"}
pobj.Servers = append(pobj.Servers, &serverobj)
npobj, err := aviClient.Pool.Create(&pobj)
if err != nil {
	fmt.Println("Pool creation failed: ", err)
	return
}
创建虚拟服务

以下语法可创建具有以下属性的虚拟服务:

  • 名称:my-test-vs

  • IP 地址:10.90.20.51

  • 端口号:80

  • 与虚拟服务关联的池:my-test-pool

vsobj := models.VirtualService{}
vsobj.Name = "my-test-vs"
vipip := models.IPAddr{Type: "V4", Addr: "10.90.20.51"}
vsobj.Vip = append(vsobj.Vip, &models.Vip{VipID: "myvip", IPAddress: &vipip})
vsobj.PoolRef = npobj.UUID
vsobj.Services = append(vsobj.Services, &models.Service{Port: 80})

nvsobj, err := aviClient.VirtualService.Create(&vsobj)
if err != nil {
	fmt.Println("VS creation failed: ", err)
	return
}
fmt.Printf("VS obj: %+v", *nvsobj)
按名称获取对象

以下示例语法可获取名称为 my-test-vs 的虚拟服务的详细信息,并提供以下输出:Cloud UUID: f39f950a-e6ca-442d-b546-fc31520991bb

var obj interface{}
err = aviClient.AviSession.GetObjectByName("virtualservice", "my-test-vs", &obj)
fmt.Printf("VS obj: %v\n", obj)

err = aviClient.AviSession.GetObject(
	"virtualservice", session.SetName("my-test-vs"), session.SetResult(&obj),
	session.SetCloudUUID("cloud-f39f950a-e6ca-442d-b546-fc31520991bb"))
fmt.Printf("VS with CLOUD_UUID obj: %v", obj)
删除虚拟服务

以下语法可使用虚拟服务的对象 ID 删除所需的虚拟服务。

aviClient.VirtualService.Delete(nvsobj.UUID)
删除池

可使用以下语法删除所需的池。

aviClient.Pool.Delete(npobj.UUID)
使用 create_vs.go 创建基本虚拟服务 (my-test-vs)
$ go run create_vs.go
衡量指标和清单 API 示例
package main

import (
	//"flag"
	"fmt"
	"github.com/avinetworks/sdk/go/clients"
	"github.com/avinetworks/sdk/go/session"
)

type MetricRequest struct {
	Step           int    `json:"step"`
	Limit          int    `json:"limit"`
	EntityUUID     string `json:"entity_uuid"`
	MetricID       string `json:"metric_id"`
	IncludeName    string `json:"include_name"`
	IncludeRefs    string `json:"include_refs"`
	PadMissingData string `json:"pad_missing_data"`
}

type Metrics struct {
	MetricRequests []MetricRequest `json:"metric_requests"`
}

func main() {
	// Create a session and a generic client to Avi Controller
	aviClient, err := clients.NewAviClient("10.10.25.42", "admin",
		session.SetPassword(""),
		session.SetTenant("admin"),
		session.SetInsecure)
	if err != nil {
		fmt.Println("Couldn't create session: ", err)
		return
	}
	mr := MetricRequest{Step: 1, Limit: 1, EntityUUID: "*", MetricID: "l7_server.max_concurrent_sessions", IncludeName: "True", IncludeRefs: "True", PadMissingData: "False"}
	sr := []MetricRequest{}
	sr = append(sr, mr)
	req := Metrics{MetricRequests: sr}
	path := "/api/analytics/metrics/collection"
	var rsp interface{}
	aviClient.AviSession.Post(path, req, &rsp)
	fmt.Printf("response %v\n", rsp)
}

编译

可使用以下语法编译 NSX Advanced Load Balancer Go SDK 包。

$ go build -o /usr/bin/create_vs create_vs.go

将 Go SDK 包集成到第三方代码中

NSX Advanced Load Balancer Go SDK 包还可以与任何第三方 Go 代码包相集成。以下是将 NSX Advanced Load Balancer Go SDK 包导入第三方 Go 代码包的示例。

import
 (
	"github.com/avinetworks/sdk/go/clients"
	"github.com/avinetworks/sdk/go/session"

以下是 Terraform 提供程序的 vendor.json 文件的示例条目:

"package": [ {
		"path": "github.com/avinetworks/sdk/go/clients",
		"revision": "796ddcccdc37a5a9771bfbb716b159ae5c9b4b11",
		"revisionTime": "2018-04-06T16:51:27.185773",
		"version": "18.1.3",
		"versionExact": "18.1.3"
	},
	{
		"path": "github.com/avinetworks/sdk/go/session",
		"revision": "796ddcccdc37a5a9771bfbb716b159ae5c9b4b11",
		"revisionTime": "2018-04-06T16:51:27.185773",
		"version": "18.1.3",
		"versionExact": "18.1.3"
	} ]

附加信息

NSX Advanced Load Balancer Go SDK 包的 GitHub 位置:https://github.com/avinetworks/sdk/tree/master/go