今回は 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 コードの練習とかにどうでしょうか?
ではでは。