• CloudVision APIを用いたConfigの更新

 
 
Print Friendly, PDF & Email

はじめに

CloudVisionのプロビジョニングやテレメトリを利用してネットワーク運用を行いながら、様々なシステムとの連携においてもCVPを使うことも可能です。CloudVisionでは、APIドキュメントがcvp上で確認でき、開発がしやすくなっております。またCVP RestAPI用のPython Client(cvprac)が公開されています。
今回は、このPython Clientを使い、Aristaスイッチの設定をアップデートするサンプルをご紹介します。このサンプルでは、デバイスにアタッチしているConfigletを更新し、その後生成されたTaskを実行します。CVPを介して設定を行う為、実際の変更前、変更後、差分などのConfig情報は自動的にCVPの履歴で保管されます。

1. cvpracのインストール

cvpracをpipでインストールします。

~$ sudo pip install cvprac

インストール後、試しに動かしてみます。get_cvp_info()を使って、CVPのバージョンを確認してみます。

~$ python3
>>> from cvprac.cvp_client import CvpClient
>>> import urllib3
>>> urllib3.disable warnings()
>>> CVP_HOST = ["cvp1"]
>>> CVP_USER = "arista"
>>> CVP_PWD = "arista123"
>>> client = CvpClient()
>>> client.connect(CVP_HOST, CVP_USER, CVP_PWD)
>>> r = client.api.get_cvp_info()
>>> print(r)
{'version': '2020.2.1'}

2. Configletの編集

ここでは、事前にデバイスにアタッチしている’CVPRAC_VLAN’というConfigletを更新します。
まず、get_configlet_by_nameのサーチを使って’CVPRAC_VLAN’を確認してみます。

>>> r = client.api.get_configlet_by_name('CVPRAC_VLAN')
>>> print(r)
{'key': 'configlet_897086fa-f8cd-4ea8-b37d-29181676e849', 'name': 'CVPRAC_VLAN', 'reconciled': False, 'config': 'vlan 123\n name TEST1234', 'user': 'arista', 'note': '', 'containerCount': 0, 'netElementCount': 1, 'dateTimeInLongFormat': 1607670175019, 'isDefault': 'no', 'isAutoBuilder': '', 'type': 'Static', 'editable': True, 'sslConfig': False, 'visible': True, 'isDraft': False, 'typeStudioConfiglet': False}

コンフィグの内容は’config’に入ります。またConfgletのIDとして’key’があります。Configletの更新に必要な情報は、config、key、Configlet名の3つです。

>>> print(r['key'])
configlet_897086fa-f8cd-4ea8-b37d-29181676e849
>>> print(r['config'])
vlan 123
name TEST1234
>>>

update_configletを使って、単純にこのVLAN nameをTEST12345に変更してみます。

>>> r = client.api.update_configlet('vlan 123\n name TEST12345','configlet_897086fa-f8cd-4ea8-b37d-29181676e849','CVPRAC_VLAN')
>>> print(r)
{'data': 'Configlet CVPRAC_VLAN successfully updated and task initiated.'}

Configletの更新は成功し、タスクが生成されたことが確認できました。

3. タスクの実行

生成されたタスクは、Pendingとなっているので、get_tasks_by_statusでPendingとなっているタスクを確認します。

