らくがきちょう

なんとなく ~所属組織/団体とは無関係であり、個人の見解です~

VIRL 2 Client Library で CML を Python から操作する

VIRL 2 Client Library を使うと Python から CML を操作することが出来ます。 簡単な Python スクリプトを書いて CML 上にラボを作成する手順をメモしておきます。

Sphinx で作成された VIRL 2 Client Library のドキュメントは CML 上から参照出来ます。 CML にログインし、ToolsClient Library からドキュメントを参照することが出来ます。

f:id:sig9:20200519095840p:plain

ライブラリのインストール

VIRL 2 Client Library を利用するには、まずインストールしておきます。

pip install virl2_client

簡単なラボを作成するサンプル

簡単なラボを作り、開始するには以下のようなスクリプトを新規作成します。 殆どの環境で CML の管理画面は初期状態のまま、自己証明書を利用していると思われますので、ssl_verify=False を指定して SSL/TLS 関連の妥当性確認をスキップします。 他にも自己証明書をインポートしたり、SSL/TLS 以外の方法で接続する、といった方法もあるかも知れません。 あとはスクリプトを実行するだけです。 これで CML 上にラボが作成されます。

from virl2_client import ClientLibrary

address = '10.0.0.1'
username = 'admin'
password = 'password'

client = ClientLibrary(address, username, password, ssl_verify=False)
client.wait_for_lld_connected()

lab = client.create_lab('Lab-1')

r1 = lab.create_node("r1", "iosv", 50, 100)
r1.config = "hostname R1"
r2 = lab.create_node("r2", "iosv", 50, 200)
r2.config = "hostname R2"

# create a link between r1 and r2
r1_i1 = r1.create_interface()
r2_i1 = r2.create_interface()
lab.create_link(r1_i1, r2_i1)

# start the lab
lab.start()

# print nodes and interfaces states:
for node in lab.nodes():
    print(node, node.state, node.cpu_usage)
    for interface in node.interfaces():
        print(interface, interface.readpackets, interface.writepackets)

初期コンフィグを指定してラボを作るサンプル

IOSv へ初期コンフィグを指定してラボを作るサンプルスクリプトは以下の通りです。 R1 と R2 の共通コンフィグは common_config として定義しています。

from virl2_client import ClientLibrary

address = '10.0.0.1'
username = 'admin'
password = 'password'

client = ClientLibrary(address, username, password, ssl_verify=False)
client.wait_for_lld_connected()

lab = client.create_lab('Lab-1')

common_config = """
!
service timestamps debug datetime msec localtime
service timestamps log datetime msec localtime
!
logging buffered 65536 debugging
!
clock timezone JST +9
!
no ip domain-lookup
!
no banner exec ^C
no banner incoming ^C
no banner login ^C
!
line con 0
 exec-timeout 300 0
 privilege level 15
 logging synchronous
 length 0
!
line vty 0 4
 exec-timeout 300 0
 privilege level 15
 logging synchronous
 no login
 length 0
 transport input telnet
!
scheduler allocate
!
end
"""

r1 = lab.create_node("r1", "iosv", 50, 100)
r1.config = "hostname R1\r" + common_config

r2 = lab.create_node("r2", "iosv", 50, 200)
r2.config = "hostname R2\r" + common_config

# create a link between r1 and r2
r1_i1 = r1.create_interface()
r2_i1 = r2.create_interface()
lab.create_link(r1_i1, r2_i1)

# start the lab
lab.start()

# print nodes and interfaces states:
for node in lab.nodes():
    print(node, node.state, node.cpu_usage)
    for interface in node.interfaces():
        print(interface, interface.readpackets, interface.writepackets)