pyATS/Genie: testbed.yaml の作り方の色々とYAMLファイルの確認方法

(この記事はネットワーク自動化 Advent Calendar 2019 9日目として書いています)

ネットワーク自動化に関するものなら何でもOKです!

pyATS/Genie ではネットワーク機器へ接続するために testbed.yaml というネットワーク構成を YAML で記載するファイルが必要になります。

※ 統一して testbed.yaml と言っていますが、ファイル名は特に何でも構いません

pyATS/Genie : YAML でネットワーク構成を書いて、ネットワーク機器へ接続/設定を行う
今回は pyATS / Genie を使うにあたって、避けては通れないネットワーク構成を記載する YAML ファイルについてと、簡単に p...

以前手動で testbed.yaml を書く上記の記事を書きましたが、クイックでほんの数台や数百台分記載したい場合に有効な方法と確認方法を今回は紹介します。

数台をクイックで作成したい場合

まずは数台をクイックで作成したい場合です。エディタを開いて書くまででもないし、pyATS/Genie の testbed.yaml の構文忘れてしまったという場合に使えます。

genie create testbed コマンドを下記のように出力したい yaml ファイルを指定して実行するとプロンプト形式で返答していくだけで作成できます。Telnet/SSH 接続のポートを変更したい場合は IP のところで <address>:<port> のフォーマットで入力します。

(pyats)$ genie create testbed --output yaml/testbed.yaml
Start creating Testbed yaml file ...
Do all of the devices have the same username? [y/n] y
Common Username: cisco

Do all of the devices have the same default password? [y/n] y
Common Default Password (leave blank if you want to enter on demand):

Do all of the devices have the same enable password? [y/n] y
Common Enable Password (leave blank if you want to enter on demand):


Device hostname: R1
   IP (ip, or ip:port): 192.168.1.1
   Protocol (ssh, telnet, ...): ssh
   OS (iosxr, iosxe, ios, nxos, linux, ...): iosxe
More devices to add ? [y/n] y

Device hostname: R2
   IP (ip, or ip:port): 192.168.1.2
   Protocol (ssh, telnet, ...): telnet
   OS (iosxr, iosxe, ios, nxos, linux, ...): nxos
More devices to add ? [y/n] y

Device hostname: R3
   IP (ip, or ip:port): 172.16.1.1:2006
   Protocol (ssh, telnet, ...): telnet
   OS (iosxr, iosxe, ios, nxos, linux, ...): iosxr
More devices to add ? [y/n] n
Testbed file generated:
yaml/testbed.yaml

作成されたものがこちらです。

devices:
  R1:
    connections:
      cli:
        ip: 192.168.1.1
        protocol: ssh
    credentials:
      default:
        password: cisco
        username: cisco
      enable:
        password: cisco
    os: iosxe
    type: iosxe
  R2:
    connections:
      cli:
        ip: 192.168.1.2
        protocol: telnet
    credentials:
      default:
        password: cisco
        username: cisco
      enable:
        password: cisco
    os: nxos
    type: nxos
  R3:
    connections:
      cli:
        ip: 172.16.1.1
        port: 2006
        protocol: telnet
    credentials:
      default:
        password: cisco
        username: cisco
      enable:
        password: cisco
    os: iosxr
    type: iosxr

簡単ですよね?機器のIPとOS、ログイン情報は分かっているという場合にはこのコマンドを覚えておくだけで、ネットワークエンジニアの方なら簡単に testbed.yaml が作成できます。

Excel/CSV ファイルから testbed.yaml を生成する

下記のフォーマットで Excel または CSV でファイルを作成します。内容的には前の項目で作ったのと同じです。ネットワーク運用環境下ではホスト名やIPアドレスを Excel で管理している場合が多いかと思いますので、そういう場合にはちょこっと下記のフォーマットに変更してもらうだけで簡単に testbed.yaml が作成できます。

devices.

同じく genie create testbed コマンドを使いますが、今度は Excel ファイルを指定しています。

(pyats)$ genie create testbed devices.xlsx --output yaml/testbed.yaml
Testbed file generated:
devices.xlsx -> yaml/testbed.yaml

