10
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

pyATSを触るためにCMLでtestbedファイルを用意してみた

Last updated at Posted at 2021-07-20

#はじめに

pyATSとはCiscoが無償で提供しているマルチベンダー対応のテストフレームワークです。
pyATSでCMLに建てた機器にConnectするまでを触ってみました。
testbedファイルの作成や生成手段がわからず困っていたのでここに残しておきます。

#環境
・Windows 10 Enterprise
・WSL2 → Ubuntu 20.04 LTS
・CML Version: 2.2.1+build36

#構成図
かなり雑ですがやる気が消える前にアップしたかったのでスピード重視です。
構成図.PNG

#経緯
・手荒に扱える環境で試したかったのでCMLを対象にしました。
・pyATSやPythonの記事を見てなんとなく何かをやりたかった。
・Qiita投稿の初体験。

#やりたい事
1.pyATSで利用するtestbedファイルをCMLのAPIから払い出す。
2.払い出したファイルで接続できるのか試す。

#PC側の準備
pyATS_CMLファイルの中でvenvを使って仮想環境を用意する。
pyATSを使えるようにするため以下のコマンドを実行していきます。

$mkdir ~/pyats_CML
$cd ~/pyats_CML
$python3 -m venv .

$source bin/activate
$pip install --upgrade pip setuptools
$pip install pyats[full]

$mkdir work

以下のようなファイルが生成されてるはず。

(pyats_CML) pyats_CML hmasayuk$ ls
bin  include  lib  lib64  pyvenv.cfg  share work

#CML側の準備
続いてCML側の情報を取りに行きます。
CML側のAPI Documentationを利用します。
以下、ログイン後のGUI操作です。

APIDOCUMENT.PNG

API.PNG

Try it outを選択したら以下のコードが出るので、利用しているCMLのID/PWに置き換えましょう。

☞Executeで実行

{
  "username": "change me",
  "password": "change me"
}

成功してればServer response 200でCMLに対してのtokenが払い出されたはずです。
これでCMLのAPIが操作できるのでtestbedファイルを作成していきましょう。

Labs> [GET]/labs/{lab_id}/pyats_testbedのAPIを使います。
testbed_API.PNG

lab_idはpyATSでConnectしたいラボのidを持ってきましょう。
※私はURLから lab_idは取得しました。URL以外からも引っ張れるかもですがわからなければ参考までに)

上記の操作も Try it outを選択してから行います。

☞Executeで実行

生成されたコードはこちら☟

testbed.yaml
testbed.yaml
testbed:
  name: LABNAME
devices:
  terminal_server:
    os: linux
    type: linux
    credentials:
      default:
        username: change_me
        password: change_me
    connections:
      cli:
        protocol: ssh
        ip: CMLIP
  ubuntu-0:
    os: linux
    type: server
    credentials:
      default:
        username: cisco
        password: cisco
    connections:
      defaults:
        class: unicon.Unicon
      a:
        protocol: telnet
        proxy: terminal_server
        command: open /ea18e3/n0/0
  iosv-0:
    os: ios
    type: router
    series: iosv
    credentials:
      default:
        username: cisco
        password: cisco
    connections:
      defaults:
        class: unicon.Unicon
      a:
        protocol: telnet
        proxy: terminal_server
        command: open /ea18e3/n2/0
  server-0:
    os: linux
    type: server
    credentials:
      default:
        username: cisco
        password: cisco
    connections:
      defaults:
        class: unicon.Unicon
      a:
        protocol: telnet
        proxy: terminal_server
        command: open /ea18e3/n4/0
  iosv-1:
    os: ios
    type: router
    series: iosv
    credentials:
      default:
        username: cisco
        password: cisco
    connections:
      defaults:
        class: unicon.Unicon
      a:
        protocol: telnet
        proxy: terminal_server
        command: open /ea18e3/n1/0
  server-1:
    os: linux
    type: server
    credentials:
      default:
        username: cisco
        password: cisco
    connections:
      defaults:
        class: unicon.Unicon
      a:
        protocol: telnet
        proxy: terminal_server
        command: open /ea18e3/n6/0
  desktop-0:
    os: linux
    type: server
    credentials:
      default:
        username: cisco
        password: cisco
    connections:
      defaults:
        class: unicon.Unicon
      a:
        protocol: telnet
        proxy: terminal_server
        command: open /ea18e3/n9/0
  csr1000v-0:
    os: iosxe
    type: router
    series: csr1000v
    credentials:
      default:
        username: cisco
        password: cisco
    connections:
      defaults:
        class: unicon.Unicon
      a:
        protocol: telnet
        proxy: terminal_server
        command: open /ea18e3/n10/0
