API on Meraki: Meraki REST APIを使ってみる

このエントリーはMerakiでのREST APIの概要と、REST APIを使ってMerakiから情報を取得するところまで。

製品概要


Merakiは他の製品と大きく異なるので、簡単に紹介。

Merakiの主力製品はCiscoと同じくネットワーク機器。Cisco製品との住み分けは下のイメージ(あくまで主観)

Ciscoは基本的には大きめの企業向け。SDNに対しては大企業が社内の統合環境を構築するのを推進している。レガシーな機能のみでももちろん使える。

Merakiの狙いは企業規模というよりは構築形態が分散型のネットワーク向け。SDN的な要素を使うためのハードルがCiscoに比べてとても低い。Ciscoが厳格な管理のもとで統合環境を適用するのに対して、Merakiはそこが抽象化されているので緩やか。

API概要


MerakiはSaaSで管理を提供しているので、それぞれの機器ではなく管理サービスがAPIを提供している。

API参照資料は以下の通り

Dashboard API: https://dashboard.meraki.com/api_docs

 

ラボ環境


Ciscoのオンラインラボ環境を使う。

CiscoDevNetにアクセスし、Merakiラボを選択

アクセスできるネットワークがいくつかあるが、今回はTokyo-Japanを選択

ここからは通常Merakiを管理するダッシュボードで操作ができる。

APIを使ってみる


Dashboard APIを使うには事前にAPIキーをダッシュボードから取得する。

Tokyoという名前がついたネットワークにある機器一覧を取得する。

import requests
from collections import defaultdict
from pprint import pprint

# user specified variables
apikey = "************"
place = "Tokyo"

# static variable
headers = { "X-Cisco-Meraki-API-Key": apikey, }
baseurl = "https://dashboard.meraki.com/api/v0/"

# Retrieve organization list which I'm belonging to
url = baseurl + 'organizations'
my_orgs = requests.get(url, headers=headers).json()

# Set organization which I'm going to poll
my_orgid = my_orgs[0]['id']

# Retrieve network list which is defined in this organization
url = baseurl + 'organizations/' + str(my_orgid) + "/networks"
my_networks = requests.get(url, headers=headers).json()

# Set network which I'm going to poll
for network in my_networks:
    if 'Japan' in network['name']:
        network_id = network['id']

# get devices in the network
url = baseurl + 'networks/' + str(network_id) + '/devices'
my_devices = requests.get(url, headers=headers).json()

# list numbers of respective device models
devices_dict = defaultdict(int)
for device in my_devices:
    devices_dict[device["model"]] += 1

pprint(devices_dict)

これを実行するとこんな感じで情報が返ってくる

defaultdict(<class 'int'>,
            {'MC74': 1,
             'MR30H': 1,
             'MR53': 1,
             'MR84': 1,
             'MS220-8P': 1,
             'MX65': 1})

以上