てくなべ (tekunabe)

ansible / network automation / 学習メモ

netmiko と TextFSM を利用してネットワーク機器の show コマンド結果をパースする

■ はじめに

ネットワーク自動化 Python ライブラリ netmiko では、状態表示のための show コマンドや、設定変更のコマンドを実行できます。

TextFSM というパーサーと連携して、 show コマンド結果を パース して扱う事ができます。

f:id:akira6592:20181231134801p:plain:w500
パースされた Junos の show version 結果例

TextFSM では、特定の show コマンドに対して専用のテンプレート(正規表現によるパターン化)を用意して、パースさせます。 テンプレートは自作することもできますが、ntc-templates にあるものを利用するのが便利です。

Juniper Junos、Arista EOS、Cisco IOS/IOS-XR/NX OS などの代表的なコマンドに対応するテンプレートが、現在 250 以上あります。

もし、機器側が NETCONF や REST API に対応していれば、その方法でパースされた情報を取得するほうがスマートでしょうが、対応していないケースも多いと思います。

この記事では、ntc-templates に最近追加された Juniper の show vesrion コマンドに対応するものを利用して、このコマンド結果をパースしてみます。

参考

kooshin.hateblo.jp

想定環境

■ 環境の準備

  • netmiko のインストール
$ pip install netmiko
  • ntc-templates の TextFSM テンプレートをダウンロード
$ cd ~
$ git clone https://github.com/networktocode/ntc-templates.git

このパスにしておくことで、netmiko が自動的に TextFSM テンプレートを探しに行ってくれます。

■ Junos の show version をパースするサンプル

  • junos_version.py
from netmiko import Netmiko
import pprint

junos = {
    "host": "172.16.0.1",
    "username": "testuser",
    "password": "testpass9999",
    "device_type": "juniper_junos",
    "port": 38005   # デフォルトは 22
}

net_connect = Netmiko(**junos)  # 接続

output = net_connect.send_command("show version", use_textfsm=True) # TextFSMを利用するオプションを True に指定

pprint.pprint(output)  # 表示

net_connect.disconnect()  # 切断
  • 実行結果

以下のように、パースされ、key/value 形式になっていることが確認できます。

$ python junos_version.py
[{'appid_services': '20180316.180938_builder_junos_174_r1_s2',
  'base_os_boot': '',
  'base_os_software_suite': '',
  'border_gateway_function_package': '',
  'crypto_software_suite': '',
  'hostname': 'vMX1',
  'idp_services': '20180316.180938_builder_junos_174_r1_s2',
  'junos_version': '17.4R1-S2.2',
  'kernel_software_suite': '',
  'lab_package': '',
  'model': 'vmx',
  'online_documentation': '20180316.180938_builder_junos_174_r1_s2',
  'other_device_properties': ['OS Kernel 64-bit  ',
                              'OS libs ',
                              'OS runtime ',
                              'OS time zone information ',
                              'network stack and utilities ',
                              'libs ',
                              'OS libs compat32 ',
                              'OS 32-bit compatibility ',
                              'libs compat32 ',
                              'runtime ',
                              'Packet Forwarding Engine Simulation Package ',
                              'py extensions ',
                              'py base ',
                              'OS vmguest ',
                              'OS crypto ',
                              'mx libs compat32 ',
                              'mx runtime ',
                              'common platform support ',
                              'mtx network modules ',
                              'modules ',
                              'mx modules ',
                              'mx libs ',
                              'mtx Data Plane Crypto Support ',
                              'daemons ',
                              'mx daemons ',
                              'Services URL Filter package ',
                              'Services TLB Service PIC package ',
                              'Services SOFTWIRE ',
                              'Services PCEF package ',
                              'Services Logging Report Framework package ',
                              'Services Deep Packet Inspection package ',
                              'Services IDS ',
                              'Services COS ',
                              'Extension Toolkit ',
                              'jfirmware ',
                              'jail runtime '],
  'other_properties_versions': ['20180127.fdc8dfc_builder_stable_11',
                                '20180127.fdc8dfc_builder_stable_11',
                                '20180127.fdc8dfc_builder_stable_11',
                                '20180127.fdc8dfc_builder_stable_11',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180127.fdc8dfc_builder_stable_11',
                                '20180127.fdc8dfc_builder_stable_11',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180127.fdc8dfc_builder_stable_11',
                                '20180127.fdc8dfc_builder_stable_11',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180127.fdc8dfc_builder_stable_11'],
  'packet_forwarding_engine_support_m_t_ex_common': '',
  'packet_forwarding_engine_support_mx_common': '',
  'platform_software_suite': '',
  'py_base_i386': '',
  'qfabric_system_id': '',
  'routing_software_suite': '',
  'runtime_software_suite': '',
  'serial_number': '',
  'services_aacl_container_package': '20180316.180938_builder_junos_174_r1_s2',
  'services_application_level_gateways': '20180316.180938_builder_junos_174_r1_s2',
  'services_captive_portal_content_delivery_package': '20180316.180938_builder_junos_174_r1_s2',
  'services_crypto': '20180316.180938_builder_junos_174_r1_s2',
  'services_http_content_management_package': '20180316.180938_builder_junos_174_r1_s2',
  'services_ipsec': '20180316.180938_builder_junos_174_r1_s2',
  'services_jflow_container_package': '20180316.180938_builder_junos_174_r1_s2',
  'services_ll_pdf_container_package': '20180316.180938_builder_junos_174_r1_s2',
  'services_mobile_subscriber_service_package': '20180316.180938_builder_junos_174_r1_s2',
  'services_mobilenext_software_package': '20180316.180938_builder_junos_174_r1_s2',
  'services_nat': '20180316.180938_builder_junos_174_r1_s2',
  'services_ptsp_container_package': '20180316.180938_builder_junos_174_r1_s2',
  'services_rpm': '20180316.180938_builder_junos_174_r1_s2',
  'services_ssl': '20180316.180938_builder_junos_174_r1_s2',
  'services_stateful_firewall': '20180316.180938_builder_junos_174_r1_s2',
  'voice_services_container_package': ''}]

補足

なお、以下のように TextFSM を利用しないように指定することもできます。

output = net_connect.send_command("show version", use_textfsm=False)

実行結果は、普通にターミナルでコマンドを実行したときと同じような形式になります。(key/valueにはならない)

パースしない実行結果(クリックして表示)

$ python junos_version.py
('\n'
 'Hostname: vMX1\n'
 'Model: vmx\n'
 'Junos: 17.4R1-S2.2\n'
 'JUNOS OS Kernel 64-bit  [20180127.fdc8dfc_builder_stable_11]\n'
 'JUNOS OS libs [20180127.fdc8dfc_builder_stable_11]\n'
 'JUNOS OS runtime [20180127.fdc8dfc_builder_stable_11]\n'
 'JUNOS OS time zone information [20180127.fdc8dfc_builder_stable_11]\n'
 'JUNOS network stack and utilities [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS libs [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS OS libs compat32 [20180127.fdc8dfc_builder_stable_11]\n'
 'JUNOS OS 32-bit compatibility [20180127.fdc8dfc_builder_stable_11]\n'
 'JUNOS libs compat32 [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS runtime [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Packet Forwarding Engine Simulation Package '
 '[20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS py extensions [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS py base [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS OS vmguest [20180127.fdc8dfc_builder_stable_11]\n'
 'JUNOS OS crypto [20180127.fdc8dfc_builder_stable_11]\n'
 'JUNOS mx libs compat32 [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS mx runtime [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS common platform support [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS mtx network modules [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS modules [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS mx modules [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS mx libs [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS mtx Data Plane Crypto Support '
 '[20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS daemons [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS mx daemons [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services URL Filter package [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services TLB Service PIC package '
 '[20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services SSL [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services SOFTWIRE [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services Stateful Firewall [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services RPM [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services PTSP Container package '
 '[20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services PCEF package [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services NAT [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services Mobile Subscriber Service Container package '
 '[20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services MobileNext Software package '
 '[20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services Logging Report Framework package '
 '[20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services LL-PDF Container package '
 '[20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services Jflow Container package '
 '[20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services Deep Packet Inspection package '
 '[20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services IPSec [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services IDS [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS IDP Services [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services HTTP Content Management package '
 '[20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services Crypto [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services Captive Portal and Content Delivery Container package '
 '[20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services COS [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS AppId Services [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services Application Level Gateways '
 '[20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services AACL Container package '
 '[20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Extension Toolkit [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS jfirmware [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Online Documentation [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS jail runtime [20180127.fdc8dfc_builder_stable_11]\n')


■ まとめ

ネットワーク自動化 Python ライブラリ netmiko と TextFSM を利用して、Junos の show version コマンドの結果をパースしてみました。

[ntc-templates には他にも250以上のテンプレート]https://github.com/networktocode/ntc-templates/tree/master/templatesがありますので、利用したいものがあるか探しててはいかがでしょうか。

github.com