ミッション:APIC-EM から管理対象ネットワーク のトポロジを取得して Spark にポスト

ご利用のコンピュータを設定する方法
このラボの作業を行うには、事前設定済みの dCloud ラボを使用するか、自身のコンピュータを
セットアップしてください。詳細については、イベントの準備 [英語] モジュールとラボの設定
[英語] モジュールを確認してください。
ミッション:APIC-EM から管理対象ネットワーク
のトポロジを取得して Spark にポストする
このミッションでは、REST API コールに関するすべての知識を活用して、APIC-EM からトポロ
ジ情報を取得し、結果を Spark にポストします。
ミッションの目的
所要時間:25 分
•
•
Python コードを変更して REST API コールを行い、APIC-EM からトポロジ情報を取得
する
出力を Spark ルームにポストする
前提条件
背景
•
このラボを開始する前に、REST API および Python [英語] モジュールを確認して完了
することを強くお勧めします。
APIC-EM コントローラへのアクセス
APIC-EM コントローラが未導入の場合は、シスコの APIC-EM コントローラを使用できます。
1. APIC-EM コントローラを利用できる dCloud に接続する方法については、「Lab Setup
(ラボの設定)」モジュールを参照してください。
2. 接続すると、IP アドレス https://198.18.129.100/ を使用して APIC-EM コントローラにアク
セスできるようになります。コントローラのログイン クレデンシャルは、ユーザ名:admin、
パスワード:C1sco12345 です。
Spark から認証トークンを取得
1. Spark 開発者 [英語] ページから個人用の認証トークンを取得する必要があります。
Python スクリプト:apic_em_mission.py
# import requests library
import requests
# import json library
import json
# Disable warnings
requests.packages.urllib3.disable_warnings()
# MISSION: Assign the APIC-EM IP address to the CONTROLLER variable
CONTROLLER = None
# MISSION: Assign your authentication token obtained from Spark's Developer
page
AUTH = None
def getTicket():
# MISSION: Provide the APIC-EM username
username = None
# MISSION: Provide the password for the username defined above
password = None
if CONTROLLER == None or username == None or password == None:
print("Please assign values to the CONTROLLER, username and password
variables.")
exit(1)
# put the ip address or dns of your apic-em CONTROLLER in this url
url = "https://" + CONTROLLER + "/api/v1/ticket"
# the username and password to access the APIC-EM Controller
payload = {"username": username, "password": password}
# Content type must be included in the header
header = {"content-type": "application/json"}
# Performs a POST on the specified url to get the service ticket
response = requests.post(url, data=json.dumps(payload), headers=header,
verify=False)
print(response)
# convert response to json format
r_json = response.json()
# parse the json to get the service ticket
ticket = r_json["response"]["serviceTicket"]
return ticket
def getTopology(ticket):
# Final Result
result = []
# MISSION: Assign the function name to the api_call variable to retrieve
the physical topology
api_call = None
if api_call == None:
print("Please assign a function call to variable api_call.")
exit(1)
# URL for topology REST API call to get list of existing devices on the
# network, and build topology
url = "https://" + CONTROLLER + "/api/v1" + api_call
# Content type as well as the ticket must be included in the header
header = {"content-type": "application/json", "X-Auth-Token": ticket}
# this statement performs a GET on the specified network device url
response = requests.get(url, headers=header, verify=False)
# convert data to json format.
r_json = response.json()
# Iterate through network device data and list the nodes, their
# interfaces, status and to what they connect
for n in r_json["response"]["nodes"]:
found = 0 # print header flag
printed = 0 # formatting flag
for i in r_json["response"]["links"]:
# Find interfaces that link to this one which means this node is
# the target.
if i["target"] == n["id"]:
if found == 0:
if printed == 1:
print()
#print('{:>10}'.format("Source") +
'{:>30}'.format("Source Interface") + '{:>25}'.format("Target Interface") +
'{:>13}'.format("Status"))
result.append('\n' + '{:>10}'.format("Source") +
'{:>30}'.format(
"Source Interface") + '{:>25}'.format("Target
Interface") + '{:>13}'.format("Status"))
found = 1
for n1 in r_json["response"]["nodes"]:
# find name of node to that connects to this one
if i["source"] == n1["id"]:
if "startPortName" in i:
#print("
" + '{:<20}'.format(n1["label"]) +
'{:<25}'.format(i["startPortName"]) + '{:<23}'.format(i["endPortName"]) +
'{:<8}'.format(i["linkStatus"]))
result.append("
" +
'{:<20}'.format(n1["label"]) + '{:<25}'.format(
i["startPortName"]) +
'{:<23}'.format(i["endPortName"]) + '{:<8}'.format(i["linkStatus"]))
else:
#print("
" + '{:<20}'.format(n1["label"]) +
'{:<25}'.format("unknown") + '{:<23}'.format("unknown") +
'{:<8}'.format(i["linkStatus"]))
result.append("
" +
'{:<20}'.format(n1["label"]) + '{:<25}'.format(
"unknown") + '{:<23}'.format("unknown") +
'{:<8}'.format(i["linkStatus"]))
break
return(result)
# Returns the Spark room ID for the user selected Spark room.
def get_roomID():
# API Call for rooms
api_call = "rooms"
if AUTH == None:
print("Please assign your Spark authorization token to variable
AUTH.")
exit(1)
# Cisco Spark's API URL address
url = "https://api.ciscospark.com/v1/" + api_call
# Content type as well as the authorization must be included in the
header
header = {"content-type": "application/json; charset=utf-8",
"Authorization": "Bearer " + AUTH}
# this statement performs a GET on the specified network device url
response = requests.get(url, headers=header, verify=False)
r_json = response.json()
for item in r_json["items"]:
print("Title " + item["title"])
print("Room ID " + item["id"] + "\n\n")
user_input = input(
"Is this the room you are looking for to post?[y/n] ")
if user_input.lower() == 'y' or user_input.lower() == 'yes':
return item["id"]
else:
continue
#Posts message to the passed in Spark room.
def post_spark(text, room_id):
# API Call to for messages
api_call = "messages"
# Cisco Spark's API URL address
url = "https://api.ciscospark.com/v1/" + api_call
# Content type as well as the authorization must be included in the
header
header = {"content-type": "application/json; charset=utf-8",
"Authorization": "Bearer " + AUTH}
payload = {
"roomId": room_id,
「text": '\n'.join(text)
}
# this statement performs a GET on the specified network device url
response = requests.post(url, data=json.dumps(
payload), headers=header, verify=False)
print("\nCheck the Spark Room.You've just posted a message!")
if __name__ == "__main__":
# Get authentication ticket from APIC-EM
theTicket = getTicket()
# Use authentication ticket to get the topology information
message = getTopology(theTicket)
# Get the room ID
id = get_roomID()
# Use room ID and retrieved topology information to post in the Spark
room
post_spark(message, id)
ガイドライン
1.
2.
3.
4.
5.
devnet-express-code-samples\module05\05-lab-04-mission ディレクトリを特定します。
apic_em_mission.py ファイルを開きます。
MISSION: タグを検索し、それぞれについて要求されたタスクを実行します。
スクリプトを実行します。必要に応じて修正します。
メッセージをポストするルームを選択し、選択したルームでメッセージを確認します。
ステップ 2:Git リポジトリを複製する
Git リポジトリの複製
•
•
•
•
•
•
ターミナルを開きます。
cd \ と入力して、ルート ディレクトリに移動します。
mkdir DevNetCode\<your-name> と入力して、「C:\DevNetCode\yourname」というディ
レクトリを作成します。
o 例:mkdir DevNetCode\armartirosyan
cd \DevNetCode\<your-name> と入力して、新しいディレクトリに移動します。
o 例:cd \DevNetCode\armartirosyan
GitHub から devnet-express-code-samples リポジトリを複製します。次のコマンドを入力し
ます。
git clone https://github.com/CiscoDevNet/devnet-express-codesamples.git
作成したディレクトリに「devnet-express-code-samples」ディレクトリが確認できるはずで
す。現在のディレクトリを cd devnet-express-code-samples\module05\05-apic-04mission\ で変更し、dir コマンドを実行して内容を確認します。apic_em_mission.py
ファイルが表示されます。このファイルには、コード サンプルが含まれています。これを
変更してミッションを完了します。
apic_em_mission.py ファイルを開いて確認します。情報の不足箇所を特定し、入力を補う必
要があります。そうしないとコードが実行できません。
入力が必要な情報
•
•
•
•
•
APIC-EM の IP:URL または IP
ユーザ名:APIC-EM の UI の認証を受けるユーザ名
パスワード:上のユーザ名に関連付けられたパスワード
API コール:APIC-EM から物理トポロジ情報を取得する値を設定します。
注:この値の先頭は / 記号にする必要があります。『API Reference Guide(API リファレ
ンス ガイド)』[英語] を参照してください。
Spark 認証:Spark で生成された認証トークンを設定します。
ステップ 3:APIC-EM 情報
このステップでは、APIC-EM 部分に関連して不足している情報を入力する際に必要な情報を
示します。
1. モジュール 5 のラボ 1 を確認してください。APIC-EM の URL とユーザ名/パスワードに
関する情報が提供されています。APIC-EM 部分で必要な値を書き留めておきます。
2. 次に Web ブラウザで APIC-EM の API [英語] ドキュメントの Web ページに移動します。
[サービス(Services)] 列でトポロジ サービスを探してクリックします。ページの中央で
[トポロジ(topology)] をクリックすると、関連するすべての API コールが表示されます。
物理トポロジ情報を取得する API コールを選択し、スクリプトに適切な値を入力します。
注:値の先頭は / 記号にしないとコードを実行できません。
ステップ 4:Spark から認証トークンを取得
このステップでは、Spark の開発者 Web サイトから認証トークンを取得して、Spark ルームにテ
キストを投稿する方法を確認します。
1. 任意のブラウザを開き、Spark 開発者 [英語] ページに移動します。すでにアカウントが
ある場合は、[ログイン(Log In)] オプションをクリックします。シスコの Spark ページに初
めてアクセスする場合は、[サインアップ(Sign Up)] ボタンをクリックして新しいアカウント
を作成します。ここで必要になるのは、アクセス可能な電子メール アドレスだけです。そ
のアドレスに送信される確認リンクをクリックして、アカウントをアクティブにします。Spark
サービスは無償で利用できます。
2. 認証が成功したら、自分のアバターをクリックします。Spark に自分のアクセス トークンが
表示されます。値をコピーしてコードに貼り付けます。
ステップ 5:スクリプトを実行する
このステップでは、選択した Spark ルームにトポロジ情報をポストするスクリプトを実行します。
1. コマンドライン ターミナル ウィンドウを開き、完成した Python スクリプトが保存されている
作業ディレクトリに移動します。
2. py -3 apic_em_mission.py コマンドを使用してスクリプトを実行します。ルームのタイト
ルと ID 情報が表示されます。キーボードの y を押して、メッセージをポストするルームを
選択します。メッセージがポストされると、スクリプトから、選択した Spark ルームを確認す
るように要求されます。
3. 最後に、コードにより、実際に APIC-EM から収集したトポロジ情報が Spark ルームにポ
ストされるかを確認します。それには、Cisco Spark ページに移動して、電子メール アド
レスを使用して認証を受けます。スクリプトの実行時に選択したルームをクリックします。
APIC-EM からのトポロジ情報がポストされたことを確認できます。
s
これでミッションに合格しました。