Cisco Japan Blog
Share

Prime Infrastructure REST API と IOS CLI を使って Config を自動化


2016年11月11日


前回、ポリシーベースでネットワークを管理する APIC-EM の API を紹介しました。ポリシーベースでのネットワーク管理は、今後、増加していくことは間違いありませんが、ポリシーベースを補完できるフィーチャーベースの Config も依然として併用されます。今回、紹介する Prime Infrastructure (PI) には Apache VTL (Velocity Template Language)popup_icon を使ってコマンドラインをテンプレート化して適用できる CLI テンプレートと、APIC-EM CMX の記事で紹介してきた REST API が実装されています。この 2つを利用すると Config の自動化を容易に行うことができます。

今回は PI にデフォルトで用意されているテンプレートを使ってみます。これらの中にはポートの VLAN を変更するテンプレートがあるので、例えば、他のシステムと連携して自動的にポートの VLAN を変更することができたりします。また、Cisco.com ID を取得すれば誰でもクラウドデモ環境 Cisco dCloud で PI が利用できますので、NBI (Northbound Interface) へのアクセス権限が付与されたユーザーを PI で作成することによって REST API を使うことができます。API の詳細については DevNetのPIのサイト の Documents タブにリファレンスやチュートリアルなどがありますので、他の API についても試してみてください。

Python REST API へアクセス

では、実際の開発環境を紹介していきます。ここでは、以前の記事で Python を利用したときと同じ環境でインタラクティブ モードを使っていきます。シェル(Windows の場合、コマンドプロンプト)で「python」と入力するとプロンプト「>>>」が表示され、インタラクティブ モードが起動します。API のレスポンスのデータ フォーマットは XML と JSON の 2種類ありますが、今回は JSON 形式を使います。

最初に Requests モジュールと JSON モジュールをインポートし、まずは「変数 = 値」という形式で変数に PI の情報を代入しておきます。

(以下、すべて大文字の単語は環境に合わせた値、イタリック体はレスポンスです)

>>> import requests
>>> import json
>>> pi_url = ‘https://<PI>/webacs/api/v1/’
>>> username = ‘USERNAME’
>>> password = ‘PASSWORD’
>>> print pi_url, username, password
https://<PI>/webacs/api/ v1/ USERNAME PASSWORD

ポートの VLAN を変更するデフォルトのテンプレートは「Configure Interface」という名前です。GUI か以下の API、どちらでも内容を確認することができます。

>>> get_template_json = requests.get(pi_url + ‘data/CliTemplate.json?.full=true&name=”Configure Interface”‘, auth=(username, password)).json()
>>> print json.dumps(get_template_json, indent=4)
{
    “queryResponse”: {
        …,
        “entity”: [
            {
                “cliTemplateDTO”: {
                    …,
                    “content”: …,
                    …,
                    “variables”: {
                        “variable”: [
                            …
                        ]
                    },
                    “name”: “Configure Interface”
                },
                …
            }
        ],
        …
    }
}

“content”の始まりが以下のようになっているので、変数 ${InterfaceName}、${A1}、${StaticAccessVLan} の 3つに値を入れるということがわかります。また、”variable”に各変数の情報がありますので、型などを確認できます。

#if (${InterfaceName})
interface ${InterfaceName}
#if (${Description} != “”)
description ${Description}
#end
#if(${A1}  == “Access”)
switchport mode access
#if(${StaticAccessVLan} != “”)
switchport ACCess vlan ${StaticAccessVLan}
#end
#end

まず、テンプレートを適用したいデバイスのIDが必要なので、デバイス情報へアクセスする API を使い、ID を抽出します。デバイスの名前や IP アドレスなど管理している方法で取り出すことができますが、今回は名前を使ってみます。

>>> device_name = ‘DEVICENAME’
>>> get_device_json = requests.get(pi_url + ‘data/Devices.json?.full=true&deviceName=’ + device_name, auth=(username, password)).json()
>>> device_id = get_device_json[‘queryResponse’][‘entity’][0][‘devicesDTO’][‘@id’]
>>> print device_id
1234567

次に VLAN を変更するポートと VLAN の情報を入れ、テンプレートを適用する API へアクセスします。他のシステムと連携するような実環境ではこれらの値や適用先のデバイスの情報が渡されます。

>>> interface = ‘gi1/1/1’
>>> vlan = 111
>>> payload = {‘cliTemplateCommand’: {‘templateName’: ‘Configure Interface’, ‘targetDevices’: {‘targetDevice’: {‘targetDeviceID’: device_id, ‘variableValues’: {‘variableValue’: [{‘name’: ‘InterfaceName’, ‘value’: interface}, {‘name’: ‘StaticAccessVLan’, ‘value’: vlan}, {‘name’: ‘A1’, ‘value’: ‘Access’}]}}}}}
>>> put_config_json = requests.put(pi_url + ‘op/cliTemplateConfiguration/deployTemplateThroughJob.json’, auth=(username, password), data=json.dumps(payload), headers={‘content-type’: ‘application/json’}).json()

リプライとしてジョブが渡されますのでジョブを抽出し、ジョブのステータスを確認する API へアクセスします。

>>> job_name = put_config_json[‘mgmtResponse’][‘cliTemplateCommandJobResult’][‘jobName’]
>>> print job_name
JobCliTemplateDeployIOSDevices12_34_56_789_AM_10_10_2016
>>> print requests.get(pi_url + ‘op/jobService/runhistory.json?jobName=’ + job_name, auth=(username, password)).text
{“mgmtResponse”:{“@responseType”:”operation”, …}}

mgmtResponse の job 内の jobStatus でジョブのステータスがわかります。「COMPLETED」でない場合は完了していないので、最後のコードを再度、実行してください。

これを実際のプログラミングで行う場合は、while 文と time モジュールの sleep() 関数を組み合わせて同等の処理を行います。

今回、GET Devices、PUT deployTemplateThroughJob、GET runhistory の 3つの API を使えば任意のデバイスへ Config を適用、確認できることを紹介しました。CLI に慣れ親しんでいるネットワーク エンジニアもテンプレートを自作して自動化を試しやすいかと思います。

DevNet で提供しているLearning Labspopup_icon の学習用コンテンツの参考和訳の提供を始めました。まずはコーディングの初級編として APIC-EM を使った REST API の使い方をセルフペースで学習可能です。今後もコンテンツが増えていく予定ですので、以下のサイトをチェックしてみてください。

https://supportforums.cisco.com/ja/document/13143641

 

Tags:
コメントを書く