Cisco: コンフィグをXML形式で取得する(IOS-XE/NX-OS/IOS-XR)

今回は Cisco 機器でコンフィグを XML 形式で出力させる方法を紹介します。今時では、Netconf で取れば早いじゃんか、、、という突っ込みがきそうですが昔ながらの CLI 経由で確認する方法です。(XR は Netconf 使ってます)

昨今 Python などで XML を解析して遊んだりするのにネットワーク機器の出力を使うと楽しいですよね。(私だけか?)

IOS/IOS-XE編

IOS/IOS-XE の場合では、特に設定はする必要はありません。パイプ(|)をして ‘format’ を使うだけです。簡単ですね。

Router#sh run | format
<?xml version="1.0" encoding="UTF-8"?><Device-Configuration xmlns="urn:cisco:xml-pi">
<version><Param>15.6</Param></version>
<service><timestamps><debug><datetime><msec/></datetime></debug></timestamps></service>
<service><timestamps><log><datetime><msec/></datetime></log></timestamps></service>
<service operation="delete" ><password-encryption/></service>
<hostname><SystemNetworkName>Router</SystemNetworkName></hostname>
<boot-start-marker></boot-start-marker>
<boot-end-marker></boot-end-marker>
<aaa operation="delete" ><new-model/></aaa>
<ethernet><lmi><ce/></lmi></ethernet>
<mmi><polling-interval><MmiPollingIntervalSecond>60</MmiPollingIntervalSecond></polling-interval></mmi>
<mmi operation="delete" ><auto-configure/></mmi>
<mmi operation="delete" ><pvc/></mmi>
<mmi><snmp-timeout><SNMPTimeoutValueSecond>180</SNMPTimeoutValueSecond></snmp-timeout></mmi>
<ip><cef/></ip>
<ipv6 operation="delete" ><cef/></ipv6>
<multilink><bundle-name><authenticated/></bundle-name></multilink>
<redundancy>
<ConfigRed-Configuration>
</ConfigRed-Configuration>
</redundancy>
<interface><Param>GigabitEthernet0/0</Param>
<ConfigIf-Configuration>
<ip operation="delete" ><address/></ip>
<shutdown></shutdown>
<duplex><auto/></duplex>
<speed><auto/></speed>
(snip)

当然ですがコンフィグだけでなく、show コマンドでもどうように XML 形式の出力を得ることができます。

Router#show ip int brief | format
<?xml version="1.0" encoding="UTF-8"?>
  <ShowIpInterfaceBrief xmlns="ODM://built-in//show_ip_interface_brief">
    <SpecVersion>built-in</SpecVersion>
    <IPInterfaces>
      <entry>
        <Interface>GigabitEthernet0/0</Interface>
        <OK>YES</OK>
        <Method>unset</Method>
        <Status>administratively down</Status>
        <Protocol>down</Protocol>
      </entry>
    </IPInterfaces>
  </ShowIpInterfaceBrief>

NX-OS編

Nexus で使われる NX-OS では昔からコンフィグを含め show コマンドも XML 形式で出力できることは有名かと思います。また、特別な設定は必要ありません。
NX-OS でも IOS と同じくパイプ(|)を使って、’xml’ を指定するだけです。出力までに少し時間がかかります。
※ 下記の例では、bgp 設定に絞ってコンフィグを表示しています。

switch# sh run bgp | xml
(snip)
<?xml version="1.0"?>
<nf:rpc xmlns:nf="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns="http://www.cis
co.com/nxos:7.3.0.D1.1.:configure_" xmlns:m="http://www.cisco.com/nxos:7.3.0.D1.
1.:_exec" xmlns:m1="http://www.cisco.com/nxos:7.3.0.D1.1.:configure__router-bgp_
vrf-cmds" xmlns:m2="http://www.cisco.com/nxos:7.3.0.D1.1.:configure__router-bgp"
 xmlns:m3="http://www.cisco.com/nxos:7.3.0.D1.1.:configure__router-bgp_router-bg
p-neighbor-sess" message-id="1">
  <nf:get-config>
    <nf:source>
      <nf:running/>
    </nf:source>
    <nf:filter>
      <m:configure>
        <m:terminal>
          <feature>
            <bgp/>
          </feature>
          <router>
            <bgp>
              <__XML__PARAM__as>
                <__XML__value>100</__XML__value>
                <m1:router-id>
                  <m1:__XML__PARAM__router-id>
                    <m1:__XML__value>1.1.1.1</m1:__XML__value>
                  </m1:__XML__PARAM__router-id>
                </m1:router-id>
                <m2:neighbor>
                  <m2:__XML__PARAM__neighbor-id>
                    <m2:__XML__value>2.2.2.2</m2:__XML__value>
                    <m3:remote-as>
                      <m3:__XML__PARAM__asn>
                        <m3:__XML__value>200</m3:__XML__value>
                      </m3:__XML__PARAM__asn>
                    </m3:remote-as>
                    <m3:description>
                      <m3:__XML__PARAM__describe>
                        <m3:__XML__value>neighbor1</m3:__XML__value>
                      </m3:__XML__PARAM__describe>
                    </m3:description>
                  </m2:__XML__PARAM__neighbor-id>
                </m2:neighbor>
              </__XML__PARAM__as>
            </bgp>
          </router>
        </m:terminal>
      </m:configure>
    </nf:filter>
  </nf:get-config>