>>> r = client.api.get_tasks_by_status('pending')
>>> print(r)
[{'workOrderId': '181', 'name': '', 'workOrderState': 'ACTIVE', 'currentTaskName': 'Submit', 'templateId': 'ztp', 'data': {'IS_CONFIG_PUSH_NEEDED': 'yes', 'ZERO_TOUCH_REPLACEMENT': '', 'ERROR_IN_CAPTURING_RUNNING_CONFIG': '', 'WORKFLOW_ACTION': 'Configlet Push', 'ERROR_IN_CAPTURING_DESIGN_CONFIG': '', 'configSnapshots': [], 'ccExecutingNode': '', 'NETELEMENT_ID': '52:54:00:e7:7a:04', 'VIEW': 'CONFIG', 'extensionsRequireReboot': [], 'isDCAEnabled': False, 'INCORRECT_CONFIG_IN_CAPTURING_DESIGN_CONFIG': '', 'runningConfig': '', 'IS_AUTO_GENERATED_IN_CVP': False, 'designedConfigOutputIndex': '', 'configExistInCVP': False, 'targetIpAddress': '', 'presentImageInDevice': '', 'APP_SESSION_ID': '', 'INCORRECT_CONFIG_IN_CAPTURING_DESIGN_CONFIG_OUTPUT_INDEX': '', 'image': '', 'currentparentContainerId': 'container_490f3660-feba-4892-95dd-93e675a14695', 'imageId': [], 'imageToBePushedToDevice': '', 'newparentContainerId': 'container_490f3660-feba-4892-95dd-93e675a14695', 'sessionUsedInMgmtIpVal': '', 'isRollbackFromSnapshotFlow': False, 'preRollbackImage': '', 'IS_ADD_OR_MOVE_FLOW': False, 'ignoreConfigletList': [], 'imageIdList': [], 'designedConfig': '', 'configletList': [], 'ccId': '', 'noOfRe-Tries': 0, 'commandUsedInMgmtIpVal': '', 'isRollbackTask': False, 'imageBundleId': '', 'user': '', 'config': []}, 'createdBy': 'stani', 'executedOnInLongFormat': 0, 'executedBy': '', 'currentTaskType': 'User Task', 'workFlowDetailsId': '', 'description': 'Configlet Assign: veos1', 'workOrderUserDefinedStatus': 'Pending', 'workOrderDetails': {'workOrderDetailsId': '', 'netElementHostName': 'veos1', 'netElementId': '52:54:00:e7:7a:04', 'ipAddress': '192.168.100.141', 'workOrderId': '', 'serialNumber': '0DCC74A5C3235EFC4A5710A039AAF73E'}, 'createdOnInLongFormat': 1607672870955, 'completedOnInLongFormat': 1607672876096, 'note': '', 'taskStatus': 'ACTIVE', 'taskStatusBeforeCancel': '', 'newParentContainerName': 'demo', 'dualSupervisor': False, 'ccIdV2': '', 'stageId': '', 'netElementId': '52:54:00:e7:7a:04', 'ccId': '', 'newParentContainerId': 'container_490f3660-feba-4892-95dd-93e675a14695'}]

タスク実行に必要な情報は、’workOrderId’です。

>>> print(r[0]['workOrderId'])
181

では、execute_taskを使い、この181を実行します。(特に戻り値はありません)

>>> r = client.api.execute_task('181')
>>> print(r)
None

4. 設定を確認

実際にコンフィグが反映していることをデバイスにログインして確認してみます。

veos1#sh ru sec vlan
vlan 123
name TEST12345

では実行した結果をCVPのGUIで確認してみます。Change Controllで実行した結果を選択し、タスクのShow detailをクリックすると、変更内容の履歴もしっかりと残っています。ここでは、name TEST1234をname TEST12345へ変更するタスクであったことが確認できます。

最後に

cvpracを用いた設定変更は非常に簡単にコーディングができ、また動作も軽いので是非お試しください。ネットワーク自動化の変更管理設計においては、単に変更をAPI経由で行うだけでなく、デバイスへのアクセス管理や変更前後のコンフィグ保管や各種履歴の保管、また保管先の確保など様々な検討が必要となります。冒頭にも触れましたが、CVPを自動化システムに組み込むことで、アクセス管理や履歴管理などはそのままCVPで行え、単純に設定変更のロジックだけの検討で良いという点において、効率的に自動化を進めることができます。

リファレンス

cvpracに関する詳細な説明やリリースノートについては、github上で確認することができますので、参考にしてください。

cvprac

Follow

Get every new post on this blog delivered to your Inbox.

Join other followers: