YANGを使いこなす! (1) 概要

# はじめに

突然ですが、ネットワークエンジニアの皆様、YANG って使えてますか?

ネットワーク業界では、ネットワーク機器等のデータモデルを定義するのに YANG というデータモデリング言語を使いましょう、という動きが進んでいます。ネットワーク機器をあつかう際、これまでは機器/OSごとに異なるコマンドを使って設定する必要がありました。(ありました、と過去形で書いたものの、今後もまだしばらくはそうした状況が続くでしょう……。) これは、マルチベンダ構成の(特に大規模な)ネットワークでは不便なので、共通のデータモデルに基づいて統一したオペレーションができるようにしたいという話があるわけです。最近その中でも大きな動きは  [OpenConfig](http://www.openconfig.net/) でしょうか。そうした状況で、データ構造や形式を定義するための言語(データモデリング言語)として  [YANG](https://tools.ietf.org/html/rfc7950.html) が使われています。

では「この機械はこういうデータモデルで動くんですよ」というのが YANG で定義され、提示されるとして、[あなた/私/我々]は、その機械を適切に扱うことができますか? その機械を使って目的とするシステムが組めますか? というのが今回(を含む数回の記事で)考えたいことです。

少なくとも筆者は、そう問われたときに何をしていいのやら、という状況でした。なので、ネットワークオペレータの視点で、YANG 形式で操作対象のデータモデルが与えられたときに、どのようにそれを「使う」のか…というのを、順を追って、数回に分けてみていきたいと思います。今回はまず全体の流れの説明だけ。

# なにをしたらいいのか?

## YANG とはなにか

YANG という言語そのものの話に踏み込むときりがないので、今回これはパスします。[RFC 7950 \- The YANG 1\.1 Data Modeling Language](https://tools.ietf.org/html/rfc7950.html) を読みましょう……といってもヘビーなので他の解説資料を見るのが良いと思います。いろいろ解説があります。あるいは、ある程度「使い方」を見た上でわからないところや気になるところを追うというやり方もアリだと思います。いきなり YANG モデル読みましょうみたいなのはちょっとしんどい。

* [NETCONFとYANGの話](https://www.slideshare.net/m-asama/netconfyang-72491940)
    * YANG 解説。わかりやすいです。
* [知ったかぶりしない NETCONF \- LGTM](https://codeout.hatenablog.com/entry/2014/10/24/230013)
    * これまでの標準化の経緯などをまとめてある
* [NETCONF and YANG Status, Tutorial, Demo](https://www.ietf.org/proceedings/75/slides/opsarea-5.pdf)
    * IETF75 (2009) の資料
* [NETCONF/YANG](https://www.janog.gr.jp/meeting/janog36/application/files/7714/3662/8399/janog36-netconf-shishio-03.pdf)
    * Janog36 (2015) の資料。

上の資料を見ていくとわかるのですが、ちょっと前の資料とかを見る場合は特に、NETCONF 基礎の話もおさえておくとわかりやすいことが多いように思います。XML によるオペレーションで組み合わせて使うことが想定されていたので。

## YANG を使って何ができれば良いのか

### 使い方を知る: Tutorial をやってみよう!

さて。YANG ファイル (データモデルを定義したもの) が与えられたとして、何をしたらいいのでしょうか? という話なんですが、まあこの辺は当然先人がいろいろ残してくれているものがあるわけでですね。下記の YANG Tutorial をベースに話を進めたいと思います。とはいえ、そのままやるだけだとあえてブログを書く意味がないので、いくつか +α の話を加えていきます。

* [Tutorial · mbj4668/pyang Wiki · GitHub](https://github.com/mbj4668/pyang/wiki/Tutorial)
    * [pyang/doc/tutorial at master · mbj4668/pyang · GitHub](https://github.com/mbj4668/pyang/tree/master/doc/tutorial) (チュートリアル素材等)
* "Example Data Model" に [Turing Machine のデータモデルを YANG で定義したもの](https://github.com/mbj4668/pyang/blob/master/doc/tutorial/examples/turing-machine.yang)があります。このチュートリアルでは、操作対象として "Turing Machine" を設定しています。
* ネットを探すと同様の(同じ題材の)チュートリアル資料がいくつか出てきます。資料によって説明内容や観点がちょっと違ったりするので、併せて見ておくと良いと思います。
    * [pyang Tutorial](https://www.ietf.org/slides/slides-edu-pyang-tutorial-01.pdf), IETF94 (2015) の資料。[Youtubeに動画](https://www.youtube.com/watch?v=aPFTzgdYDw0) もあります。
    * [DSDLMappingTutorial < Main < TWiki](http://www.yang-central.org/twiki/bin/view/Main/DSDLMappingTutorial)
    * [netopeer/transAPI/turing at master · CESNET/netopeer · GitHub](https://github.com/CESNET/netopeer/tree/master/transAPI/turing)

### チュートリアルの流れ: 何をどこまでやるのか

[github CESNET/netopeer](https://github.com/CESNET/netopeer/tree/master/transAPI/turing) にあるものは実際に動く Turing Machine 実装も含めてあるようなのですが、どうやらこれ単体で動くのではなく、netopeer というツールのプラグインか何かとして動くようです。Netopeer については  [やってみよう NETCONF \- LGTM](https://codeout.hatenablog.com/entry/2014/10/30/224405) で触れられています。正直これを動かすのは難しそうだったのでパス…。

かわりに、自前でこのチュートリアルで出てくるデータ (XML) を処理できる [Turing Machine 実装](https://github.com/corestate55/yang-tutorial/)を作ってみました。この Turing Machine 実装を作るにあたって、gRPC インタフェースを YANG データモデルから生成するということも試しています。一連の使い方をチュートリアルベースに見ていった後に gRPC の話もします。

以下の話を何回かに分けて掲載していきます。

* Turing Machine がどういうデータを受け取っているか・どのように動作しているのかを把握する
    * そもそも、Turing Machine ってなんだっけ?
    * Turing Machine を動かしてみて、操作対象と操作を理解する
        * Turing Machine サーバ/クライアント の起動
        * サーバを設定する
        * サーバに計算を実行させる
        * サーバの状態を取得する
* YANG データモデルをどのように使うのかを把握する
    * Turing Machine にさせてみたい(別の)計算を定義する
    * 実際に (新しく) Turing Machine の設定データを作ってみる
        * 作ってみた設定データで Turing Machine に別の計算をさせてみる
    * Turing Machine クライアント/サーバ RPC の作り方を見る

# Index
YANGを使いこなす!

* (1) 概要 : 本記事です
* [\(2\) 操作対象を理解する](https://qiita.com/corestate55/items/d5c1e1b6457d2aa53217)
* [\(3\) YANG データモデルをどのように使うのかを把握する](https://qiita.com/corestate55/items/2d226b745d1c452c0a25)
* [\(4\) XMLだけじゃなくてJSONもつかいたい](https://qiita.com/corestate55/items/8ce7c1b0b864022bac5c)
* [\(5\) モデルを拡張してみよう](https://qiita.com/corestate55/items/7afdab68dc619e562799)
* [\(6\) gRPCで通信するアプリケーションを作ろう](https://qiita.com/corestate55/items/f259981a2d15d8ecc28e)
* [\(7\) リンク集](https://qiita.com/corestate55/items/54eef47c8c569ee79c3e)