(この記事はネットワーク自動化 Advent Calendar 2019 9日目として書いています)
pyATS/Genie ではネットワーク機器へ接続するために testbed.yaml というネットワーク構成を YAML で記載するファイルが必要になります。
※ 統一して testbed.yaml と言っていますが、ファイル名は特に何でも構いません
以前手動で 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 が作成できます。
同じく 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 から作成可能なので、何百台の機器分を作成する場合の手間が省けるのではないかと思います。