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 で必要なライブラリをインストールします。
動作しないスクリプト¶
以下は「CML 上にラボを作成し、pyats でノードに対して show version を実行する」という Python のサンプルスクリプトです。
#!/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) を追加しています。
#!/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)