使用TTP解析Cisco WLC的Netmiko输出,无法正确获取字典结构
解决TTP解析Cisco WLC输出后的字典访问问题
问题背景
使用TTP解析Cisco WLC的show run输出时,解析结果的嵌套结构不符合预期,无法正常遍历和访问guest-psk等配置项,需要得到可直接修改的标准嵌套字典。
初始尝试的问题
原模板解析后得到的结构包含多余层级,遍历字典时会将键字符串拆分为单个字符输出;修改模板后数据又被拆分到不同子字典,无法一次性获取完整的WLAN配置信息。
解决方案
修正后的TTP模板
调整分组逻辑,确保所有相关字段归到同一层级,并优化状态字段的匹配:
<template name="GUEST_wlan_profile"> <group name="wlan_profiles.{{ wlan_profile }}"> wlan {{ wlan_profile }} {{ wlan_id }} {{ ssid }} security wpa psk set-key ascii {{ psk-encrp-method }} {{ guest-psk | ORPHRASE }} no shutdown {{ state | set("enabled") }} shutdown {{ state | set("disabled") }} </group> </template>
wlan_profiles.{{ wlan_profile }}:创建顶级键wlan_profiles,将每个WLAN配置作为子键嵌套其中,结构更直观。- 同时匹配
no shutdown和shutdown,自动映射state字段为enabled或disabled。
修正后的脚本代码
from netmiko import ConnectHandler from ttp import ttp import json # 设备信息(需自行补充) device = { "device_type": "cisco_wlc", "ip": "your_wlc_ip", "username": "your_username", "password": "your_password" } with ConnectHandler(**device) as net_connect: wlc_hostname = net_connect.find_prompt()[:-1] data_to_parse = net_connect.send_command('show run | sec ^wlan.+_([0-9])+_GuestNet') print(data_to_parse) ttp_template = """ <template name="GUEST_wlan_profile"> <group name="wlan_profiles.{{ wlan_profile }}"> wlan {{ wlan_profile }} {{ wlan_id }} {{ ssid }} security wpa psk set-key ascii {{ psk-encrp-method }} {{ guest-psk | ORPHRASE }} no shutdown {{ state | set("enabled") }} shutdown {{ state | set("disabled") }} </group> </template> """ parser = ttp(data=data_to_parse, template=ttp_template) parser.parse() # 提取扁平化字典结构,避免多余列表嵌套 cisco_wlanTemplates = parser.result(structure="flat_dict")[0] print("\n解析结果:") print(json.dumps(cisco_wlanTemplates, sort_keys=True, indent=4, separators=(',', ': '))) # 正常遍历与访问配置项 print("\n遍历WLAN配置:") for profile_name, profile_data in cisco_wlanTemplates['wlan_profiles'].items(): print(f"Profile Name: {profile_name}") print(f"WLAN ID: {profile_data['wlan_id']}") print(f"SSID: {profile_data['ssid']}") print(f"PSK: {profile_data['guest-psk']}") print(f"State: {profile_data['state']}\n") # 修改PSK示例 cisco_wlanTemplates['wlan_profiles']['GUEST_local']['guest-psk'] = "NewSecurePSK_2024!" print("修改后的PSK:", cisco_wlanTemplates['wlan_profiles']['GUEST_local']['guest-psk'])
预期解析结果
{ "wlan_profiles": { "GUEST_local": { "guest-psk": "TaIQFQeIOPX^ZCIEbbggNLMiFNGSAYVBecRF", "psk-encrp-method": "8", "ssid": "GuestSSID", "wlan_id": "49", "state": "enabled" } } }
关键调整说明
- 结构优化:通过
wlan_profiles.{{ wlan_profile }}的分组命名,生成清晰的嵌套字典,避免模板名成为多余层级。 - 结果提取:使用
structure="flat_dict"获取扁平化结构,去除不必要的列表嵌套。 - 遍历方式:用
items()方法遍历字典键值对,避免直接遍历键字符串导致的字符拆分问题。 - 状态匹配:覆盖
no shutdown和shutdown两种情况,确保state字段正确赋值。
内容的提问来源于stack exchange,提问作者ZeusTM
相关产品推荐
相关产品推荐

