キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 
cancel
告知

JTAC-Mid-Career-Recruitment-2021.8

 

ACI: Python を用いた設定

28
閲覧回数
0
いいね!
0
コメント

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 のアドレス、ユーザ名、パスワードに変更する必要があります。)

 

import json
import requests


base_url = 'https://apic1/api/'


# create credentials structure
name_pwd = {'aaaUser': {'attributes': {'name': 'admin', 'pwd': 'Admin1234'}}}
json_credentials = json.dumps(name_pwd)


# log in to API
login_url = base_url + 'aaaLogin.json'
post_response = requests.post(login_url, data=json_credentials)


# get token from login response structure
auth = json.loads(post_response.text)
login_attributes = auth['imdata'][0]['aaaLogin']['attributes']
auth_token = login_attributes['token']


# create cookie array from token
cookies = {}
cookies['APIC-Cookie'] = auth_token

 

 

3. テナント作成

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

 

 

# create a tenant
tenant_url = base_url + 'node/mo/uni/tn-cisco.json'
post_payload = {
                   "fvTenant": {
                     "attributes": {
                       "dn": "uni/tn-cisco",
                       "name": "cisco",
                       "rn": "tn-cisco",
                       "status": "created"
                     },
                     "children": []
                   }
                }
post_response = requests.post(tenant_url, data=json.dumps(post_payload), cookies=cookies, verify=False)

# display post data response
print post_response.json()

 

 

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

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

 

01.png

 

02.png

 

4. 複数テナントの作成

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

 

# create multiple tenants
base_name = 'cisco'
for i in range(3):
    val = base_name + str(i)
    tenant_url = base_url + 'node/mo/uni/tn-' + val + '.json'
    post_payload = {
                       "fvTenant": {
                         "attributes": {
                           "dn": "uni/tn-" + val,
                           "name": val,
                           "rn": "tn-" + val,
                           "status": "created"
                         },
                         "children": []
                       }
                    }

    post_response = requests.post(tenant_url, data=json.dumps(post_payload), cookies=cookies, verify=False)

    # display post data response
    print val
    print post_response.json()

 

 

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

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

 

03.png

04.png

 

5. テナントの削除

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

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

 

### login.py ###
import json
import requests

def login(base_url, username, password):

    # create credentials structure
    name_pwd = {'aaaUser': {'attributes': {'name': username, 'pwd': password}}}
    json_credentials = json.dumps(name_pwd)

    # log in to API
    login_url = base_url + 'aaaLogin.json'
    post_response = requests.post(login_url, data=json_credentials, verify=False)

    # get token from login response structure
    auth = json.loads(post_response.text)
    login_attributes = auth['imdata'][0]['aaaLogin']['attributes']
    auth_token = login_attributes['token']

    # create cookie array from token
    cookies = {}
    cookies['APIC-Cookie'] = auth_token

    return cookies

 

 

### deltenant.py ###
import json
import requests
import login

base_url = 'https://apic1/api/'
username = 'admin'
password = 'Admin1234'

# login and get cookies
cookies = login.login(base_url, username, password)

# delete multiple tenants
base_name = 'cisco'
for i in range(3):
    val = base_name + str(i)
    tenant_url = base_url + 'node/mo/uni.json'
    post_payload = {
        "polUni":{
            "attributes":{
                "dn":"uni",
                "status":"modified"
            },
            "children":[{
                "fvTenant":{
                    "attributes":{
                        "dn":"uni/tn-" + val,
                        "status":"deleted"
                    },
                    "children":[]
                }
            }]
        }
    }
    post_response = requests.post(tenant_url, data=json.dumps(post_payload), cookies=cookies, verify=False)


    # display post data response
    print val
    print post_response.json()

 

 

05.png06.png

 

6. おわりに

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