Skip to content

CML 上のノードを virl2-client (pyATS) で操作する

pyats を使うことでネットワーク機器の操作を自動化することが出来ます。 CML 上に作成したラボであれば virl2_client を使うことで pyATS 用の testbed 用意などを簡略化しつつ、簡単にノードの操作を自動化することが出来ます。 但し、実際に virl2_client から pyats の機能を呼び出すには少しコツがあるようです。 今回は CML 上のノードを pyats 経由で操作するスクリプトの「問題があるバージョン」「修正したバージョン」をメモしておきます。

検証環境

対象 バージョン
macOS 15.0
Cisco CML 2.7.2+build.26
Python 3.11.10
pyats 24.9
virl2-client 2.7.1

インストール

uv で必要なライブラリをインストールします。

uv pip install pyats virl2_client

動作しないスクリプト

以下は「CML 上にラボを作成し、pyats でノードに対して show version を実行する」という Python のサンプルスクリプトです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/usr/bin/env python3

from virl2_client import ClientLibrary

URL = "https://10.0.0.1"
USER = "admin"
PASS = "password"

cl = ClientLibrary(URL, USER, PASS, ssl_verify=False)
lab = cl.create_lab("Lab1")
node = lab.create_node("r1", "iosv", 0, 0)
node.config = "hostname router1"
lab.start(wait=True)
result = node.run_pyats_command("show version")
print(result)

ですが、このスクリプトを実行してもエラーになります。 具体的には run_pyats_command(command: str)→ str 部分でエラーになっているようです。

$ python3 sample.py
SSL Verification disabled
Traceback (most recent call last):
  File "sample.py", line 15, in <module>
    result = node.run_pyats_command("show version")
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".venv/lib/python3.11/site-packages/virl2_client/models/node.py", line 812, in run_pyats_command
    return self.lab.pyats.run_command(label, command)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".venv/lib/python3.11/site-packages/virl2_client/models/cl_pyats.py", line 208, in run_command
    return self._execute_command(
           ^^^^^^^^^^^^^^^^^^^^^^
  File ".venv/lib/python3.11/site-packages/virl2_client/models/cl_pyats.py", line 172, in _execute_command
    pyats_device: Device = self._testbed.devices[node_label]
                           ^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'devices'

修正版のスクリプト

この問題は run_pyats_command(self, command: str) を実行する前に sync_testbed(username: str, password: str)→ None を呼び出すことで解決するようです。 以下は修正版のスクリプトです。 14 行目に sync_testbed(self, username: str, password: str) を追加しています。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/usr/bin/env python3

from virl2_client import ClientLibrary

URL = "https://10.0.0.1"
USER = "admin"
PASS = "password"

cl = ClientLibrary(URL, USER, PASS, ssl_verify=False)
lab = cl.create_lab("Lab1")
node = lab.create_node("r1", "iosv", 0, 0)
node.config = "hostname router1"
lab.start(wait=True)
lab.pyats.sync_testbed(USER, PASS)
result = node.run_pyats_command("show version")
print(result)

参考