ネットワーク機器への操作もおなじみのインターフェースで
シスコシステムズのシステムエンジニア、田川真樹氏は九州工業大学情報工学部出身。大学は学生の自主性を尊重し、パブリックのIPv4アドレスを自由に使える環境だった。後に奈良先端科学技術大学院大学でSDNと無線LANを組み合わせる研究に没頭し、2016年からシスコシステムズへ。SDN応用技術室を経て、現在はアカウントSEとして活動している。
今回のセッションでは、その田川氏がネットワークインフラのプログラマビリティについて、デモを交えながら解説する。前半はプログラムでネットワーク機器を操作する方法について、後半はネットワーク上でプログラムを稼働させる方法について紹介する。
ネットワークの世界はアプリケーション開発の世界と大きく異なる印象がある。ネットワーク機器から情報を取得し設定を行う時に使われるコマンドラインインターフェースは、アプリケーションの世界でおなじみのRESTとは異なるプロコトルだ。機器固有のコマンドにはオプションや省略形があり、達人でなければ使いこなせない。コマンドの戻り値は構造化されていないテキストが長文で並ぶ。構造化されていないデータをプログラムで扱うのは非常に難しい。
しかし今回のセッションで紹介された2種類のプログラマブルなインターフェースには、パーサーを使った抽象化と、ネットワーク機器が備えるネイティブなプログラマブルインターフェースがある。前者はネットワーク機器のコマンドラインインターフェースで扱われるテキストをパーサーが抽象化するもので、後者はアプリケーションの世界におけるREST APIと同様に、ネットワーク機器が情報を構造化して扱う。
パーサーで抽象化するものだとシスコのpyATS/Genieや、GoogleのTextFSMがある。ここでは前者をベースに解説する。pyATSはPython3をベースとしたネットワークテスト自動化フレームワークで、その中にオープンソースライブラリとなるGenieがある。シスコの製品開発時に使われているツールをオープンソース化したもので、実績は豊富。シスコだけではなく、他のネットワークOSにも対応している。
pyATS/Genieでは、Pythonプログラムがネットワーク機器でコマンドを実行、戻り値となるテキストをGenieがパースするという流れになる。単なるスクレイピングにとどまらず、プラットフォームやベンダーに依存しない機能ごとのモデルに抽象化することもできる。例えば特定の機能について情報収集したい時はモデルを指定して「learn」(学習する)を実行すればよい。そうすればプログラムが自動的に関連するコマンドを発行し、戻り値をもとに情報をまとめる。機種依存のコマンドを使いこなさなくてもいいのだ。
こうしたスクレイピングではなく、ネイティブなプログラマブルインターフェースとしてはNETCONF、RESTCONF、gNMIなどがある。例えばRESTCONFは文字通りREST APIに非常に似通ったインターフェースだ。
NETCONF、RESTCONF、gNMI、これらインターフェースごとにプロトコル(SSH、HTTPなど)やエンコーディング(XML、JSONなど)が異なるが、コンテンツ部分はデータモデル言語YANGによって共通して表現できる。従来はベンダーやOSごとに異なるコマンドや表現を学習する必要があったが、YANGデータモデルには業界団体や標準化団体によって定義されたオープンモデルと呼ばれるデータモデルが存在する。これによってマルチベンダー環境にも対応できる。
例えばネットワーク機器の設定を変更するとしよう。コマンドラインなら「no」に続いて古い設定を入力し確定、その後新たな設定を入力し確定する。REST API的に見ると、コマンドライン内にメソッドとペイロードが混在しているようなものだ。しかしRESTCONFであれば、POSTやPUTメソッドを使い、bodyの中に新しい設定を指定するため、「宣言的に設定を投入できる」と田川氏は言う。
ここまではネットワーク機器への操作だったが、逆にネットワーク機器からの出力(テレメトリ)に関するプログラミングについて見ていこう。従来使われているテレメトリにはsyslog、SNMP Trap、NetFlowがある。これに加えてYANGでモデル化されたNETCONF Dial-In、gRPC Dial-Out、gNMI Dial-Inがある。つまりネットワーク機器がYANGデータをプッシュ送信していることになる。プッシュのタイミングは定点観測のように一定時間ごとだけではなく、例えばクライアント数がしきい値を超えたなどの変化をきっかけにすることもできる。
田川氏はコレクタのTelegrafでテレメトリを指定し、Grafanaで可視化する様子を披露した。取得したい情報をコードの中でパス(URI)として指定すると、ネットワーク機器から情報が出力され、このデータを時系列データベースとなるinfluxdbに蓄積し、Grafanaでグラフ化する。データはすべて構造化されているのでプログラムで扱いやすい。