Open Dictionary File in Python

Question:

I am trying to develop a Python script that will log into hundreds of Cisco IOS devices and configure them. The issue I am running into is that I do not want to define the device dictionary in the script itself, but have the script refer to a file (YAML?) and loop through the devices in the file. The script looks like this:

from netmiko import ConnectHandler

R1 = {
    'device_type': 'cisco_ios',
    'ip': '192.168.122.71',
    'username': 'admin',
    'password': 'cisco'
}

R2 = {
    'device_type': 'cisco_ios',
    'ip': '192.168.122.82',
    'username': 'admin',
    'password': 'cisco'
}


with open('snmp_configs.txt') as f:
    lines = f.read().splitlines()
print (lines)

all_devices = [R1, R2]

for devices in all_devices:
    net_connect = ConnectHandler(**devices)
    output = net_connect.send_config_set(lines)
    print (output)

As you can see I have R1 and R2 defined using dictionaries, but I don’t want to add hundreds of device dictionaries in the script itself.

Asked By: ccsmooth

||

Answers:

You can use either JSON or YAML format to store devices list and load the file in the script.

To use JSON format, create a file with .json extension, e.g. devices.json with following content:

[
   {
      "device_type":"cisco_ios",
      "ip":"192.168.122.71",
      "username":"admin",
      "password":"cisco"
   },
   {
      "device_type":"cisco_ios",
      "ip":"192.168.122.82",
      "username":"admin",
      "password":"cisco"
   }
]

To use YAML, do the same but this time with .yaml extension, e.g. devices.yaml with below content. To load this file you will need to install the PyYAML package (e.g. pip install PyYAML)

- device_type: cisco_ios
  ip: 192.168.122.71
  username: admin
  password: cisco
- device_type: cisco_ios
  ip: 192.168.122.82
  username: admin
  password: cisco

You can load the two files in the script like this:

import json
import yaml

# Load the json file
with open("devices.json") as f:
    all_devices = json.load(f)
    print(all_devices)

# Load the YAML file
with open("devices.yaml") as f:
    all_devices = yaml.safe_load(f)
    print(all_devices)

for device in all_devices:
    print(device)
Answered By: Dan Constantinescu

ConfigParser will get the job done. Like the JSON module, it’s part of the standard library. It uses ini files.

devices.ini

[R1]
device_type = cisco_ios
ip = 192.168.122.71
username = admin
password = cisco
[R2]
device_type = cisco_ios
ip = 192.168.122.82
username admin
password cisco

Python code:

import configparser
#from netmiko import ConnectHandler

config = configparser.ConfigParser()
config.read('devices.ini')

devices = config.sections()

for device in devices:
    if config[device]['device_type'] == 'cisco_ios':
        print(device)
Answered By: bfris
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.