見出し画像

SNMPのMIBにあたるgNMIのYANGについて調べています

今朝は3時に目が覚めました。助手の猫さんは寝ていました。4時にトイレに行った時に猫さんが起きてきて、ご飯をあげました。

昨日作ったTCPで受信するプログラムをTLS対応にしましたが、元のgNMIcはTLSで送信できないことがわかりました。

の資料の記述を

の資料の内容を誤解したようです。記憶力の低下を感じました。
なので、今回はTLS対応はなしにします。将来gNMI Serverモードを追加するかもしれません。

最後に調べているのは、gNMIで管理対象から情報を取得する時に指定するPathについです。

で調べた時はサイトに書いてあるものを、そのまま使っていました。
例えばgetコマンドのテストプログラム

package main

import (
	"context"
	"fmt"
	"log"

	"github.com/openconfig/gnmic/pkg/api"
	"google.golang.org/protobuf/encoding/prototext"
)

func main() {
	// create a target
	tg, err := api.NewTarget(
		api.Name("srl1"),
		api.Address("192.168.1.50:57400"),
		api.Username("admin"),
		api.Password("NokiaSrl1!"),
		api.SkipVerify(true),
	)
	if err != nil {
		log.Fatal(err)
	}

	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()

	// create a gNMI client
	err = tg.CreateGNMIClient(ctx)
	if err != nil {
		log.Fatal(err)
	}
	defer tg.Close()

	// create a GetRequest
	getReq, err := api.NewGetRequest(
		api.Path("/system/name"),
		api.Encoding("json_ietf"))
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(prototext.Format(getReq))

	// send the created gNMI GetRequest to the created target
	getResp, err := tg.Get(ctx, getReq)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(prototext.Format(getResp))
}

では、Pathに"/system/name"です。
これが、SNMPのOID(オブジェクト識別子)のようなものじゃないかと思います。これがどこで定義されているのかが謎でした。
いろいろ調べてみるとYANGというファイルで定義されているらしいことがわかりました。このファイルをどこから手に入れるか?
SR LinuxにSSHでログインすると

YANGファイルの入手先らしいURLが書いてありました。そのままアクセスするとエラーになりますが、

にアクセスすると

のような画面になってSR Linuxのバージョンを指定して検索できるようです。(赤の矢印)Pathは膨大にあります。YANGファイルのソースコードについては、緑の矢印のところに書いてありました。GitHUBのリポジトリにあるようです。
gNMIcのプロンプトモードの資料

を読んでいるとYANGファイルの扱いとPathの検索について書いてありました。どうやらYANGファイルは、GitHUBからcloneしてgNMIcに読み込ませればPathの検索ができるようです。

の部分です。CisoやJuniperのサンプルもあります。

とりあえず、

$git clone -b v24.7.2 --depth 1 https://github.com/nokia/srlinux-yang-models
$gnmic  --file srlinux-yang-models/srlinux-yang-models/srl_nokia/models/system/srl_nokia-system-name.yang  --dir srlinux-yang-models/srlinux-yang-models/srl_nokia prompt

のように起動すれば、

のようにPathを検索して補完できます。
プログラムと同じように取得できます。

どうらやcapabilitiesで取得した

- urn:nokia.com:srlinux:chassis:system-name:srl_nokia-system-name, Nokia, 2019-11-30

とYANGファイルは関係してそうです。
まだ、よくわからないところが沢山ありますが、

  • 管理対象から情報を取得するにはPathが必要

  • SNMPのMIBファイルに相当するYANGファイルでPathが定義されている

  • 対応しているPath(YANG)はcapabilitiesコマンドで取得できそう

  • YANGファイルをTWSNMPに読み込まなくてもPathがわかれば管理情報の取得はできる

  • Pathの検索は、メーカーのサイトかgNMIcを使えばよさそう

が、現時点でわかったことです。

明日に続く

いいなと思ったら応援しよう!

twsnmp
開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。