pyATS/python(nornir等)からGenie Parserを使う

今回は 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 プラグインはこの仕組みを使っています。

スポンサーリンク