Upload
kentaro-ebisawa
View
3.861
Download
3
Embed Size (px)
Citation preview
ネットワーク機器の API あれこれ入門How do you wan to talk with your Network Nodes?
Twitter: @ebiken | [email protected]
ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 1
本日のお題「ネットワーク機器の API を使って何かしたい!」と思っている人が、何かを始められるようにネットワーク機器 API の全体像をつかむ
• API を利用してできる事•ネットワーク機器のインターフェース
• REST (like) API の違い• Appendix :参考資料
ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 5
要は、自分がこの数か月勉強したことをシェアします。
ネットワーク自動化の全体像
ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 6
API を利用してできる事設定投入 ディスカバリートポロジー描画 通知・アラート( Notification)
コマンド実行ネットワーク管理システム( NMS )アプリケーション
ネットワーク機器
PingTraceroute
設定(参照)RIB/FIB隣接情報複数機器 状態( Status )統計( Stats )
設定投入
複数機器
ネットワーク自動化の全体像
ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 7
API を利用してできる事ディスカバリートポロジー描画 通知・アラート( Notification)
コマンド実行ネットワーク管理システム( NMS )アプリケーション
ネットワーク機器
PingTraceroute
設定(参照)RIB/FIB隣接情報
状態( status )統計( Stats )アプリケーション・プログラムによるアクセスが可能⇒ これらを組み合わせた様々な自動化が可能
ネットワーク自動化の全体像
ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 8
ネットワーク機器のインターフェース昔ながらのインターフェース 標準化が進められている API 機器毎の独自 API
REST? API(JSON/XML+HTTP)
(RPC over HTTP)
NECONF/YANG( RESTCONF )CLI
SNMP
ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 9
CLI / SSHネットワーク機器の API
ネットワーク機器の 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
ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 11
NETCONF / YANGネットワーク機器の API
ネットワーク機器の 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 (トランスポート)
ネットワーク機器の 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>
オペレーションの流れ
ネットワーク機器の API : NETCONF/YANG
ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 14
YANG Model Example
RFC 7223 : YANG Interface Managementhttps://tools.ietf.org/html/rfc7223
ネットワーク機器の API : NETCONF/YANG
ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 15
嬉しい点•標準化が進められている• データモデル( YANG )• プロトコル( NETCONF )
•多くのベンダーがサポート表明•オペレーションやエンコーディング( XML )は各機器共通
つらい点• 「設定」 関連情報・操作のみ• ベンダーや機器間でのデータモデルの差異• YANG を使わなくても良い• 操作(設定)可能なパラメータの差異• 操作できない設定も
• エンコーディングは XML• 冗長で読みづらい ⇒ SDK/Library の利用が必須
ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 16
... その前に ...
REST APIネットワーク機器の API
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 が多い
• ステート(セッション)もたない
操作 リソース
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 に含まれない!
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 ではない & 各機器異なる実装に。
ネットワーク機器の 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 !?
ネットワーク機器の 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?
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)
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 にマップしたイメージ
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
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
.
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
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
• 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)
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
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
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
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
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
ネットワーク機器の 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 を投入
プログラミングの階層構造&まとめ
ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 35
Network Controller
ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 36
プログラミングの階層構造アプリケーション
SDK / library(機器毎)Plug-in (機器毎)
Wire ProtocolCLI/SSH, NETCONF, REST (like)
各機器共通 APIREST (like)
「実現したいこと」&「機器仕様」を元に検討
まとめ
ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 37
SDK や Library の提供・活用NECONF/YANG ⇒ 標準化進められているが複雑REST (like) API ⇒ ベンダー毎に独自な API
シンプルな API の必要性直接 API アクセス ( SDK や Library だけではできないことを実装するために) ⇒ メーカーによる機能追加(要求) ⇒ API Proxy/Agent などの開発・公開メーカーの視点から
多くの人に使ってもらえる(期待が持てる)機能は実装&改善可能試して、できなかった事、足りない機能など公開して「プログラミングしやすい環境」を加速させよう!
Appendix: LINK集これからネットワークプログラムしたい人が読むと嬉しい資料
ネットワーク機器の API あれこれ入門| NetOpsCoding#2 | 2016/03/04 | @ebiken 38
ネットワーク自動化・アプリケーション連携への動き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
ネットワーク自動化・アプリケーション連携への動き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
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
ベンダーが作成している? ライブラリ• 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