0

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)
1
  • 2
    Possible you need make indentations properly: programming-hero.com/blog/… Currently you for loop contain single print call. Commented Jun 17, 2021 at 14:50

2 Answers 2

1

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.

Sign up to request clarification or add additional context in comments.

Comments

0

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 and facts) are printed outside the connection, because the session is not needed anymore to print any collected values.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.