39
ネネネネネネネネネ API ネネネネネネ How do you wan to talk with your Network Nodes? Twitter: @ebiken | [email protected] ネネネネネネネネネ API ネネネネネネNetOpsCoding#2 2016/03/04 @ebiken 1

ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

Embed Size (px)

Citation preview

Page 1: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

ネットワーク機器の API あれこれ入門How do you wan to talk with your Network Nodes?

Twitter: @ebiken | [email protected]

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 1

Page 2: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

本日のお題「ネットワーク機器の API を使って何かしたい!」と思っている人が、何かを始められるようにネットワーク機器 API の全体像をつかむ

• API を利用してできる事•ネットワーク機器のインターフェース

• REST (like) API の違い• Appendix :参考資料

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 5

要は、自分がこの数か月勉強したことをシェアします。

Page 3: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

ネットワーク自動化の全体像

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 6

API を利用してできる事設定投入 ディスカバリートポロジー描画 通知・アラート( Notification)

コマンド実行ネットワーク管理システム( NMS )アプリケーション

ネットワーク機器

PingTraceroute

設定(参照)RIB/FIB隣接情報複数機器 状態( Status )統計( Stats )

Page 4: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

設定投入

複数機器

ネットワーク自動化の全体像

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 7

API を利用してできる事ディスカバリートポロジー描画 通知・アラート( Notification)

コマンド実行ネットワーク管理システム( NMS )アプリケーション

ネットワーク機器

PingTraceroute

設定(参照)RIB/FIB隣接情報

状態( status )統計( Stats )アプリケーション・プログラムによるアクセスが可能⇒ これらを組み合わせた様々な自動化が可能

Page 5: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

ネットワーク自動化の全体像

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 8

ネットワーク機器のインターフェース昔ながらのインターフェース 標準化が進められている API 機器毎の独自 API

REST? API(JSON/XML+HTTP)

(RPC over HTTP)

NECONF/YANG( RESTCONF )CLI

SNMP

Page 6: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 9

CLI / SSHネットワーク機器の API

Page 7: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

ネットワーク機器の API

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 10

CLI / SSH• SSH セッション上で CLI コマンドを会話的に実行• SSH セッションを意識した プログラミング(煩雑)• Exscript, expect 等 SSH パッケージの利用

• CLI 経由でのみ実行可能なコマンドが存在 

参考: NetOpsCoding Advent Calendar 2015ソフトウェアからルータに SSH(Exscript) で設定してみるhttp://qiita.com/taijijiji/items/351c48a8a77ee56f6e79

Page 8: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 11

NETCONF / YANGネットワーク機器の API

Page 9: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

ネットワーク機器の API : NETCONF/YANG

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 12

ネットワーク機器設定の「データモデル」「オペレーション」 「データストア」 を提供• IETF で標準化@ NETCONF WG• RFC 6241 NETCONF• RFC 6020 YANGhttps://datatracker.ietf.org/wg/netconf/documents/

オペレーション<get-config><edit-config><delete-config><commit>etc.

データストアcandidate configrunning configstartup config

YANG (データモデル)設定情報含むネットワーク機器のモデル化NETCONF (プロトコル)オペレーション データストア

XML-RPC

SSH, TLS (トランスポート)

Page 10: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

ネットワーク機器の API : NETCONF/YANG

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 13

NetConf / YANG

Network Configuration Management with NETCONF and YANGhttp://www.ietf.org/edu/documents/2012-ietf-84-netconf-yang.pdf

YANG

NetConf<get-config>

<edit-config> <delete-config>

<commit>

オペレーションの流れ

Page 11: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

ネットワーク機器の API : NETCONF/YANG

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 14

YANG Model Example

RFC 7223 : YANG Interface Managementhttps://tools.ietf.org/html/rfc7223

Page 12: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

ネットワーク機器の API : NETCONF/YANG

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 15

嬉しい点•標準化が進められている• データモデル( YANG )• プロトコル( NETCONF )

•多くのベンダーがサポート表明•オペレーションやエンコーディング( XML )は各機器共通 

つらい点• 「設定」 関連情報・操作のみ• ベンダーや機器間でのデータモデルの差異• YANG を使わなくても良い• 操作(設定)可能なパラメータの差異• 操作できない設定も

• エンコーディングは XML• 冗長で読みづらい  ⇒ SDK/Library の利用が必須

Page 13: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 16

... その前に ...

REST APIネットワーク機器の API

Page 14: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

REST おさらい

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 17

REST おさらい• URI = リソース• HTTP Method =操作

