【自動化】NetmikoでCisco機器(XE/XR)のコマンド実行・コンフィグ設定

DevNet

Netmikoとは

Netmikoは、ネットワーク機器にSSH / Telnet接続をして、showコマンドの実行やコンフィグの設定などを行うことができるPythonライブラリです。

IOS-XE, IOS-XR, ASAなどのCisco機器だけでなく、Juniper, Aristaなどマルチベンダ機器に対応しています。対応ベンダ/OSは下記で確認できます。

  • https://ktbyers.github.io/netmiko/docs/netmiko/index.html

ParamikoもデバイスにSSH接続してコマンド実行等を行えますが、Netmikoはよりネットワーク機器に対して最適化され、よりシンプルなコードで自動化が実現できる点が特徴です。下記のブログにParamikoとNetmikoのコード比較が記載されており、とても参考になります。

  • https://qiita.com/radiantmarch/items/936b43f32210e4689179

Netmikoサンプルコード

IOS-XEとIOS-XRに対してコマンドの実行とコンフィグ設定を行うシンプルなコードを作成してみました。

IOS-XEデバイスに対するコマンド実行 (telnet接続)

from netmiko import ConnectHandler

device1 = {
	'device_type':'cisco_ios_telnet',
	'ip':'**.**.**.**',
	'username':'*****',
	'password':'*****'
	}


net_connect = ConnectHandler(**device1)

output = net_connect.send_command('show ip int brief')
print(output)

実行結果

$ python3 netmiko_send_command_xe.py
Interface              IP-Address      OK? Method Status                Protocol
GigabitEthernet1       **.**.**.**     YES DHCP   up                    up
GigabitEthernet2       172.16.1.1      YES manual up                    up
GigabitEthernet3       192.168.1.1     YES manual up                    up

IOS-XEデバイスに対するコンフィグ設定 (telnet接続)

コンフィグをリスト形式で記載してあげるのが特徴です。

from netmiko import ConnectHandler

device1 = {
	'device_type':'cisco_ios_telnet',
	'ip':'**.**.**.**',
	'username':'*****',
	'password':'*****'
	}


net_connect = ConnectHandler(**device1)

print("=== pre-check ===")
output = net_connect.send_command('show ip int brief loopback10')
print(output)

print("\n=== add loopback ===")
config_commands = ["interface Loopback10","ip address 5.5.5.5 255.255.255.255"]
output = net_connect.send_config_set(config_commands)
print(output)


print("\n=== post-check ===")
output = net_connect.send_command('show ip int brief loopback10')
print(output)

実行結果

$ python3 netmiko_add_loopback_xe.py
=== pre-check ===
^
% Invalid input detected at '^' marker.


=== add loopback ===
configure terminal
Enter configuration commands, one per line.  End with CNTL/Z.
CSR1kv_1(config)#interface Loopback10
CSR1kv_1(config-if)#ip address 5.5.5.5 255.255.255.255
CSR1kv_1(config-if)#end
CSR1kv_1#

=== post-check ===

Interface              IP-Address      OK? Method Status                Protocol
Loopback10             5.5.5.5         YES manual up                    up

IOS-XRデバイスに対するコマンド実行 (ssh接続)

from netmiko import ConnectHandler

device1 = {
	'device_type':'cisco_xr',
	'ip':'**.**.**.**',
	'username':'*****',
	'password':'*****'
	}


net_connect = ConnectHandler(**device1)

output = net_connect.send_command('show ip int brief')
print(output)

実行結果

$ python3 netmiko_send_command_xr.py
Wed Jul 28 05:10:48.362 UTC

Interface                      IP-Address      Status          Protocol Vrf-Name
Loopback0                      1.1.1.1         Up              Up       default
Loopback1                      unassigned      Up              Up       default
MgmtEth0/RP0/CPU0/0            **.**.**.**     Up              Up       mgmt

