我目前正在编写一个Python脚本,以便从csv文件中提取数据,以利用Jinja2模板生成cisco ASR配置。所有这些都运行得很好;但是,我需要修改一行,以便生成的输出使用正确的ASR配置语法。我有数百个这样做,并希望能够简单地生成一个简单的复制和粘贴到设备的ASR配置正确。有人能指导我做这件事的最简单的方法吗?
我的Python脚本:
import os
import jinja2
import csv
import re
# csv fileused
csv_file = "BFL1_AR1.csv"
with open(csv_file) as f:
read_csv = csv.DictReader(f)
for list_elements in read_csv:
generated_list = list_elements['TEST']
generated_list = generated_list.split()
list_elements['TEST'] = generated_list
pattern = re.findall('4323:(\d{1,9})\:\DD', )
print (pattern)
template_file = 'asr_generate_config.j2'
with open(template_file) as f:
list_template = f.read()
template = jinja2.Template(list_template)
print()
print('-' * 80)
print(template.render(list_elements))
print('-' * 80)
print()生成的输出:
--------------------------------------------------------------------------------
l2vpn bridge group 4323:63210:BD
l2vpn bridge group 4323:63210:BD bridge-domain 4323:63210:BD
l2vpn bridge group 4323:63210:BD bridge-domain 4323:63210:BD mac withdraw state-down
l2vpn bridge group 4323:63210:BD bridge-domain 4323:63210:BD mtu 9216
l2vpn bridge group 4323:63210:BD bridge-domain 4323:63210:BD interface be10.149
l2vpn bridge group 4323:63210:BD bridge-domain 4323:63210:BD interface be50.149
l2vpn bridge group 4323:63210:BD bridge-domain 4323:63210:BD vfi 4323:63210:BD
l2vpn bridge group 4323:63210:BD bridge-domain 4323:63210:BD vfi 4323:63210:BD vpn-id 1024571
l2vpn bridge group 4323:63210:BD bridge-domain 4323:63210:BD vfi 4323:63210:BD autodiscovery bgp
l2vpn bridge group 4323:63210:BD bridge-domain 4323:63210:BD vfi 4323:63210:BD autodiscovery bgp rd auto
l2vpn bridge group 4323:63210:BD bridge-domain 4323:63210:BD vfi 4323:63210:BD autodiscovery bgp route-target 4323:63210
interface be10.149 l2transport
interface be10.149 l2transport description CA/KXFN/201755/LVLC
interface be10.149 l2transport encapsulation dot1q 149
interface be10.149 l2transport rewrite ingress tag pop 1 symmetric
interface be10.149 l2transport ethernet-services access-group L2-FRAMES ingress
interface be50.149 l2transport
interface be50.149 l2transport description CA/KXFN/201755/LVLC
interface be50.149 l2transport encapsulation dot1q 149
interface be50.149 l2transport rewrite ingress tag pop 1 symmetric
interface be50.149 l2transport ethernet-services access-group L2-FRAMES ingress
--------------------------------------------------------------------------------我需要改变的是:
具有以下数据格式的每个实例: 4323:63210:BD --> 4323_63210
每个客户的网桥组ID将保持不变。我需要将第一个分号改为下划线,并删除最后一个分号和B&D字母。我一直在尝试使用regex & re.findall来做这件事,但是一直没有太多的运气。
CSV文件:
AR Unit ID AR_VLAN TEST CIRCUIT oline lookup uni lookup oline dummy service reference oline svlan assignment oline_BD_assignment oline_RT_assignment oline_vpnid_assignment end point node ring id Add BFL1-AR1/ 6K Topology New Router Port New_US_6K_Port Add 6K / 7609 Topology New_DS_6K_Port New 6K Port
4 4 MATCH 66/KDFN/102901/TWCS 66/KDFN/102901/TWCS_O_Line 66/KDFN/102901/TWCS DUMMY_OLINE_SVC173 4 4323:63163:BD 4323:63163 1024524 BKFECAAAI6001 #N/A 00GZPP/GE1L/BKFECAAA/BKFECAAA ae10.4 be10.4 00GZQB/GE1L/BKFECAAA/BKFECAAA be50.4 Po50.4
15 15 MATCH 66/KEFN/102374/TWCS 66/KEFN/102374/TWCS_O_Line 66/KEFN/102374/TWCS DUMMY_OLINE_SVC176 15 4323:63166:BD 4323:63166 1024527 BKFECAUZW2001 N66200 00GZPP/GE1L/BKFECAAA/BKFECAAA ae10.15 be10.15 00GZQB/GE1L/BKFECAAA/BKFECAAA be50.15 Po50.15
39 39 MATCH 66/KEFN/102539/TWCS 66/KEFN/102539/TWCS_O_Line 66/KEFN/102539/TWCS DUMMY_OLINE_SVC177 39 4323:63167:BD 4323:63167 1024528 BKFDCA12NN001 N66204 00GZPP/GE1L/BKFECAAA/BKFECAAA ae10.39 be10.39 00GZQB/GE1L/BKFECAAA/BKFECAAA be50.39 Po50.39
50 50 MATCH 66/KFFN/102600/TWCS 66/KFFN/102600/TWCS_O_Line 66/KFFN/102600/TWCS DUMMY_OLINE_SVC203 50 4323:63193:BD 4323:63193 1024554 SHFTCADIW2001 N66198 00GZPP/GE1L/BKFECAAA/BKFECAAA ae10.50 be10.50 00GZQB/GE1L/BKFECAAA/BKFECAAA be50.50 Po50.50Jinja2模板
l2vpn bridge group {{ oline_BD_assignment }}
l2vpn bridge group {{ oline_BD_assignment }} bridge-domain {{ oline_BD_assignment }}
l2vpn bridge group {{ oline_BD_assignment }} bridge-domain {{ oline_BD_assignment }} mac withdraw state-down
l2vpn bridge group {{ oline_BD_assignment }} bridge-domain {{ oline_BD_assignment }} mtu 9216
l2vpn bridge group {{ oline_BD_assignment }} bridge-domain {{ oline_BD_assignment }} interface {{ New_US_6K_Port }}
l2vpn bridge group {{ oline_BD_assignment }} bridge-domain {{ oline_BD_assignment }} interface {{ New_DS_6K_Port }}
l2vpn bridge group {{ oline_BD_assignment }} bridge-domain {{ oline_BD_assignment }} vfi {{ oline_BD_assignment }}
l2vpn bridge group {{ oline_BD_assignment }} bridge-domain {{ oline_BD_assignment }} vfi {{ oline_BD_assignment }} vpn-id {{ oline_vpnid_assignment }}
l2vpn bridge group {{ oline_BD_assignment }} bridge-domain {{ oline_BD_assignment }} vfi {{ oline_BD_assignment }} autodiscovery bgp
l2vpn bridge group {{ oline_BD_assignment }} bridge-domain {{ oline_BD_assignment }} vfi {{ oline_BD_assignment }} autodiscovery bgp rd auto
l2vpn bridge group {{ oline_BD_assignment }} bridge-domain {{ oline_BD_assignment }} vfi {{ oline_BD_assignment }} autodiscovery bgp route-target {{ oline_RT_assignment }}
interface {{ New_US_6K_Port }} l2transport
interface {{ New_US_6K_Port }} l2transport description {{CIRCUIT}}
interface {{ New_US_6K_Port }} l2transport encapsulation dot1q {{ AR_VLAN }}
interface {{ New_US_6K_Port }} l2transport rewrite ingress tag pop 1 symmetric
interface {{ New_US_6K_Port }} l2transport ethernet-services access-group L2-FRAMES ingress
interface {{ New_DS_6K_Port }} l2transport
interface {{ New_DS_6K_Port }} l2transport description {{CIRCUIT}}
interface {{ New_DS_6K_Port }} l2transport encapsulation dot1q {{ AR_VLAN }}
interface {{ New_DS_6K_Port }} l2transport rewrite ingress tag pop 1 symmetric
interface {{ New_DS_6K_Port }} l2transport ethernet-services access-group L2-FRAMES ingress发布于 2021-12-01 14:55:12
如果您的ID将始终采用通用格式:
pattern = r'(?P<name>[0-9]{4}:[0-9]{5})'
re.findall(pattern, test_value)
# Will return a list of matches, which you can then substitute the : for a _或者,如果您想要更具体,以确保您也匹配:BD后缀:
pattern = r'(?P<name>[0-9]{4}:[0-9]{5}):[A-Z]{2}'在获取更多详细信息后添加一些编辑:
def convert(old_id):
pattern = r'(?P<name>[0-9]{4}:[0-9]{5})'
matches = re.match(pattern, old_id)
if matches:
match=matches[0]
else:
return 'some_default'
return match.replace(':','_')或者不使用正则表达式:
def convert_simple(old_id):
return '_'.join(old_id.split(':')[:2])但是,这不会对ID的表单进行验证,因此,如果您确信csv中的ID都是正确的,那么就使用它。
您可以使用该方法将ID为:格式的表单转换为_格式的表单
然后,在您的代码中,我将使用以下命令获取旧ID
old_id = list_elements['oline_BD_assignment']
new_id = convert(old_id)
list_elements['oline_BD_assignment'] = new_idhttps://stackoverflow.com/questions/70186210
复制相似问题