我可能做错了什么,但使用 Cisco WLC 的 Netmiko 输出作为 TTP 的输入,最终结果不是真正的字典。
第1步:这是我的脚本:
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_profile }}">
wlan {{ wlan_profile }} {{ wlan_id }} {{ ssid }}
security wpa psk set-key ascii {{ psk-encrp-method }} {{ guest-psk | ORPHRASE }}
shutdown {{ state | set ("disabled") }}
</group>
</template>
"""
parser = ttp(data=data_to_parse, template=ttp_template)
parser.parse()
cisco_wlanTemplates = parser.result(structure="dictionary")
print(json.dumps(cisco_wlanTemplates, sort_keys=True, indent=4, separators=(',', ': ')))
for cisco_wlan in cisco_wlanTemplates:
print ('WLAN Profile: ',*cisco_wlan)
这是 Netmiko 输出:
wlan GUEST_local 49 GuestSSID
assisted-roaming prediction
client association limit radio 31
description "Guest with local forwarding"
no security ft adaptive
security wpa psk set-key ascii 8 TaIQFQeIOPX^ZCIEbbggNLMiFNGSAYVBecRF
no security wpa akm dot1x
security wpa akm psk
no shutdown
这是解析器输出:
{
"GUEST_wlan_profile": [
{
"GUEST_local": {
"guest-psk": "TaIQFQeIOPX^ZCIEbbggNLMiFNGSAYVBecRF",
"psk-encrp-method": "8",
"ssid": "GuestNet",
"wlan_id": "49"
}
}
]
}
这是我打印字典项目得到的:
WLAN Profile: G U E S T _ w l a n _ p r o f i l e
如果我尝试从假定的嵌套字典中获取第一个元素,这就是我得到的结果: 代码:
for cisco_wlan in cisco_wlanTemplates:
print ('WLAN Profile: ',cisco_wlan[0])
输出:
WLAN Profile: G
第 2 步: 现在使用此输出,我得到了不同的打印结果:
代码:
ttp_template = """
<template name="GUEST_wlan_profile">
<group name="{{ wlan_profile }}">
wlan {{ wlan_profile }} {{ wlan_id }} {{ ssid }}
<group>
security wpa psk set-key ascii {{ psk-encrp-method }} {{ guest-psk | ORPHRASE }}
shutdown {{ state | set ("disabled") }}
</group>
</group>
</template>
"""
# create parser object and parse data using template:
parser = ttp(data=data_to_parse, template=ttp_template)
parser.parse()
cisco_wlanTemplates = parser.result(format='json')[0]
print(cisco_wlanTemplates)
输出:
[
{
"GUEST_local": [
{
"ssid": "GuestNet",
"wlan_id": "49"
},
{
"guest-psk": "TaIQFQeIOPX^ZCIEbbggNLMiFNGSAYVBecRF",
"psk-encrp-method": "8"
}
]
}
]
出于某种原因,在我看来,TTP 的输出创建了一个带有字典列表的初始字典,我不知道如何访问键和值。
我想通过 TTP 完成的是访问“guest-psk”来修改它,并在将来修改原始 Netmiko 输出中的其他功能,因此我需要嵌套字典来覆盖 Cisco 中所有不同的“WLAN 配置文件”设置设备。 这次我不想使用另一个解析器,也不想使用正则表达式来完成此任务。
我终于找到问题所在了,解析器输出的结构应该是“flat_list”:
cisco_wlanTemplates = parser.result(structure="flat_list")