用Python打开字典文件



我正在尝试开发一个Python脚本,该脚本将登录数百台Cisco IOS设备并对其进行配置。我遇到的问题是,我不想在脚本本身中定义设备字典,而是让脚本引用一个文件(YAML?(并在文件中的设备中循环。脚本如下:

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)

正如您所看到的,我使用字典定义了R1和R2,但我不想在脚本中添加数百个设备字典。

您可以使用JSON或YAML格式来存储设备列表并在脚本中加载文件。

要使用JSON格式,请创建一个扩展名为.JSON的文件,例如devices.json,其内容如下:

[
   {
      "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"
   }
]

要使用YAML,请执行相同的操作,但这次使用了.YAML扩展,例如devices.yaml,内容如下。要加载此文件,您需要安装PyYAML包(例如pip-installPyYAML(

- 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

您可以在脚本中加载两个文件,如下所示:

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)

ConfigParser将完成该工作。与JSON模块一样,它也是标准库的一部分。它使用ini文件。

.vini

[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代码:

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)

最新更新