Reputation: 1
I am trying run this below script for multiple devices and it is working only for last device according to below script.
Please can you verify the below script as I need to execute both device output using for loop statement.
from netmiko import ConnectHandler
from getpass import getpass
password= getpass()
RTR_01 = {
'device_type': 'cisco_ios',
'host': '10.10.10.10',
'username': 'admin',
'password': password,
}
RTR_02 = { 'device_type': 'cisco_ios',
'host': '10.10.10.11',
'username': 'admin',
'password': password, }
device_list = [RTR_01,RTR_02]
for device in device_list: print('Connecting to the device :' + device ['host'])
net_connect = ConnectHandler(**device)
output = net_connect.send_command('show ip interface brief')
print(output)
output = net_connect.send_command('show version')
print(output)
Upvotes: 0
Views: 4638
Reputation: 11
I now how it working 100% correctly. I had tried net_connect.disconnect()
with the appropriate indentations which didn't work because once you exit the indent for the loop, it automatically exits. The problem, silly as it is, was that I was still connected to the actual device and was receiving an error that I had overlooked complaining about not being able to create /var/home/myusername/.ssh
All I needed to do was issue the following command at the very end of the loop:
net_connect.write_channel('exit\n')
Such as silly mistake and so much time wasted but the lesson was valuable! Maybe it can help someone else here.
Upvotes: 1
Reputation: 2266
You need these lines to indented within the for loop
net_connect = ConnectHandler(**device)
output = net_connect.send_command('show ip interface brief')
print(output)
output = net_connect.send_command('show version')
print(output)
Your code should look like this:
from getpass import getpass
from netmiko import ConnectHandler
password = getpass()
RTR_01 = {
"device_type": "cisco_ios",
"host": "10.10.10.10",
"username": "admin",
"password": password,
}
RTR_02 = {
"device_type": "cisco_ios",
"host": "10.10.10.11",
"username": "admin",
"password": password,
}
device_list = [RTR_01, RTR_02]
for device in device_list:
print("Connecting to the device :" + device["host"])
net_connect = ConnectHandler(**device)
output = net_connect.send_command("show ip interface brief")
print(output)
output = net_connect.send_command("show version")
print(output)
net_connect.disconnect() # to clear the vty line when done
And this is a better version of your code that does the same exact thing:
from getpass import getpass
from netmiko import ConnectHandler
password = getpass()
ipaddrs = ["10.10.10.10", "10.10.10.11"]
# A list comprehension
devices = [
{
"device_type": "cisco_ios",
"host": ip,
"username": "admin",
"password": password,
}
for ip in ipaddrs
]
for device in devices:
print(f'Connecting to the device: {device["host"]}')
with ConnectHandler(**device) as net_connect: # Using Context Manager
intf_brief = net_connect.send_command(
"show ip interface brief"
) # Inside the connection
facts = net_connect.send_command("show version") # Inside the connection
# Notice here I didn't call the `net_connect.disconnect()`
# because the `with` statement automatically disconnects the session.
# On this indentation level (4 spaces), the connection is terminated
print(intf_brief)
print(facts)
The outputs (
intf_brief
andfacts
) are printed outside the connection, because the session is not needed anymore to print any collected values.
Upvotes: 0