topology:
  ubuntu-0:
    interfaces:
      enp0s2:
        link: l0
        type: ethernet
      enp0s3:
        type: ethernet
  iosv-0:
    interfaces:
      Loopback0:
        type: loopback
      GigabitEthernet0/0:
        link: l2
        type: ethernet
      GigabitEthernet0/1:
        link: l3
        type: ethernet
      GigabitEthernet0/2:
        type: ethernet
      GigabitEthernet0/3:
        type: ethernet
  server-0:
    interfaces:
      eth0:
        link: l7
        type: ethernet
  iosv-1:
    interfaces:
      Loopback0:
        type: loopback
      GigabitEthernet0/0:
        link: l4
        type: ethernet
      GigabitEthernet0/1:
        link: l5
        type: ethernet
      GigabitEthernet0/2:
        type: ethernet
      GigabitEthernet0/3:
        type: ethernet
  server-1:
    interfaces:
      eth0:
        link: l6
        type: ethernet
  desktop-0:
    interfaces:
      eth0:
        link: l8
        type: ethernet
  csr1000v-0:
    interfaces:
      Loopback0:
        type: loopback
      GigabitEthernet1:
        link: l9
        type: ethernet
      GigabitEthernet2:
        type: ethernet
      GigabitEthernet3:
        type: ethernet
      GigabitEthernet4:
        type: ethernet

change meの部分を利用しているCMLの情報に書き換えたファイルを作業環境に持っていきます。

#動作確認
先ほど作成したtestbedファイルをworkへ格納。

$cd ~/pyats_CML/work
$touch testbed.yaml
$vi testbed.yaml 
###👆ここでtestbedファイルをコピペしてます。###

$ls
testbed.yaml

ここではviと記載してますが、エディタならemacsでもなんでもいいです。

実行してみましょう。

$ genie shell --testbed-file ~/pyats_CML/work/testbed.yaml
Welcome to pyATS Interactive Shell
==================================
Python 3.8.2 (default, Jul 16 2020, 14:00:26)
[GCC 9.3.0]

>>> from pyats.topology.loader import load
>>> testbed = load('/home/honda/pyats_CML/work/testbed.yaml')
-------------------------------------------------------------------------------
>>>

うごいてるっぽい!
ではこのままネットワーク情報を見ていきましょう。

>>> TEST = testbed.devices['iosv-0']   ###iosv-0を例として対象にしています。
>>> TEST.connect()

Connecting to console for iosv-0
Connected to terminalserver.
Escape character is '^]'.

iosv-0>
2021-07-20 12:26:52,407: %UNICON-INFO: +++ initializing handle +++

これで接続できましたね。
show コマンドを打てるか試してみます。

>>> TEST.parse('show version')

2021-07-20 12:33:42,629: %UNICON-INFO: +++ iosv-0 with alias 'a': executing command 'show version' +++
show version
Cisco IOS Software, IOSv Software (VIOS-ADVENTERPRISEK9-M), Version 15.9(3)M3, RELEASE SOFTWARE (fc1)
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2021 by Cisco Systems, Inc.
Compiled Wed 27-Jan-21 09:58 by prod_rel_team

取得完了!!無事に show versionのコマンドの結果が見れますね。

#最後に
今回の取り組みでCMLのAPIやpyATSを調べるきっかけになった事でpyATSの可能性を感じることができました。
次はコンフィグ投入やpyATSでのテストコマンド使いたいと思います。

#参考先
pyATS公式ドキュメント
pyATS/genieを触ってみよう

10
1
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?