IOS-XRデバイスに対するコンフィグ設定 (ssh接続)

IOS-XEと異なり、commit, endもコマンドリストに記載してあげる必要があるようです。

from netmiko import ConnectHandler

device1 = {
	'device_type':'cisco_xr',
	'ip':'**.**.**.**',
	'username':'*****',
	'password':'*****'
	}


net_connect = ConnectHandler(**device1)

print("=== pre-check ===")
output = net_connect.send_command('show ip int brief loopback 10')
print(output)

print("\n=== add loopback ===")
config_commands = ["interface Loopback10","ip address 5.5.5.5 255.255.255.255","commit","end"]
output = net_connect.send_config_set(config_commands)
print(output)


print("\n=== post-check ===")
output = net_connect.send_command('show ip int brief loopback 10')
print(output)

実行結果

$ python3 netmiko_add_loopback_xr.py
=== pre-check ===
Wed Jul 28 05:34:54.060 UTC

Invalid or unconfigured interface: Loopback10

=== add loopback ===
configure terminal

Wed Jul 28 05:34:54.426 UTC
RP/0/RP0/CPU0:R3(config)#interface Loopback10

RP/0/RP0/CPU0:R3(config-if)#ip address 5.5.5.5 255.255.255.255

RP/0/RP0/CPU0:R3(config-if)#commit

Wed Jul 28 05:34:55.805 UTC
RP/0/RP0/CPU0:R3(config-if)#end

RP/0/RP0/CPU0:R3#

=== post-check ===
Wed Jul 28 05:34:58.931 UTC

Interface                      IP-Address      Status                Protocol
Loopback10                     5.5.5.5         Up                    Up

余談:IOS-XRに対するtelnet接続のサポートについて (2021.7時点)

IOS-XEでは、device_typeに”cisco_ios”を指定した場合はssh接続、”cisco_ios_telnet”を指定した場合はtelnet接続ができます。IOS-XRも同様に、“cisco_xr”を指定した場合はssh接続、”cisco_xr_telnet”を指定した場合はtelnet接続ができると下記スレッドでも記載があり、コードも実装されているようですが、手元の環境ではエラーで実行できませんでした。スレッド内でもfailした人のコメントが記載されており、おそらくコードが改修されるまで現在はうまく動作しないと思われます。

  • Telnet support #159
    • https://github.com/ktbyers/netmiko/issues/159
https://github.com/ktbyers/netmiko/blob/develop/netmiko/ssh_dispatcher.py#L241
$ python3 netmiko_send_command_xr_telnet.py
Traceback (most recent call last):
  File "/Users/***/netmiko-test/netmiko_send_command_xr_telnet.py", line 11, in <module>
    net_connect = ConnectHandler(**device1)
  File "/usr/local/lib/python3.9/site-packages/netmiko/ssh_dispatcher.py", line 326, in ConnectHandler
    return ConnectionClass(*args, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/netmiko/cisco/cisco_xr.py", line 10, in __init__
    return super().__init__(*args, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/netmiko/base_connection.py", line 350, in __init__
    self._open()
  File "/usr/local/lib/python3.9/site-packages/netmiko/base_connection.py", line 355, in _open
    self.establish_connection()
  File "/usr/local/lib/python3.9/site-packages/netmiko/cisco/cisco_xr.py", line 14, in establish_connection
    super().establish_connection(width=511, height=511)
  File "/usr/local/lib/python3.9/site-packages/netmiko/base_connection.py", line 925, in establish_connection
    self.telnet_login()
  File "/usr/local/lib/python3.9/site-packages/netmiko/cisco_base_connection.py", line 185, in telnet_login
    raise NetmikoAuthenticationException(msg)
netmiko.ssh_exception.NetmikoAuthenticationException: Login failed: **.**.**.**

ネットワーク自動化を基礎から体系的に学びたい方は下記の本がおすすめです。

コメント

タイトルとURLをコピーしました