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
$ 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: **.**.**.**
ネットワーク自動化を基礎から体系的に学びたい方は下記の本がおすすめです。
コメント