シスコのCMLをpythonから操作するための環境設定に苦戦したのでメモを残します。
結論から言えば、なぜ動作しないのかよく分からなかったけど、
コードが動作するバージョンの組み合わせを確認しました、という内容です。
CMLについて
シスコのルータについて勉強したいけど、実機を買うのは高いしかさばる。
そんな人はシミュレータCML(Cisco Modeling Labs)を使うことを考えてみてはいかがでしょうか。
最近無料ライセンスが登場したので、手軽に試せるようになりました。
導入方法は本題ではないので、別のドキュメントにゆだねます。
いくつかの方法
CMLをpythonから操作する方法は複数あります。
- virl2_clientを使う
CMLをpythonから操作するのに用意されたライブラリです。
APIからノードを起動/停止したり、リンクを起動/停止したり、インタフェイスを起動/停止したり、できます。
しかし、装置にコマンドを投入して応答を取得する、みたいなことができなくて、以下の方法を探索することになりました。(ネットワーク運用の実務では、装置に直接コマンドを投入することも多いですので。。)
- netmikoを使う
netmikoとは、ネットワーク機器にSSHで接続し、コマンドを実行できるライブラリの一つです。
virl2_clientのドキュメントでも以下のように言及されていたので、
便利なのかなと思ったけど、netmikoに関する情報が少ないのと、とりあえず後述するpyATSで動作したので、深掘りは保留中です。
The following example shows how the VIRL2 client library can be combined with Netmiko.
- pyATSを使う
今回のトラブルの主役です。
ネットワーク運用の自動化に対応するために、割と力を入れて開発されているみたいです。
動かしたいサンプルコード
ネットで見かけたサンプルコードを加工して作成しました。
from virl2_client import ClientLibrary
VIRL_CONTROLLER = "XX.XX.XX.XX"
VIRL_USERNAME = "username"
VIRL_PASSWORD = "password"
LAB_NAME = "lab_name"
TARGET_NODE = "target_node"
client = ClientLibrary(VIRL_CONTROLLER,
VIRL_USERNAME,
VIRL_PASSWORD,
ssl_verify=False)
our_lab = client.find_labs_by_title(LAB_NAME)[0]
our_lab.pyats.sync_testbed(VIRL_USERNAME, VIRL_PASSWORD)
node = our_lab.get_node_by_label(TARGET_NODE)
result = node.run_pyats_command("ping YY.YY.YY.YY timeout 1 rep 2") # タイムアウト1秒、繰り返し2回
print(result)
1行目の通り、virl2_clientを使っているのですが、
装置へのコマンドにはrun_pyats_commandを使っていて、
これを実行する前にsync_testbedをしておかないといけなくて、
その前提としてpyatsをインストールしておく必要があります。
結局バージョンが大事
以下のバージョンの組み合わせで動作しました。
CML==2.7.2
python==3.12.3
pyats==24.10
virl2_client==2.7.1
参考文献
参考にしたのは以下のページです。