• EOSが提供するAPI – eAPI

 
 
Print Friendly, PDF & Email

本記事では、アリスタのEOSが備えるRestfull APIであるeAPIをご紹介します。 既に多くのアリスタユーザーの方にご利用頂いている機能ではありますが、ある程度のスクリプティングを要しますので、馴染みがない方にはとっつきにくいかもしれません。 そこで、本記事では、普段あまりプログラミングされる機会が少ない方にも読み進めて頂けるような詳解を交えております。なお、本記事のコーディングにはPythonを用います。  

はじめに

詳細は本リンク先のeAPI解説ページの説明に譲りますが、eAPIはリモートホスト(場合によってはローカルホスト、つまりEOSデバイス自身)から対象のアリスタEOSデバイスへCLIコマンドを発行するためのAPIです。   %e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2017-12-03-17-17-11   データの受け渡しはJSONで行います。JSONは人間でもコンピューターでも扱いやすい形式です。そのJSONのデータをHTTP/HTTPSで運びますので、eAPIを一言で表すと、JSONRPC over HTTP/HTTPS と言えます。 参考までに、JSONとは Java Script Object Notation の略で、RFC7159で標準化されているオブジェクト表記構文です。キーとバリューのペアでデータを扱いますので、非常に可視性に優れたテキストベースのデータ構造であり、現在Web系のシステムを中心に幅広く用いられています。以下はJSON形式の一例です。


{
  “modelName”: “vEOS”,
  “internalVersion”: “4.18.1F-4591672.4181F”,
  “systemMacAddress”: “08:00:27:45:50:af”,
  “serialNumber”: “”, “memTotal”: 1893384,
  “bootupTimestamp”: 1497685107.72,
  “memFree”: 772316,
  “version”: “4.18.1F”,
  “architecture”: “i386”,
  “isIntlVersion”: false,
  “internalBuildId”: “6fcb426e-70a9-48b8-8958-54bb72ee28ed”,
  “hardwareRevision”: “”
}

 

つまり、eAPIとはEOSがサポートするあらゆるCLIコマンドを、可読性に優れ、プログラムからも扱い易いJSON形式にて、リクエストの発行及びレスポンスの取得を可能とするものです。  

eAPIを使用する為の準備

まず、eAPIをコールするPythonスクリプトを実行する環境に以下のライブラリを準備します。(例はUbuntu環境)

arista@arista:~/eAPI$ sudo apt-get install python-pip
arista@arista:~/eAPI$ sudo pip install jsonrpclib

これで、JSON形式のフォーマットを読み込むJSON RPCライブラリがインストールされます。ちなみにEOSデバイスのLinux環境にはデフォルトでインストールされています。 次に、アリスタEOSデバイス側には、以下の設定を投入し、eAPIのリクエストを受け付けられるよう準備します。(例はhttp)

vEOS # configure
(config) # management api http-commands
(config-mgmt-api-http-cmds) # protocol http
(config-mgmt-api-http-cmds) # no shutdown

これで上記が設定されたEOSデバイスにてeAPI経由でコマンドの発行が可能となりました。以上でeAPIを使用する準備は完了です。  

eAPIスクリプティングの基本

このセクションでは、非常にシンプルなeAPIスクリプトを解説致します。

-- Sample Code (Showver.py)
1:   #!/usr/bin/python 
2:   from jsonrpclib import Server 
3:   switch = Server( "http://arista:arista123@R1/command-api" ) 
4:   response = switch.runCmds( 1, [ "show version" ] ) 
5:   print response

1行目 : 使用するプログラムをShellに宣言  –> Python 2行目 : jsonrpclibからライブラリをimportし、JSONを読めるように指示 3行目 : ターゲットを定義する –> http://ユーザー名:パスワード@IPアドレス/command-api  (httpsの場合は最初をhttpからhttpsへ変更) 4行目 :  eAPI経由でCLIを実行しレスポンスを収集する 5行目 :  収集したレスポンスをprint文で標準出力へ表示する   以下に上記スクリプト (Showver.py)の実行例を示します。

