You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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"
        }
    }
}

关键调整说明

  1. 结构优化:通过wlan_profiles.{{ wlan_profile }}的分组命名,生成清晰的嵌套字典,避免模板名成为多余层级。
  2. 结果提取:使用structure="flat_dict"获取扁平化结构,去除不必要的列表嵌套。
  3. 遍历方式:用items()方法遍历字典键值对,避免直接遍历键字符串导致的字符拆分问题。
  4. 状态匹配:覆盖no shutdown和shutdown两种情况,确保state字段正确赋值。

内容的提问来源于stack exchange,提问作者ZeusTM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 23:39:50