golang基于gNMI和gNOI协议的网络管理工具集插件gNxI的使用
Golang基于gNMI和gNOI协议的网络管理工具集插件gNxI的使用
gNxI工具集
- gNMI - gRPC网络管理接口
- gNOI - gRPC网络操作接口
这是一个使用gNMI和gNOI协议的网络管理工具集合。
概述
关于这些工具的说明:
- 它们主要用于测试和作为协议的参考实现
- 默认情况下它们会记录到stderr,可以使用
-logtostderr=false
禁用 - 它们使用glog的日志级别,使用
-v 1
记录proto消息交换
gNMI客户端:
- gNMI功能查询
- gNMI获取
- gNMI设置
- gNMI订阅
gNMI目标:
- gNMI目标服务器
gNOI客户端
- gNOI证书管理
- gNOI操作系统管理
- gNOI重置
gNOI目标
- gNOI目标服务器
辅助工具
- gNOI模拟操作系统
- 证书生成器
文档
- 参见gNMI协议文档
- 参见gNOI协议文档
- 参见Openconfig文档
快速开始
这些说明将帮助你在本地机器上运行项目。
先决条件
在系统中安装go,需要golang1.14+版本。
下载源代码
go get github.com/google/gnxi
ls $GOPATH/src/github.com/google/gnxi
构建和安装二进制文件
cd $GOPATH
mkdir bin
# 这会读取go模块依赖进行安装
cd src/github.com/google/gnxi
go install ./...
ls -la $GOPATH/bin
生成证书
cd $GOPATH/bin
./../src/github.com/google/gnxi/certs/generate.sh
运行客户端
cd $GOPATH/bin
./gnoi_reset \
-target_addr localhost:9339 \
-target_name target.com \
-rollback_os \
-zero_fill \
-key client.key \
-cert client.crt \
-ca ca.crt
可选地定义$GOBIN为$GOPATH/bin并将其添加到你的路径中,以便从任何文件夹运行二进制文件。
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOBIN
免责声明
- 这不是官方的Google产品
- 参见如何贡献
更多关于golang基于gNMI和gNOI协议的网络管理工具集插件gNxI的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang基于gNMI和gNOI协议的网络管理工具集插件gNxI的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
gNxI: 基于gNMI和gNOI协议的Golang网络管理工具集
gNxI是一个基于gNMI(gRPC Network Management Interface)和gNOI(gRPC Network Operations Interface)协议的Golang工具集,用于网络设备的配置、监控和管理。下面我将介绍如何使用gNxI进行网络管理。
gNxI简介
gNMI和gNOI是OpenConfig工作组定义的基于gRPC的网络管理协议:
- gNMI用于网络配置和状态收集
- gNOI用于网络运维操作
gNxI提供了这两个协议的Golang实现,简化了网络自动化工具的开发。
安装gNxI
go get github.com/google/gnxi
基本使用示例
1. gNMI客户端示例
package main
import (
"context"
"crypto/tls"
"log"
"time"
"github.com/google/gnxi/gnmi"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
)
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
// 建立gRPC连接
conn, err := grpc.DialContext(ctx, "device-ip:9339",
grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{InsecureSkipVerify: true})))
if err != nil {
log.Fatalf("Dial failed: %v", err)
}
defer conn.Close()
// 创建gNMI客户端
client := gnmi.NewGNMIClient(conn)
// 构建GetRequest
req := &gnmi.GetRequest{
Path: []*gnmi.Path{
{
Elem: []*gnmi.PathElem{
{Name: "interfaces"},
{Name: "interface", Key: map[string]string{"name": "eth0"}},
{Name: "state"},
{Name: "counters"},
{Name: "in-octets"},
},
},
},
Encoding: gnmi.Encoding_JSON,
}
// 发送Get请求
resp, err := client.Get(ctx, req)
if err != nil {
log.Fatalf("Get failed: %v", err)
}
log.Printf("Response: %+v", resp)
}
2. gNOI系统服务操作示例
package main
import (
"context"
"crypto/tls"
"log"
"time"
"github.com/google/gnxi/gnoi"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
)
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
// 建立gRPC连接
conn, err := grpc.DialContext(ctx, "device-ip:9339",
grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{InsecureSkipVerify: true})))
if err != nil {
log.Fatalf("Dial failed: %v", err)
}
defer conn.Close()
// 创建gNOI系统服务客户端
client := gnoi.NewSystemClient(conn)
// 构建Time请求
req := &gnoi.TimeRequest{}
// 获取设备时间
resp, err := client.Time(ctx, req)
if err != nil {
log.Fatalf("Time request failed: %v", err)
}
log.Printf("Device time: %v", resp.GetTime())
}
高级功能
1. 订阅数据流(Subscribe)
func subscribeExample(client gnmi.GNMIClient) {
ctx := context.Background()
subReq := &gnmi.SubscribeRequest{
Request: &gnmi.SubscribeRequest_Subscribe{
Subscribe: &gnmi.SubscriptionList{
Mode: gnmi.SubscriptionList_STREAM,
Prefix: &gnmi.Path{Target: "router1"},
Subscription: []*gnmi.Subscription{
{
Path: &gnmi.Path{
Elem: []*gnmi.PathElem{
{Name: "interfaces"},
{Name: "interface", Key: map[string]string{"name": "eth0"}},
{Name: "state"},
{Name: "counters"},
{Name: "in-octets"},
},
},
Mode: gnmi.SubscriptionMode_SAMPLE,
},
},
},
},
}
stream, err := client.Subscribe(ctx)
if err != nil {
log.Fatalf("Subscribe failed: %v", err)
}
if err := stream.Send(subReq); err != nil {
log.Fatalf("Send failed: %v", err)
}
for {
resp, err := stream.Recv()
if err != nil {
log.Fatalf("Recv failed: %v", err)
}
log.Printf("Received update: %+v", resp)
}
}
2. 执行设备操作(Reboot)
func rebootExample(client gnoi.SystemClient) {
ctx := context.Background()
req := &gnoi.RebootRequest{
Method: gnoi.RebootMethod_COLD,
Delay: 5, // 5秒后重启
Message: "Scheduled maintenance reboot",
}
_, err := client.Reboot(ctx, req)
if err != nil {
log.Fatalf("Reboot failed: %v", err)
}
log.Println("Reboot command sent successfully")
}
安全配置
在实际生产环境中,应该使用TLS证书进行认证:
func secureConnection() *grpc.ClientConn {
creds, err := credentials.NewClientTLSFromFile("ca.crt", "device-name")
if err != nil {
log.Fatalf("Failed to load TLS cert: %v", err)
}
conn, err := grpc.Dial("device-ip:9339",
grpc.WithTransportCredentials(creds),
grpc.WithPerRPCCredentials(&auth.BasicAuth{
Username: "admin",
Password: "password",
}),
)
if err != nil {
log.Fatalf("Dial failed: %v", err)
}
return conn
}
总结
gNxI提供了强大的Golang实现来操作gNMI和gNOI协议,使得网络设备的自动化管理变得更加简单。通过上面的示例,您可以:
- 使用gNMI获取和订阅网络设备状态
- 使用gNOI执行设备运维操作
- 实现安全的gRPC连接
在实际使用中,您可以根据需要扩展这些基础功能,构建更复杂的网络自动化工具。