シスコサポートコミュニティ
キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

ACI: Phython を用いた APIC の設定

はじめに

ACI に関しては、ACI How To というポータルサイトに情報を集約しています。 そのため、設定やトラブルシューティング等、ACI に関する情報収集はまず、ACI How To をご参照ください。

このコンテンツも Python を用いた設定 というタイトルで同様の内容が掲載されています。 

 

APIC REST API

REST クライアントを用いた設定 にも書かれている通り、APIC は GUI 経由の設定変更・管理だけでなく、REST API で操作を行うことが可能です。 ここでは、Python を用いて設定を行う例を説明します。

 

Python 開発環境の準備

Python を実行するためには、Python の開発環境を準備する必要があります。 既に開発環境として Eclipse を用いている場合には、PyDev をインストールすることで Eclipse 上で Python を使用することが可能になります。

 

Eclipse … オープンソースのIDE(統合開発環境)

PyDev … EclipseでPythonプログラミングを行う際に使用するプラグイン

 

また、requests ライブラリ を使用しているため git もしくは pip 等で取得してセットアップしておいてください。 開発環境については、ACI Toolkit の活用 にも説明があるため、合わせてご参照ください。

 

ここでは、開発環境として PyCharm を用いています。

 

 

 

1. 開発コードの流れ

今回は、REST クライアントを用いた設定 同様の処理を、Python を用いて行ってみます。

処理の流れとして、まず、APIC へのログイン認証を行い、その後、テナントを作成します。

 

2. ログイン認証

ログイン認証については、Using Tools for API Development and Testing の例をそのまま用います。 (5 行目 base_url と 9 行目 name, pwd は実際にログインする APIC のアドレス、ユーザ名、パスワードに変更する必要があります。)

 

 
  1. import json  
  2. import requests  
  3.   
  4.   
  5. base_url = 'https://apic1/api/'  
  6.   
  7.   
  8. # create credentials structure  
  9. name_pwd = {'aaaUser': {'attributes': {'name''admin''pwd''Admin1234'}}}  
  10. json_credentials = json.dumps(name_pwd)  
  11.   
  12.   
  13. # log in to API  
  14. login_url = base_url + 'aaaLogin.json'  
  15. post_response = requests.post(login_url, data=json_credentials)  
  16.   
  17.   
  18. # get token from login response structure  
  19. auth = json.loads(post_response.text)  
  20. login_attributes = auth['imdata'][0]['aaaLogin']['attributes']  
  21. auth_token = login_attributes['token']  
  22.   
  23.   
  24. # create cookie array from token  
  25. cookies = {}  
  26. cookies['APIC-Cookie'] = auth_token  

 

3. テナント作成

Using Tools for API Development and Testing の例では、この後に sensor の情報を取得するコードが書かれていますが、今回は cisco テナントを作成するためREST クライアントを用いた設定 で POST しているデータと同様のデータを Python を用いて POST します。 (上記ログイン処理の後に下記コードを追記しています。)

 

 

 
  1. # create a tenant  
  2. tenant_url = base_url + 'node/mo/uni/tn-cisco.json'  
  3. post_payload = {  
  4.                    "fvTenant": {  
  5.                      "attributes": {  
  6.                        "dn""uni/tn-cisco",  
  7.                        "name""cisco",  
  8.                        "rn""tn-cisco",  
  9.                        "status""created"  
  10.                      },  
  11.                      "children": []  
  12.                    }  
  13.                 }  
  14. post_response = requests.post(tenant_url, data=json.dumps(post_payload), cookies=cookies, verify=False)  
  15.   
  16. # display post data response  
  17. print post_response.json()  

 

このコードを実行すると、REST クライアントを用いた設定 同様、{ 'imdata' : [] } という応答がコンソール上に表示され、GUI でも cisco テナントが作成されていることが確認できます。

他の設定を行いたい場合、tenant_url と post_payload 部分を変更するだけでよく、使いまわしができるので、一度作成しておくと Python を用いた設定が簡単に行えるようになります。

 

apic_rest_python01.png

 

apic_rest_python02.png

 

4. 複数テナントの作成