作成された testbed.yaml は前の項目のものと同じため、割愛します。

CSV でも全く同じ方法で作成できます。下記は CSV ファイルの中身です。

hostname,ip,username,password,protocol,os
R1,192.168.1.1,cisco,cisco,ssh,iosxe
R2,192.168.1.2,cisco,cisco,telnet,nxos
R3,172.16.1.1:2006,cisco,cisco,telnet,iosxr

指定するファイルを CSV へ変更するのみです。

(pyats)$ genie create testbed devices.csv --output yaml/testbed.yaml
Testbed file generated:
devices.csv -> yaml/testbed.yaml

複数の Excel/CSV ファイルに対してそれぞれ testbed.yaml を作成する

ネットワーク構成情報を testbed.yaml を部署ごとや地域ごとに管理していたり、そういう区分けで testbed.yaml を作成したい場合には前述と同じフォーマットで複数の Excel/CSV ファイルを作成し、フォルダ配下に保存します。サブフォルダがあったり、Excel/CSV が混在していても問題ありません。

(pyats)$ tree files
files
├── finance_dept.xlsx
├── it_dept.xlsx
├── network_dept.csv
└── osaka
    └── osaka_hq.xlsx

1 directory, 4 files

作成するには同じく genie create testbed コマンドですが、今回はファイル名ではなくフォルダ名を代わりに指定します。

(pyats)$ genie create testbed files --output yamls -r
Testbed file generated:
files/it_dept.xlsx -> yamls/it_dept.yaml
files/network_dept.csv -> yamls/network_dept.yaml
files/finance_dept.xlsx -> yamls/finance_dept.yaml
files/osaka/osaka_hq.xlsx -> yamls/osaka/osaka_hq.yaml

testbed.yaml の正常性確認

上記 genie create testbed で作成された testbed.yaml は問題ないはずですが、エディタなどで手動で作成した場合や、作成されたものを自分でアップデートした後にうまく動かなくなり、YAML のどこに問題があるのか調べる場合がありますが、そういう場合に便利なのが pyats validate testbed コマンドです。

下記が testbed.yaml を指定した実行例です。platform/interface に関して warning が出ていますが、必須ではないので無視します。

(pyats)$ pyats validate testbed yaml/testbed.yaml
Loading testbed file: yaml/testbed.yaml
--------------------------------------------------------------------------------

Testbed Name:
    testbed

Testbed Devices:
.
|-- R1 [iosxe/iosxe]
|-- R2 [nxos/nxos]
`-- R3 [iosxr/iosxr]

Warning Messages
----------------
 - Device 'R1' missing 'platform' definition
 - Device 'R1' has no interface definitions
 - Device 'R2' missing 'platform' definition
 - Device 'R2' has no interface definitions
 - Device 'R3' missing 'platform' definition
 - Device 'R3' has no interface definitions

YAML Lint Messages
------------------

例えば、os の記載を忘れた場合には追加で Warning に表示されますので、気づくことができます。

Warning Messages
----------------
 - Device 'R1' missing 'os' definition
 - Device 'R1' missing 'platform' definition
 - Device 'R1' has no interface definitions

また YAML 構文のチェックもしてくれるので、インデントとかに問題があれば教えてくれます。

YAML Lint Messages
------------------
  5:10      warning  wrong indentation: expected 8 but found 9  (indentation)
  6:9       error    syntax error: expected <block end>, but found '<block mapping start>'

まとめ

  • testbed.yaml のフォーマットを忘れてた場合やクイックで作成したい場合には genie create testbed コマンドでプロンプト形式で作成可能
  • 数百台もの機器の testbed.yaml を作成する場合には Excel/CSV を作成すれば Excel/CSV ファイルから簡単に作成可能
  • Excel/CSV からの変換はフォルダに複数ファイルを置くことで一気に変換が可能。サブフォルダがあっても大丈夫
  • testbed.yaml に問題があるかどうか、どこに問題があるかは pyats validate testbed コマンドを使う

色々な testbed.yaml の作成の仕方を紹介しました。エディタで作成するだけでなく Excel/CSV から作成可能なので、何百台の機器分を作成する場合の手間が省けるのではないかと思います。

スポンサーリンク