ネットワーク API のあれこれ Network Node API How do you wan to talk with your Network Node? Twitter: @ ebiken | [email protected] ネットワーク API のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 1
ネットワーク API のあれこれNetwork Node API
How do you wan to talk with your Network Node?
Twitter: @ebiken | [email protected]
ネットワーク API のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 1
ネットワーク API のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 2
ネットワーク自動化・アプリケーション連携への動きJANOG36 : 2015年7月15~17日
• API/Web化によるネットワーク自動化• by 井上さん@株式会社IDCフロンティア
• http://www.janog.gr.jp/meeting/janog36/program/api
• NETCONF/YANG
• by 土屋師子生@シスコシステムズ合同会社
• http://www.janog.gr.jp/meeting/janog36/program/netconf
JANOG37 : 2016年1月20~22日
• クラウド事業者側の仮想環境ネットワークの自動化について• by 村上さん@GMOインターネット株式会社
• http://www.janog.gr.jp/meeting/janog37/program/vauto
ネットワークプログラマビリティ勉強会
• 2014年10月24日~ 16ヶ月で8回
• http://network-programmability.connpass.com/
NetOpsCoding
• 2015年10月30日~ 4ヶ月で2回
• #1 https://atnd.org/events/70253
• #2 https://atnd.org/events/74772
ネットワーク自動化・アプリケーション連携への動き
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 のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 3
ネットワーク自動化・アプリケーション連携への動き
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 のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 4
ネットワーク自動化・アプリケーション連携への動き
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 のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 5
機器側の課題
• 機器毎に違うから?• NETCONF/YANG難しい?• REST/WebAPIの手軽さが欲しい?
ネットワーク API のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 6
発表・BLOG・資料などがまだ沢山存在!?
でも、いまひとつ加速してない気がする?(注:個人の見解です)
人側(開発・運用)の課題
• ネットワーク&プログラミング両方分かってる人少ない?
• 日常忙しすぎて時間無い?
⇒機器側の現状について調べてみた
(人側については是非ご意見をお聞かせください)
ネットワーク API のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 7
ネットワーク機器へのインターフェース(API)アクセスの目的
•変更:設定
•参照:設定&状態&統計&ログ• Configuration
• Status
• Statistics (counter)
• Log (syslog?)
•コマンド実行• Ping, Traceroute, packet capture,
アクセス手段
• CLI / SSH
• SNMP
• NETCONF / RESTCONF
• REST (like) APIs
• JSON/XML + HTTP (RPC)
本日はこれ
⇒ JANOG36 : NETCONF/YANG by 土屋師子生さん@Ciscohttp://www.janog.gr.jp/meeting/janog36/program/netconf
ネットワーク API のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 8
API対応状況(ネットワーク機器各種)
なせネットワーク運用自動化が進まないのかWhy is it difficult to automate network operationby Biglobe土屋さんhttp://www.slideshare.net/taijitsuchiya5/ss-47398248http://www.slideshare.net/taijitsuchiya5/whitebox-switch-48099814
REST API ??
RESTおさらい
ネットワーク API のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 9
RESTおさらい
• URI=リソース
• HTTP Method=操作• POST => Create• GET => Read• PUT => Update• DELETE => Delete
• BODYエンコーディング(符号化)• 何でも良い:JSON, XML, CSV etc.• でも JSONが多い
•ステート(セッション)もたない
操作 リソース
RESTおさらい
ネットワーク API のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 10
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 のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 11
• HTTP(S) トランスポート
•プログラムしやすい!• コマンド1行でリクエスト作成可能
• curl, wget ..
•様々な言語のライブラリ• Ruby, Python, Go, Perl ...
• (当然)標準化されていない• RESTは規約ではなく思想
• (個人の見解です)
•そもそもRESTfulだとできない事もある• Candidate config + commit とか。
RESTといいながらRESTfulではない実装が多数• JSON-RPC, XML-RPC
• セッション持ったりしている
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 のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 12
Brocade vRouter 5600 (Vyatta)
Brocade vRouter 5600 (Vyatta)
ネットワーク API のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 13
設定投入&適用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>/<cmd>
4. optional: view config• GET /rest/conf/<conf-id>/<path>
5. save config• POST /rest/conf/<conf-id>/<cmd>
6. Finish configuration session• DELETE /rest/conf/<conf-id>
Brocade vRouter 5600 (Vyatta)
ネットワーク API のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 14
参照コマンド (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
Brocade vRouter 5600 (Vyatta)
ネットワーク API のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 15
参照コマンド (継続的)• 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 のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 16
Brocade VDX
REST (like) API のタイプ
ネットワーク API のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 17
JSON RPC 型 (Arista EOS eAPI)
URI: 固定Encoding符号化: JSONコマンド:BODY (JSON)パラメータ:BODY (JSON)
Reference: https://eos.arista.com/arista-eapi-101/
<protocol>://<username>:<password>@<hostname or ip-address>/command-api
ex: http://admin:[email protected]/command-api
• CLIを投入するようにコマンドをシーケンシャルに記述可能
•参考: Arista eAPIの概略を5分で説明してくれます。• https://www.youtube.com/watch?v=9sWux0GCZ78
• Command API Explorer
ネットワーク API のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 18
JSON RPC 型 (Arista EOS eAPI)
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 のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 19
JUNOS: XML RPC Single Method
参考:JunosのREST APIを使ってみるhttp://qiita.com/kazubu/items/e5e0941f66f6c6f2f55a
device-name port
JUNOS: XML RPC Single Method
ネットワーク API のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 20
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 のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 21
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 のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 22
JUNOS 設定投入・適用
参考:JunosのREST APIを使ってみるhttp://qiita.com/kazubu/items/e5e0941f66f6c6f2f55a
REST (like) API のタイプ
• CLIに紐づいたRPC MethodをBODYに複数記述
ネットワーク API のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 23
XML RPC Multi Method型 (JUNOS Multi RPC)
RequestResponse
ネットワーク API のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 24
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 を投入
Appendixオープンソースな実装ってあるの?
ネットワーク API のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 25
• OpenSwitch by HP• REST実装あり。但し現状は OVSDBに対する操作のみ。
• ops-restd : Overview• ------------• OpenSwitch provides a Tornado framework-based application to access
**OVSDB** using RESTful APIs. The ops-restd module provides all the necessary python packages required to add, delete, modify tables in the OVSDB database using ```HTTP``` methods, ```GET, POST, PUT and DELETE```.
• Linux Shellアクセスできる機器増えてるので、Switchに載るGateway作るとか?• OpenFlowでもなんでも、RESTでアクセスできるように。
ネットワーク API のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 26
Appendixプログラムするのに知っておきたい事
ネットワーク API のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 27
ベンダーが作成している?ライブラリ• 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 のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 28
Slide 40, JANOG36, IDCF井上さんhttp://www.janog.gr.jp/meeting/janog36/download_file/view/188/170
まとめ
ネットワーク API のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 29
• API色々サポートされてるよ
• まだベンダー事に独自だよ• RESTはひどく違うよ。てか、RESTじゃないし。
• 開発のためのライブラリは出てきてるけど、まだまだ足りない?
• Open Sourceも出てきたよ。でも、まだまだ発展途上。
• 違いを吸収する何かが必要• OpenDaylight等、NMS / ミドル?• Linux Shellアクセス可能な機器増えてるので、機器に載るGateway作れば良いのでは?
• ネットワークプログラミング始めるには十分な環境なのでは?
ネットワーク API のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 30
まとめ
ディスカッション(皆さんに聞いてみたいコト)
ネットワーク API のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 31
ネットワーク API のあれこれ|ENOG37@燕三条 2016/02/19|@ebiken 32
ちょっとアンケート(あなたの気持ちは?)
1. システム開発は外注するよ• Do you really want to Program, Write Code?
• NMSはSIerが作ってくれるから。
• お金と時間ある人はこちらで。
2. ミドルウェア経由で作るよ• どうせ機器間の違いを吸収するミドルウェア必要なんじゃない?(ODLとか)
• ミドル作る人が頑張ればAPIの種類はどうでも良い?あれば良い。
• ほんとにODLとか使いたい?やりたい事のわりに複雑じゃない?
3. ライブラリ使ってやります。• 開発はしたいけど、機器毎にライブラリ用意してもらったらAPIは気にしなくてOK?
• Python, Ruby, Go?
• ライブラリは誰が作るんだっけ?
4. API直接使いたい!• システム小さいし。
• APIが必要:既存監視システム、NMSなどに統合したいから。
API使って自動化・プログラミング進めたいと言う人。どのスタンス?