今回は python から Genie Parser を使う方法を紹介します。えっどういう事?と思われるかもしれませんが、pyATS は python のライブラリのため、今回の記事は下記のような場合に使えるものになります。
- Nornir など他のツールで作っている python コードから直接 Genie Parser を使いたい
- 既に独自で作ってある python コードから Genie Parser だけ使いたい
pyATS では Unicon というコネクションライブラリで機器に接続し、機器から show コマンドの出力を得て、パースを行い、構造化データを返します。
しかしながら、Nornir などでは別のコネクションライブラリを使っており、それを使っているケースでも Genie Parser を呼び出す事は可能です。
さっそくコードです。
from genie.conf.base import Device
output = """
Vlan1 is administratively down, line protocol is down , Autostate Enabled
Hardware is Ethernet SVI, address is 70b3.17ff.6500 (bia 70b3.17ff.6500)
MTU bytes, BW 1000000 Kbit/sec, DLY 10 usec,
reliability 255/255, txload 1/255, rxload 1/255
Encapsulation ARPA, loopback not set
Keepalive not supported
ARP type: ARPA, ARP Timeout 04:00:00
Last input never, output never, output hang never
Last clearing of "show interface" counters never
Input queue: 0/375/0/0 (size/max/drops/flushes); Total output drops: 0
Queueing strategy: fifo
Output queue: 0/40 (size/max)
5 minute input rate 0 bits/sec, 0 packets/sec
5 minute output rate 0 bits/sec, 0 packets/sec
0 packets input, 0 bytes, 0 no buffer
Received 0 broadcasts (0 IP multicasts)
0 runts, 0 giants, 0 throttles
0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored
0 packets output, 0 bytes, 0 underruns
0 output errors, 1 interface resets
0 unknown protocol drops
0 output buffer failures, 0 output buffers swapped out
"""
device = Device('RouterA', os='iosxe')
device.custom.setdefault("abstraction", {})["order"] = ["os"]
device.parse('show interfaces', output=output)
何をやっているかというと、
output
変数に show command の出力を格納 (というのは他のツールのコネクションライブラリ、機能で出力を取ってくることを想定)Device
オブジェクトを作成。デバイス名(hostname とマッチする必要あり)、os
を指定するDevice
オブジェクトへcustom
セクションを追加。この部分は抽象化に関連する部分となり、order
で指定されたオーダーでパーサーを探す動作となります。device.parse()
にoutput
オプションで出力を渡すと、構造化データが返ってくる(pyATSは機器に接続しない。与えられた出力を解析し、構造化データを返すのみ)
この方法を使うことで、既に作った python の自動化スクリプトなどへシームレスに pyATS の Genie Parser を使うことが可能です。
実際に Ansible の Genie Parser プラグインはこの仕組みを使っています。