golang基于gNMI和gNOI协议的网络管理工具集插件gNxI的使用

Golang基于gNMI和gNOI协议的网络管理工具集插件gNxI的使用

gNxI工具集

License GoDoc Go Report Card Build Status Code coverage master

  • 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

1 回复

更多关于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协议,使得网络设备的自动化管理变得更加简单。通过上面的示例,您可以:

  1. 使用gNMI获取和订阅网络设备状态
  2. 使用gNOI执行设备运维操作
  3. 实现安全的gRPC连接

在实际使用中,您可以根据需要扩展这些基础功能,构建更复杂的网络自动化工具。

回到顶部