arista@arista:~/eAPI$ ./Showver.py 
 [{u'memTotal': 1893384, u'internalVersion': u'4.18.1F-4591672.4181F', 
u'serialNumber': u'', u'systemMacAddress': u'08:00:27:45:50:af', 
u'bootupTimestamp': 1497685107.72, u'memFree': 813956, u'version': u'4.18.1F',
u'modelName': u'vEOS', u'isIntlVersion': False, 
u'internalBuildId': u'6fcb426e-70a9-48b8-8958-54bb72ee28ed',
 u'hardwareRevision': u'', u'architecture': u'i386'}]

一見すると判別し難い出力ですが、JSON形式、つまりキーとバリューの形式でshow versionが出力されていることがご覧頂けます。  

eAPIの実践的な活用例

(1) 出力を必要な情報のみに絞る

eAPIはJSON形式でデータの受け渡しを行うと説明しました。つまりコマンドの結果がキーとバリューのペアになっているのです。 前セクションでは単純に戻り値のJSON構造体をそのまま表示しましたが、実際は必要なキーの値だけを表示する、などの使い方が現実的でしょう。以下にサンプルコードと実行例を示します。

-- Sample Code (Showver2.py)
#!/usr/bin/python
from jsonrpclib import Server

switch = Server( "http://arista:arista123@R1/command-api" ) 
response = switch.runCmds( 1, [ "show version" ] ) 

print "The system MAC address is: ",response[0] ["systemMacAddress"] 
print "The system version is: ",response[0] ["version"] 
print "The system Model is: ",response[0]["modelName"]

arista@arista:~/eAPI$ ./Showver2.py 
The system MAC address is: 2c:c2:60:1e:88:fe 
The system version is: 4.18.1F 
The system Model is: vEOS

 

(2) 複数のEOSデバイスヘコマンドを発行する

管理対象のEOSデバイスが一台のみの場合は、スクリプティングによるメリットは多くないかもしれません。 反対に管理対象となるEOSデバイスが多くなれば、例として “同じコマンドをすべてのデバイスに手作業で発行する”などの場合に、煩雑さから解放されますので、eAPIによるスクリプティングのメリットを実感頂けると思います。以下にサンプルコードと実行例を示します。

-- Sample Code (CountVlanNumber.py)
#!/usr/bin/python
from jsonrpclib import Server

target_sw = [ 'R1', 'R2', 'R3', 'R4', 'R5' ]

for tsw in target_sw: 
  com = "http://arista:arista123@" + tsw + "/command-api"
  switch = Server(com) 
  response = switch.runCmds( 1, [ "show vlan summary" ] ) 
  print "The # of VLANs configured on " + tsw + " : ", response[0]["totalVlans"]

arista@arista:~$ ./CountVlanNumber.py 
The # of VLANs configured on R1 : 120
The # of VLANs configured on R2 : 155 
The # of VLANs configured on R3 : 225
The # of VLANs configured on R4 : 156
The # of VLANs configured on R5 : 400

 

まとめ

本記事ではeAPIを使ってアリスタEOSデバイスを操作する方法をご紹介しました。 昨今、多くのネットワークデバイスを管理するシチュエーションが増えてきていますので、記事の中でも触れた”管理対象となるEOSデバイスが多くなる”ことも珍しくありません。そのような中で、今回ご紹介したeAPIを用いて作業の効率化や手作業によるミスの軽減を実現していくことは益々重要となるでしょう。 eAPIがサポートするスクリプト言語についてはGithub上のライブラリも豊富で、本記事で扱った Python の他、RubyGo でもスクリプティング可能です。そういった意味で非常に間口が広いAPIと言えると思いますので、これらを活用し、日常の煩雑な手作業による運用等を自動化する一助として頂きたいと思います。 最後になりますが、アリスタネットワークスはeAPI以外にもEOS SDKをはじめ多様なプログラマビリティをご提供しております。今後もそういった様々なプログラマビリティを記事にしてまいりますので、乞うご期待ください。

Follow

Get every new post on this blog delivered to your Inbox.

Join other followers: