てくなべ

インフラ、ネットワーク、自動化などの技術的なことを書いていきます。

Ansibleでネットワーク機器のshowコマンド結果をパースする方法まとめ

f:id:akira6592:20170924222135p:plain

Ansibleでshowコマンドの結果をパースする方法が増えてきています。 この記事ではCisco IOSを対象として、標準でできるかどうか、どういう情報をパースできるかなどの観点で、4つの方法を簡単にまとめます。

■ 概要

  • parse_cli_textfsm フィルター
    • Ansible 2.4 から標準で利用可能。TextFSMテンプレートを利用して拡張可能。
  • ansible_helpers フィルター
  • ios_facts モジュール
    • Ansible 2.2 から利用可能。パース可能情報は少なめ。
  • napalm_get_facts モジュール

■ 1. parse_cli_textfsm フィルター

・タイプ

標準のフィルタープラグイン

Filters — Ansible Documentation

・利用可能バージョン

Ansible 2.4 から

・パースできる情報

  • TextFSM 形式で定義すれば任意のコマンドをパース可能
  • Network to Code の テンプレートがとっかかりとして便利 https://github.com/networktocode/ntc-templates/tree/master/templates
    • show interfaces
    • show interfaces status
    • show inventory
    • show ip bgp summary
    • show ip int brief
    • show ip ospf neighbor
    • show ip route

・パース結果例

インターフェース情報

        {
            "DUPLEX": "auto",
            "NAME": "",
            "PORT": "Gi1/0/1",
            "SPEED": "auto",
            "STATUS": "notconnect",
            "TYPE": "10/100/1000BaseTX",
            "VLAN": "1"
        },
        {
            "DUPLEX": "auto",
            "NAME": "",
            "PORT": "Gi1/0/2",
            "SPEED": "auto",
            "STATUS": "notconnect",
            "TYPE": "10/100/1000BaseTX",
            "VLAN": "1"
        },

・その他参考

tekunabe.hatenablog.jp


■ 2. ansible_helpers フィルター

・タイプ

サードパーティのフィルタープラグイン github.com

・利用可能バージョン

不明。当方では Ansible 2.3 で簡単な動作確認済み。

・パースできる情報

  • Network to Code のリポジトリにある TextFSM 形式のテンプレートで定義されたコマンド github.com

    • show interfaces
    • show interfaces status
    • show inventory
    • show ip bgp summary
    • show ip int brief
    • show ip ospf neighbor
    • show ip route

・パース結果例

インターフェース情報

        {
            "intf": "GigabitEthernet1",
            "ipaddr": "10.0.0.51",
            "proto": "up",
            "status": "up"
        },
        {
            "intf": "GigabitEthernet2",
            "ipaddr": "10.0.2.1",
            "proto": "up",
            "status": "up"
        },

・その他参考

tekunabe.hatenablog.jp


■ 3. ios_facts モジュール

・タイプ

標準のfact収集系モジュール

ios_facts - Collect facts from remote devices running Cisco IOS — Ansible Documentation

・利用可能バージョン

Ansible 2.2 から

・パースできる情報

  • ハードウェア情報系、インターフェース系

・パース結果例

インターフェース情報

"ansible_net_interfaces": {
    "GigabitEthernet1": {
        "bandwidth": 1000000, 
        "description": null, 
        "duplex": "Full", 
        "ipv4": {
            "address": "10.0.0.51", 
            "masklen": 24
        }, 
        "lineprotocol": "up ", 
        "macaddress": "2cc2.60xx.xxxx", 
        "mediatype": "RJ45", 
        "mtu": 1500, 
        "operstatus": "up", 
        "type": "CSR vNIC"
    }, 

・その他参考

tekunabe.hatenablog.jp


■ 4. napalm_get_facts モジュール

・タイプ

サードパーティのfact収集系モジュール(napalm-ansible内)

github.com

・利用可能バージョン

不明。当方では Ansible 2.3 で簡単な動作確認済み。

パースできる情報

  • arp_table
  • bgp_neighbors
  • config
  • environment
  • facts
  • interfaces
  • interfaces_counters
  • interfaces_ip
  • lldp_neighbors
  • lldp_neighbors_detail
  • mac_address_table
  • ntp_servers
  • ntp_stats
  • optics
  • snmp_information

・パース結果例

インターフェース情報

"interfaces": {
    "GigabitEthernet1": {
        "description": "N/A",
        "is_enabled": true,
        "is_up": true,
        "last_flapped": -1.0,
        "mac_address": "2C:C2:60:XX:XX:XX",
        "speed": 1000
    },

・その他参考

tekunabe.hatenablog.jp