Getting started with Network Automation using Python and Netmiko pt II

Let’s get started where we left off from part one.. With an upstream and downstream reading from the router, rather crudely extracted from a line of text output and placed into a pair of variables.

So, previously we were able to print the bandwidth values prepended by some text. This time we will wrap some text around these variables to create meaningful IOS commands ready for delivery to our device.

Let’s start where we generated screen output from last time :

print ("bandwidth",upstream)

print ("bandwidth receive",downstream)

 

We can use this text and the variables to create a new string to build each command we’ll be sending to the router :

 

upstream_cli = "bandwidth " + upstream

downstream_cli = "bandwidth receive " + downstream

 

Now we need to make some preparations to send these to the router by placing them into a list.

cli_commands = ['interface dialer 0', upstream_cli, downstream_cli]

Direct Access Engineers
Data Centre

We have created a list, which Netmiko will iterate over and deliver to the router in order. We get this done by passing the list to Netmiko’s send_config_set method. Remember that we already setup the ssh connection via net_connect to the router earlier in part 1, which should still be active.

 

Recall that Netmiko already knows we are configuring a Cisco device, so it helpfully adds the required ‘conf t’ as it delivers the commands for us.

net_connect.enable() # enter enable mode

net_connect.send_config_set(cli_commands) # send the commands from our list

net_connect.disconnect() # close the connection gracefully

 

And there we have it, our first automated configuration change is complete. If we log onto the router, a ‘show run int dial 0’ verifies that our commands have been successfully delivered.

interface Dialer0

bandwidth 760

bandwidth receive 4347

snip-

 

For reference, here is the finished Python code :

from netmiko import ConnectHandler

router = {

'device_type': 'cisco_ios',

'ip': 'IP_ADDRESS',

'username': 'USERNAME',

'password': 'PASSWORD',

'port' : 22, # optional, defaults to 22

'secret': 'ENABLE PASSWORD', # optional, defaults to ''

'verbose': True, # optional, defaults to True

}

net_connect = ConnectHandler(**router)

output = net_connect.send_command('show controllers vdsl 0')

output = output.split('n')

print ("parsing output..n")

for line in output:

if '(kbps)' in line:

speed = line

print (line,'n')

speed = speed.split(' ')

downstream = str(speed[19])

upstream = str(speed[37])

upstream_cli = "bandwidth " + upstream

downstream_cli = "bandwidth receive " + downstream

cli_commands = ['interface dialer 0', upstream_cli, downstream_cli]

for line in cli_commands:

print (line)

net_connect.enable()

net_connect.send_config_set(cli_commands)

net_connect.disconnect()

 

Solutions