これだけの処理を行うのであれば、Postman で充分で、Python を用いた利点がわからないので、コードを改良し、複数テナントを一度に作成してみたいと思います。

 

 
  1. # create multiple tenants  
  2. base_name = 'cisco'  
  3. for i in range(3):  
  4.     val = base_name + str(i)  
  5.     tenant_url = base_url + 'node/mo/uni/tn-' + val + '.json'  
  6.     post_payload = {  
  7.                        "fvTenant": {  
  8.                          "attributes": {  
  9.                            "dn""uni/tn-" + val,  
  10.                            "name": val,  
  11.                            "rn""tn-" + val,  
  12.                            "status""created"  
  13.                          },  
  14.                          "children": []  
  15.                        }  
  16.                     }  
  17.   
  18.     post_response = requests.post(tenant_url, data=json.dumps(post_payload), cookies=cookies, verify=False)  
  19.   
  20.     # display post data response  
  21.     print val  
  22.     print post_response.json()  

 

上記は、for ループを使い、テナント名の後ろに 0-2 という番号を付けたテナントを作成している例です。 先ほどの cisco と書かれていた部分に val (cisco0 - cisco2) という変数を入れているだけです。

これを実行すると、下記のような結果になります。

 

apic_rest_python03.png

apic_rest_python04.png

 

5. テナントの削除

作成したテナントを 1 つ 1 つ手動で削除するのは大変なので、削除も Python を使用したいと思います。

先ほどまでは、ログイン処理とテナント処理について同じファイル内に書いていましたが、ログイン処理は他のコードでも使いまわししやすいよう、今回は別ファイルとして保存しています。

 

 
  1. ### login.py ###  
  2. import json  
  3. import requests  
  4.   
  5. def login(base_url, username, password):  
  6.   
  7.     # create credentials structure  
  8.     name_pwd = {'aaaUser': {'attributes': {'name': username, 'pwd': password}}}  
  9.     json_credentials = json.dumps(name_pwd)  
  10.   
  11.     # log in to API  
  12.     login_url = base_url + 'aaaLogin.json'  
  13.     post_response = requests.post(login_url, data=json_credentials, verify=False)  
  14.   
  15.     # get token from login response structure  
  16.     auth = json.loads(post_response.text)  
  17.     login_attributes = auth['imdata'][0]['aaaLogin']['attributes']  
  18.     auth_token = login_attributes['token']  
  19.   
  20.     # create cookie array from token  
  21.     cookies = {}  
  22.     cookies['APIC-Cookie'] = auth_token  
  23.   
  24.     return cookies  

 

 
  1. ### deltenant.py ###  
  2. import json  
  3. import requests  
  4. import login  
  5.   
  6. base_url = 'https://apic1/api/'  
  7. username = 'admin'  
  8. password = 'Admin1234'  
  9.   
  10. # login and get cookies  
  11. cookies = login.login(base_url, username, password)  
  12.   
  13. # delete multiple tenants  
  14. base_name = 'cisco'  
  15. for i in range(3):  
  16.     val = base_name + str(i)  
  17.     tenant_url = base_url + 'node/mo/uni.json'  
  18.     post_payload = {  
  19.         "polUni":{  
  20.             "attributes":{  
  21.                 "dn":"uni",  
  22.                 "status":"modified"  
  23.             },  
  24.             "children":[{  
  25.                 "fvTenant":{  
  26.                     "attributes":{  
  27.                         "dn":"uni/tn-" + val,  
  28.                         "status":"deleted"  
  29.                     },  
  30.                     "children":[]  
  31.                 }  
  32.             }]  
  33.         }  
  34.     }  
  35.     post_response = requests.post(tenant_url, data=json.dumps(post_payload), cookies=cookies, verify=False)  
  36.   
  37.   
  38.     # display post data response  
  39.     print val  
  40.     print post_response.json()  

 

apic_rest_python05.png

apic_rest_python06.png

 

6. おわりに

今回は、テナントを作成するという簡単な設定を行いましたが、Cobra SDK と呼ばれる APIC Python SDK も公開されているので、より大規模な設定を行う場合には、こちらもご利用ください。

 
 
バージョン履歴
改訂番号
1/1
最終更新:
‎07-24-2015 06:02 PM
更新者:
 
ラベル(1)