</nf:rpc>
]]>]]>

IOSと同じく、show コマンドも同様の方法で XML 形式にできます。

switch# show module | xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<nf:rpc-reply xmlns:nf="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns="http://w
ww.cisco.com/nxos:1.0:lcmcli">
 <nf:data>
  <show>
   <module>
    <__XML__OPT_Cmd_show_module_module>
     <__XML__OPT_Cmd_show_module___readonly__>
      <__readonly__>
       <TABLE_modinfo>
        <ROW_modinfo>
         <modinf>1</modinf>
         <ports>0</ports>
         <modtype>NX-OSv Supervisor Module</modtype>
         <model>N7K-SUP1</model>
         <status>active *</status>
        </ROW_modinfo>
        <ROW_modinfo>
         <modinf>2</modinf>
         <ports>48</ports>
         <modtype>NX-OSv Ethernet Module</modtype>
         <model>N7K-F248XP-25</model>
         <status>ok</status>
(snip)

IOS-XR 編

ASR9000 等で使われる IOS-XR では、残念ながら簡単にコンフィグを XML 形式で表示されることができません。というのも、設定が必要となり、外部から SSH なりで Netconf アクセスして出力する必要があります。
IPアドレスをインタフェースに割り当て、SSH、XML/Netconf Agent 等の設定を下記のようにします。

設定

RP/0/0/CPU0:ios#conf t
RP/0/0/CPU0:ios(config)#int gi0/0/0/0
RP/0/0/CPU0:ios(config-if)#ipv4 address 172.16.1.97/24
RP/0/0/CPU0:ios(config-if)#no shut
RP/0/0/CPU0:ios(config-if)#exit
RP/0/0/CPU0:ios(config)#ssh server netconf vrf default
RP/0/0/CPU0:ios(config)#ssh server logging
RP/0/0/CPU0:ios(config)#ssh server netconf port 830
RP/0/0/CPU0:ios(config)#username iosxr password cisco123
RP/0/0/CPU0:ios(config)#xml agent ssl
RP/0/0/CPU0:ios(config-xml-ssl)#exit
RP/0/0/CPU0:ios(config)#xml agent tty
RP/0/0/CPU0:ios(config-xml-tty)#exit
RP/0/0/CPU0:ios(config)#netconf agent tty
RP/0/0/CPU0:ios(config-netconf-tty)#exit
RP/0/0/CPU0:ios(config)#netconf-yang agent ssh
RP/0/0/CPU0:ios(config)#commit
RP/0/0/CPU0:ios(config)#end

RP/0/0/CPU0:ios#crypto key generate rsa
Fri Jun 30 03:44:52.707 UTC
The name for the keys will be: the_default
  Choose the size of the key modulus in the range of 512 to 4096 for your General Purpose Keypair. Choosing a key modulus greater than 512 may take a few minutes.

How many bits in the modulus [2048]:
Generating RSA keys ...
Done w/ crypto generate keypair
[OK]

Netconf でのやり取り

すると、下記のように Linux から SSH で Netconf で接続できます。

virl@virl:~$ ssh -s iosxr@172.16.1.97 -p 830 netconf
(snip)
  <capability>http://openconfig.net/yang/routing-policy?module=routing-policy&revision=2015-05-15&deviation=cisco-xr-routing-policy-deviations</capability>
 </capabilities>
 <session-id>2365823431</session-id>
</hello>
]]>]]>
(snip)

hello のリプライを返します。

<?xml version="1.0" encoding="UTF-8"?>
<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <capabilities>
    <capability>urn:ietf:params:netconf:base:1.1</capability>
    </capabilities>
</hello>
]]>]]>

次は OpenConfig の Bgp モデルをベースに BGP 設定を取得します。

#173
<rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <get>
    <filter>
      <bgp xmlns="http://openconfig.net/yang/bgp"/>
    </filter>
  </get>
</rpc>
##

すると、下記のように XML で BGP 設定を得ることができます。今回は OpenConfig の BGP モデルを使ったので、そのモデルに準拠した形で表示されています。

#776
<?xml version="1.0"?>
<rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
 <data>
  <bgp xmlns="http://openconfig.net/yang/bgp">
   <global>
    <config>
     <as>100</as>
     <router-id>1.1.1.1</router-id>
    </config>
    <state>
     <as>100</as>
     <router-id>1.1.1.1</router-id>
    </state>
   </global>
   <neighbors>
    <neighbor>
     <neighbor-address>2.2.2.2</neighbor-address>
     <config>
      <neighbor-address>2.2.2.2</neighbor-address>
      <peer-as>200</peer-as>
      <description>to_R2</description>
     </config>
     <state>
      <neighbor-address>2.2.2.2</neighbor-address>
      <peer-as>200</peer-as>
      <description>to_R2</description>
     </state>
    </neighbor>
   </neighbors>
  </bgp>
 </data>
</rpc-reply>

##

以上が IOS/IOS-XE, NX-OS, IOS-XR の 3機種 でルータの設定内容を XML 形式で取得する方法を紹介しました。最後の IOS-XR だけはちょっと方法が異なりますが、XML で取得できる点は同じなので、XML をパースする Python コードの練習とかにどうでしょうか?

ではでは。

スポンサーリンク