问题:我试图使用一个包含每个设备的可变信息的基本模板对一些网络设备进行大规模编码。当前的编码不能很好地扩展,特别是在配置文件中分配来自.csv的变量和用所述变量替换文本是在我开始研究10+变量时似乎不必要地庞大的部分。例如(变量=行‘列名’)和(data =data.replace(‘{变量}’,变量))
从.csv中的每一列自动生成基本变量将完全转义我。有几个变量是生成的变量的组合似乎是可以的。对于替换部分,我考虑了将变量放在列表中并在列表中迭代,因为名称是相同的,但是除了手动编码列表之外,我想不出一种方法。
我选择了熊猫和csv,因为我喜欢它的代码看起来是如此的简洁和简洁。我还做了一些测试,从csv中提取数据,并写了大约20行左右的行来比较它们之间的差异,并看到了两种方法之间大约2秒的差别。我从来没有见过一次向超过25到50台设备推介新的信息,数据与csv的读写是可以忽略不计的,但我可能弄错了。
=========================================================================
对于参考,凝固汽油弹以下列方式从文件中读取配置:
driver = get_network_driver("ios")
with driver(IP, Username, Password) as device:
device.load_merge_candidate(filename='Config.cfg')Config.cfg文件只是一个装载了ios命令的文件,但是要对多个设备进行编程,我需要遍历一个.csv文件,该文件中填充了配置文件中替换所需的变量。
基本配置文件示例
Base_Config.cfg
hostname {hostname}
spanning-tree mode rapid-pvst
udld enable
interface vlan {managementVLAN}
ip address {managementIP} {managementSubnet}.csv示例文件
ios_switch_info.csv
Temp IP,Building,Room,Device Role,Management IP,Management Subnet
192.168.1.1,Main,001,Access,10.1.1.2,255.255.255.0
192.168.1.2,Main,101,Access,10.1.1.3,255.255.255.0
192.168.1.3,Branch,007,Access,10.1.2.2,255.255.255.0临时配置文件示例
Temp.cfg
hostname MainAcc001
spanning-tree mode rapid-pvst
udld enable
interface vlan 101
ip address 10.1.1.2 255.255.255.0脚本示例
Base_IOS_Config.py
import os
import pandas as pd
from getpass import getpass
from napalm import get_network_driver
username = input("Username: ")
password = getpass()
driver = get_network_driver("ios")
df = pd.read_csv('ios_switch_info.csv')
for index, row in df.iterrows():
# This section of variable assignment could get very long
tempIP = row['Temp IP']
building = row['Building']
room = row['Room']
deviceRole= row['Device Role']
managementIP = row['Management IP']
managementSubnet= row['Management Subnet']
hostname = row['Building'] + row['Device Role'][:3] + row['Room']
managementVLAN = int(managementIP.split('.')[2]) + 100
with open('Base_Config.cfg', 'r') as base_config:
data = base_config.read()
# This section of replacement could get very long depending on number of variables
data = data.replace('{hostname}', hostname)
data = data.replace('{managementIP}', managementIP)
data = data.replace('{managementSubnet}', managementSubnet)
data = data.replace('{managementVLAN}', managementVLAN)
with open('Temp.cfg', 'w') as temp_config:
temp_config.write(data)
with driver(tempIP,username,password) as device:
print(f"Accessing {hostname}")
device.load_merge_candidate(filename='Temp.cfg')
........other stuff..........
device.close()
os.remove('Temp.cfg')发布于 2020-08-27 13:28:39
我最后得出的结果是分配来自.csv (特定于交换机的变量)和导入ios_creds *(跨多个交换机的变量,例如NTP服务器地址)的变量,而不是手动分配它们:
device_info = row.to_dict() # creates dict of .csv variables {column:variable}
device_info.update(**globals) # adds all global variables to dict为了将上述变量放入配置文件,而不是用data.replace逐行替换每个变量,我最后使用了以下内容:
for key, value in device_info.items():
data = data.replace("{" + str(key) + "}", str(value))这将解析配置文件,查找变量(例如{Hostname}),并将其替换为保存在字典中的相应变量(例如Hostname:MainAcc001)。
https://stackoverflow.com/questions/63511261
复制相似问题