Cisco Application Policy Infrastructure Controller Enterprise Module (APIC-EM)がリリースされました。DevNet の APIC-EM のサイトで EFT バージョンの情報や Sandbox によるリモート アクセス ラボが無料で提供されているのでご存知の方もいるかと思います。APIC-EM には GUI も用意されており、API でも GUI の機能が実行可能となっています。今回は GUI の機能と API を比較していきます。実行環境は、実機でもSandboxでも可能です。
Postman で REST API へ簡易アクセス
APIC-EM は認証にトークンを使用しているため、ブラウザのみでは REST API を試すことができません。ただし、例えば Google Chrome のプラグイン「Postman」を利用することで GUI で REST API を試すことができるようになります。
手順は『APIC-EM “Hello World” for Northbound REST API』の「Make a request with a GUI」をご覧ください。
REST API を使ってどんな情報が取得できるかは Postman だけでも確認できます。他の API についてもリファレンスを参考にしながら試してみてください。
Python で REST API へアクセス
CMX API の記事で Python を利用したときと同じ環境でインタラクティブ モードを使っていきます。
シェル(Windows の場合、コマンドプロンプト)で「python」と入力するとプロンプト「>>>」が表示され、インタラクティブ モードが起動します。まずは「変数 = 値」という形式で変数に APIC-EM の情報を代入しておきます。
(以下、すべて大文字の単語は環境に合わせた値、イタリック体はレスポンスです)
>>> controller_url = ‘https://<APIC-EM>/api/v1/’
>>> auth = {'username': 'USERNAME', 'password': 'PASSWORD'}
>>> print controller_url, auth
https://<APIC-EM>/api/v1/ {'username': 'USERNAME', 'password': 'PASSWORD'}
APIC-EM の REST API は JSON 形式なので、Requests モジュールと JSON モジュールをインポートし、ヘッダーで content-type に application/json を指定しておきます。まずはトークンとなる Service Ticket を取得する API へアクセスします。
>>> import requests
>>> import json
>>> ticket = requests.post(controller_url + 'ticket', data=json.dumps(auth), headers={'content-type': 'application/json'})
>>> print ticket.text
{"response":{"serviceTicket":"ST-12-ABCDEFGHIJKLMNOPQRST-CAS"},"version":"1.0"}
JSON 形式でレスポンスが返ってきて、Service Ticket を取得できていることがわかります。この Service Ticket を文字列にして API へアクセスするときにヘッダーへ入れます。
>>> service_ticket = ticket.json()['response']['serviceTicket']
>>> print service_ticket
ST-12-ABCDEFGHIJKLMNOPQRST-CAS
では、最初の例として GUI の Navigation Pane にある Device Inventory の情報を取得する API にアクセスすることにします。
>>> get_device = requests.get(controller_url + 'network-device', headers={'X-Auth-Token': service_ticket})
>>> print get_device.text
{"response":[{…},…],"version":"1.0"}
JSON の構造を理解しやすいようにインデントを入れた形でエンコーディングしてみます。
>>> print json.dumps(get_device.json(), indent=4)
{
"version": "1.0",
"response": [
{
…
},
…
]
}
“response”の内容がGUIのDevice Inventoryの情報を網羅しているのが確認できます。
次に GUI のNavigation Paneにある Host Inventory の情報を取得する API へアクセスし、Python で値を扱うため、JSON の配列とオブジェクトをそれぞれ Python のリストと辞書へ変換します。
>>> get_host_json = requests.get(controller_url + 'host', headers={'X-Auth-Token': service_ticket}).json()
>>> print get_host_json
{u'version': u'1.0', u'response': [{…, u'hostIp': u'65.1.1.83', …}, {…, u'hostIp': u'212.1.10.20', …}, …]}
“response”の内容が GUI の Host Inventory の情報と同等であることが確認できます。
次回、Host IP をプログラム内で利用するために Host IP をリストで取り出しておきます。
>>> host_list = [i['hostIp'] for i in get_host_json['response']]
>>> print host_list
[u'65.1.1.83', u'212.1.10.20',…]
最後にGUIで実装しているアプリの1つ、Topology の情報を取得する API へアクセスしてみます。
>>> print json.dumps(requests.get(controller_url + 'topology/physical-topology', headers={'X-Auth-Token': service_ticket}).json(), indent=4)
{
"version": "1.0",
"response": {
"nodes": [
{
…,
"id": "01234567-89ab-cdef-0123-456789abcdef",
…,
},
{
…,
"id": "fedcba98-7654-3210-fedc-ba9876543210",
…,
},
…
],
"links": [
{
…,
"target": "01234567-89ab-cdef-0123-456789abcdef ",
…,
"source": " fedcba98-7654-3210-fedc-ba9876543210",
…
},
…
]
}
}
“nodes”の”id”を参照して”links”の”source”と”target”をつなぐとGUIのTopologyと同様なことが確認できます。
例えばネットワーク図を描写するようなモジュールを使い、これらの情報を利用すれば以下のような簡易的なネットワーク図も自動的に作成できます。
次回は複数のAPIを組み合わせて、GUIで実装しているアプリである Path Trace を API で実行してみます。