• POST => Create• GET => Read• PUT => Update• DELETE => Delete

• BODY エンコーディング(符号化)• 何でも良い: JSON, XML, CSV etc.• でも JSON が多い

• ステート(セッション)もたない

操作 リソース

Page 15: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

REST おさらい

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 18

REST な URI

• /interface/ge-0-0-1• /interface/ge-0-0-1/ipv4

• /version

REST ではない URI

• /show-interface/ge-0-0-1• /set-interface/ge-0-0-1/ipv4

• /show-version

操作は REST URI に含まれない!

Page 16: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

REST おさらい

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 19

REST の特徴• HTTP(S) トランスポート•プログラムしやすい!• コマンド 1 行でリクエスト作成可能• curl, wget ..

• 様々な言語のライブラリ• Ruby, Python, Go, Perl ...

•(当然)標準化されていない• REST は規約ではなく思想• (個人の見解です)

•実際には RESTful だとできない事も• Candidate config + commit とか。• 結果、 RESTful ではない & 各機器異なる実装に。

Page 17: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 20

API 対応状況(ネットワーク機器各種)

なせネットワーク運用自動化が進まないのかby Biglobe 土屋さんhttp://www.slideshare.net/taijitsuchiya5/ss-47398248http://www.slideshare.net/taijitsuchiya5/whitebox-switch-48099814

REST API !?

Page 18: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 21

REST (like) な API の分類 (概要)• URI• リソース• リソース+操作• 常に同じ

•エンコード• JSON• XML

•セッション• 有り: URI/BODY に SessionID• 無し

•オペレーション• CLI を Body に入れて送信• HTTP METHOD + URI• URI にコマンド入れる

REST と記載されてても、(基本) RESTful ではない• JSON-RPC, XML-RPC, WEB API?

Page 19: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

Brocade vRouter 5600 (Vyatta)

• URI: コマンドを表す(リソースではなく)• Encoding 符号化 : JSON

• 参照・設定、共にセッションを持つ• Config Workflow• Ops: one-time output• Ops: continuous output• GET /rest/op/<cmd>• Ops with no session ID will return parameter definitions.• Very different from RESTful concept.

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 22

Brocade vRouter 5600 (Vyatta)

Page 20: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

23

Brocade vRouter 5600 (Vyatta)

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken

設定投入&適用 Workflow1. Begin a configuration session• Config Session ID named "conf-id" will be

generated.

2. make configuration changes• PUT /rest/conf/<conf-id>/set/<path> • PUT /rest/conf/<conf-id>/delete/<path>

3. commit changes• POST /rest/conf/<conf-id>/commit

4. optional: view config• GET /rest/conf/<conf-id>/<path>

5. save config• POST /rest/conf/<conf-id>/save

6. Finish configuration session• DELETE /rest/conf/<conf-id>

CLI を URL にマップしたイメージ

Page 21: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

24

Brocade vRouter 5600 (Vyatta)

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken

参照コマンド ( One Time )• Begin a ops session• POST /rest/op/show/version• HTTP/1.1 201 Created• Location: rest/op/137AA3B22A362CA3

• Get output from the command just sent• GET /rest/op/137AA3B22A362CA3• HTTP/1.1 200 OK

• If request 2nd time, it's gone.• GET /rest/op/137AA3B22A362CA3• HTTP/1.1 410 Gone

Page 22: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

25

Brocade vRouter 5600 (Vyatta)

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken

参照コマンド (継続的)• Begin a ops session (ex: ping)

• POST /rest/op/ping/10.0.0.1

• Get ouput (1st)• GET /rest/op/02B3479CA1522F2A• HTTP/1.1 200 OK• PING 10.3.0.1 (10.3.0.1) 56(84) bytes of data.• 64 bytes from 10.3.0.1: icmp_seq=1 ttl=64

time=0.839 ms• 64 bytes from 10.3.0.1: icmp_seq=2 ttl=64

time=0.846 ms• ...• 64 bytes from 10.3.0.1: icmp_seq=18 ttl=64

time=0.821 ms

• Get output (2nd) • GET /rest/op/02B3479CA1522F2A• HTTP/1.1 200 OK• 64 bytes from 10.3.0.1: icmp_seq=19 ttl=64

time=0.799 ms• 64 bytes from 10.3.0.1: icmp_seq=20 ttl=64

time=0.807 ms• ...

• Stop a ops session (and the command ping)• DELETE /rest/op/02B3479CA1522F2A

.

Page 23: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

Brocade VDX

• URI: リソースを表す• エンコード(符号化): XML• コマンド: HTTP Method (GET, POST, PUT, PATCH, DELETE, OPTIONS, and HEAD)• パラメーター: BODY (XML)

• 設定のための “ session-id” や “ commit” という概念はない• POST http://host:80/rest/config/running/interface/TenGigabitEthernet/%221/0/5%22/ip• <address>• <address>192.168.10.1/24</address>• <ospf-ignore>true</ospf-ignore>• </address>

• 参照(実行)コマンドには “ session-id” があり実行結果をレスポンス• ex: l2traceroute-result,

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 26

Brocade VDX

Page 24: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

REST (like) API のタイプ

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 27

JSON RPC 型 (Arista EOS eAPI)URI =固定( /command-api )BODY に CLI コマンド列挙( JSON )ex : http://admin:[email protected]/command-api

Reference: https://eos.arista.com/arista-eapi-101/

<protocol>://<username>:<password>@<hostname or ip-address>/command-api

Page 25: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

• CLI を投入するようにコマンドをシーケンシャルに記述可能

•参考 : Arista eAPI の概略を5分で説明してくれます。• https://www.youtube.com/watch?v=9sWux0GCZ78• Command API Explorer

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 28

JSON RPC 型 (Arista EOS eAPI)

Page 26: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

29

JUNOS: XML RPC Single Method

• CLI に紐づいた RPC Method を URI に記述• インターフェース名などのパラメータも URI中に ? で指定• scheme://device-name:port/rpc/method[@attributes]?params• scheme: http or https• method: rpc command

• 各コマンドに対してそれぞれ RPC method が定義されている。• params: Optional parameter values (name[=value])

• Response Format を指定可能• @attributes で指定 : @format=json• HTTP header “Accept:” で指定: application/xml, application/json

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken

JUNOS: XML RPC Single Method

参考: Junos の REST API を使ってみるhttp://qiita.com/kazubu/items/e5e0941f66f6c6f2f55a

Page 27: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

device-name port

JUNOS: XML RPC Single Method

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 30

URI Example

https://198.51.100.1:3000/rpc/get-software-information

... /get-interface-information?terse=&interface-name=ge-0/0/1

method

method parameters

参考: Junos の REST API を使ってみるhttp://qiita.com/kazubu/items/e5e0941f66f6c6f2f55a

Page 28: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

JUNOS: XML RPC Single Method

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 31

CLI コマンドに対応する RPC method 確認方法

参考: Junos の REST API を使ってみるhttp://qiita.com/kazubu/items/e5e0941f66f6c6f2f55a

Page 29: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

JUNOS: XML RPC Single Method

• 1. 設定投入: POST load-configuration• 設定内容は BODY に CLI 出力と同様のフォーマットで指定。• Candidate Config に保存される

• 2. 設定適用: POST commit-configuration

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 32

JUNOS 設定投入・適用

参考: Junos の REST API を使ってみるhttp://qiita.com/kazubu/items/e5e0941f66f6c6f2f55a

Page 30: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

REST (like) API のタイプ

•( URI でなく) CLI に紐づく RPC Method を BODY に複数記述

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 33

XML RPC Multi Method型 (JUNOS Multi RPC)

Request Response

Page 31: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 34

REST (like) API の特徴(機器別)• Vyatta

• URI = CLI Command• Encode: JSON• Session 設定:有|参照:有• 設定はセッション( conf-id )毎に Candidate config を編集、 Commit • 参照や Ops コマンド実行は2回以上リクエスト投げて結果を受け取る• 継続的なコマンド( Ping )とか実行可能

• Brocade VDX• URI = Resource• Encode: XML• Session: 設定:無|参照:有(継続コマンドのみ)• HTTP Method で操作を表す• 設定のためのセッションという概念は無い。• 継続的なコマンドにはセッションという概念あり。

• Arista• URI: 固定 /command-api• Encode: JSON• Session: 無• コマンドは Request BODY に JSON で記述• 複数コマンドを1度に送信できる。

• Juniper• URI = CLI mapped RPC method (or 固定 URI +

RPC method in BODY)• Encode: XML, JSON, TXT• Session: 無• 設定投入は設定を BODY に記載して /load-

configuration に投入• 適用は commit-configuration を投入

Page 32: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

プログラミングの階層構造&まとめ

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 35

Page 33: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

Network Controller

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 36

プログラミングの階層構造アプリケーション

SDK / library(機器毎)Plug-in (機器毎)

Wire ProtocolCLI/SSH, NETCONF, REST (like)

各機器共通 APIREST (like)

「実現したいこと」&「機器仕様」を元に検討

Page 34: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

まとめ

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 37

SDK や Library の提供・活用NECONF/YANG ⇒ 標準化進められているが複雑REST (like) API ⇒ ベンダー毎に独自な API

シンプルな API の必要性直接 API アクセス ( SDK や Library だけではできないことを実装するために) ⇒ メーカーによる機能追加(要求) ⇒ API Proxy/Agent などの開発・公開メーカーの視点から

多くの人に使ってもらえる(期待が持てる)機能は実装&改善可能試して、できなかった事、足りない機能など公開して「プログラミングしやすい環境」を加速させよう!

Page 35: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

Appendix: LINK集これからネットワークプログラムしたい人が読むと嬉しい資料

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 38

Page 36: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

ネットワーク自動化・アプリケーション連携への動きIDCF 井上さん• 2015年 10 月中心 : QIITA で API 実装・実験色々• http://qiita.com/inoueissei

Biglobe 土屋さん• 2015/12/21 ソフトウェアからルータに NETCONF(ncclient) で設定してみる• http://qiita.com/taijijiji/items/394d6af5a71834c4e48a

• 2015/12/02 ソフトウェアからルータに SSH(Exscript) で設定してみる• http://qiita.com/taijijiji/items/351c48a8a77ee56f6e79

• 2015/05/xx ?? なせネットワーク運用自動化が進まないのか• Why is it difficult to automate network operation• http://www.slideshare.net/taijitsuchiya5/ss-47398248• http://www.slideshare.net/taijitsuchiya5/whitebox-switch-48099814

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 39

Page 37: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

ネットワーク自動化・アプリケーション連携への動きShintaro Kojima @codeout• NETCONF 入門 知ったかぶりしない NETCONF ( 2014/10/24 )• http://codeout.hatenablog.com/entry/2014/10/24/230013

• NETCONF 入門 やってみよう NETCONF ( 2014/10/30 )• http://codeout.hatenablog.com/entry/2014/10/30/224405

Hiroshi Ota @otahi• 2015/04/23 テスト自動化@第4回 ネットワークプログラマビリティ勉強会• http://gvtkne.blogspot.jp/2015/04/npstudy4.html

Brocade Yukihiro Kikuchi• 2014/04/04 Vyatta REST API 解説@ Vyatta Users Group• http://www.slideshare.net/YukihiroKikuchi/20140404-vyatta-users-group

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 40

Page 38: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

41

ネットワーク自動化・アプリケーション連携への動きTwitter: @takech9203• 2015/02/22 Vyatta の REST API を使ってみる• http://qiita.com/takech9203/items/2225c8e4ac7dc5bea1e0

Twitter: @kakkotetsu• 2014/12/14 Arista の REST API を ruby や Ansible で突いてみよう• http://qiita.com/kakkotetsu/items/944c263c1580a230a9c0

NetOpsCoding Advent Calendar 2015:• http://qiita.com/advent-calendar/2015/netopscoding• 2015/12/17 Junos の REST API を使ってみる• http://qiita.com/kazubu/items/e5e0941f66f6c6f2f55a

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken

Page 39: ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)

ベンダーが作成している? ライブラリ• Juniper

• https://github.com/Juniper/net-netconf• https://github.com/Juniper/netconf-perl• https://github.com/Juniper/netconf-java• https://github.com/Juniper/netconf-php• https://github.com/leopoul/ncclient

• Cisco• https://github.com/jtimberman/ruby-cisco• https://github.com/nickpegg/ciscolib

• Brocade• [https://github.com/brocade/ncclient• https://github.com/brocade/brocade ( OpenStack Plugin )• https://github.com/BRCDcomm/BVC ( VyattaController )• https://github.com/zapman449/brocade_switchshow_aliases ( Fiber switches )

• Alaxala• https://github.com/sumikawa/netconf

• Cumulus• https://

github.com/CumulusNetworks/cumulus-linux-ansible-modules

• https://github.com/CumulusNetworks/cumulus-linux-chef-modules

• https://github.com/CumulusNetworks/net-next• https://github.com/CumulusNetworks/quagga• https://

github.com/CumulusNetworks/cumulus-cl-interfaces-puppet• https://github.com/OpenRTMFP/Cumulus ( MonaServer使った SW )• https://github.com/cotdsa/cumulus• http://cumulusnetworks.com/blog/cumulus-linux-2/

ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 42

Slide 40, JANOG36, IDCF井上さんhttp://www.janog.gr.jp/meeting/janog36/download_file/view/188/170