Alcatel-Lucent Enterprise AOS CLI parsing
Python package for Alcatel-Lucent Enterprise aos6 and aos8 parsing based on TextFSM templates.
Parse semi-structured cli data to structured data ready to be ingested by your network automation pipeline. Automatically transform gathered output from screen-scraping tools like Netmiko, Scrapli and Paramiko. Receive uniform data across Alcatel-Lucent Enterprise devices running aos6 or aos8.
Textfsm-aos can be installed using Git + Poetry or PyPI.
git clone https://github.com/jefvantongerloo/textfsm-aos
poetry install
pip install textfsm-aos
Provide screen-scraped data to parser
from textfsm_aos.parser import parse
sample_data = """
Package Release Size Description
-----------------+---------------+--------+-----------------------------------
KFbase.img 6.7.2.89.R06 18059551 Alcatel-Lucent Enterprise Base Softw
KFos.img 6.7.2.89.R06 3566798 Alcatel-Lucent Enterprise OS
KFeni.img 6.7.2.89.R06 6123991 Alcatel-Lucent Enterprise NI softwar
KFsecu.img 6.7.2.89.R06 649383 Alcatel-Lucent Enterprise Security M
"""
parse("ale_aos6", "show microcode", sample_data)
parsed result
[
{
"package":"KFbase.img",
"release":"6.7.2.89.R06",
"size":"18059551",
"description":"Alcatel-Lucent Enterprise Base Softw"
},
{
"package":"KFos.img",
"release":"6.7.2.89.R06",
"size":"3566798",
"description":"Alcatel-Lucent Enterprise OS"
},
{
"package":"KFeni.img",
"release":"6.7.2.89.R06",
"size":"6123991",
"description":"Alcatel-Lucent Enterprise NI softwar"
},
{
"package":"KFsecu.img",
"release":"6.7.2.89.R06",
"size":"649383",
"description":"Alcatel-Lucent Enterprise Security M"
}
]
Due to sensitive information the gathered live data for integration testing is stored in a private repository. Releases are tested against following aos versions:
aos version | tests |
---|---|
6.7.2.122.R08 | ✔️ |
8.9.73.R01 | ✔️ |
8.8.56.R02 | ✔️ |
8.8.152.R01 | ✔️ |
8.9.73.R01 | ✔️ |
8.9.94.R04 | ✔️ |
8.9.107.R02 | ✔️ |
8.9.221.R03 | ✔️ |
command | aos6 | aos8 |
---|---|---|
history | alias: show history |
✔️ |
show 802.1x users | ✔️ | alias: show unp user |
show 802.1x users unp | ✔️ | ❌ |
show 802.1x non-supplicant | ✔️ | ❌ |
show 802.1x non-supplicant unp | ✔️ | ❌ |
show arp | ❌ | ✔️ |
show chassis | ✔️ | ✔️ |
show cmm | ❌ | ✔️ |
show command-log | ✔️ | ✔️ |
show hardware-info | ❌ | ✔️ |
show health | ✔️ | ✔️ |
show history | ✔️ | alias: history |
show interface status | ✔️ | ✔️ |
show interfaces | ❌ | ✔️ |
show ip interface | ✔️ | ✔️ |
show ip route | ✔️ | alias: show ip routes |
show ip router database | ❌ | ✔️ |
show ip routes | alias: show ip route |
✔️ |
show linkagg | ❌ | ✔️ |
show linkagg port | ❌ | ✔️ |
show lld remote system | ✔️ | ❌ |
show log events | ❌ | ✔️ |
show mac-address-table | ✔️ | alias: show mac-learning |
show mac-learning | alias: show mac-address-table |
✔️ |
show microcode | ✔️ | ✔️ |
show ntp server status | ✔️ | ✔️ |
show port-security brief | ❌ | ✔️ |
show qos port | ❌ | ✔️ |
show unp user | alias: show 802.1x users |
✔️ |
show unp user details | ❌ | ✔️ |
show user | ✔️ | ✔️ |
show running-directory | ❌ | ✔️ |
show qos log | ❌ | ✔️ |
show snmp station | ✔️ | ✔️ |
show snmp community map | ✔️ | alias: show snmp community-map |
show snmp community-map | alias: show snmp community map |
✔️ |
show spantree ports | ❌ | ✔️ |
show system | ✔️ | ✔️ |
show transceivers | ❌ | ✔️ |
show vlan | ✔️ | ✔️ |
show vlan members | ❌ | ✔️ |
show vlan port mobile | ✔️ | ❌ |
Bypass the build-in parser functionality and use the TextFSM templates directly in network cli scraping and orchestration tools like Netmiko, Scrapli and Ansible.
Python script:
from scrapli import Scrapli
from scrapli.helper import textfsm_parse
device = {
"host": "<host ip>",
"auth_username": "<username>",
"auth_password": "<password>",
"auth_strict_key": False,
"transport": "ssh2",
"platform": "alcatel_aos",
}
with Scrapli(**device) as conn:
response = conn.send_command("show health").result
structured_response = textfsm_parse(
"templates/ale_aos6_show_health.textfsm", response
)
Example output:
[
{
"resource":"Receive",
"limit":"80",
"current":"01",
"min_avg":"01",
"hr_avg":"01",
"hr_max":"01"
},
{
"resource":"Transmit/Receive",
"limit":"80",
"current":"01",
"min_avg":"01",
"hr_avg":"01",
"hr_max":"01"
},
{
"resource":"Memory",
"limit":"80",
"current":"76",
"min_avg":"76",
"hr_avg":"76",
"hr_max":"76"
},
{
"resource":"Cpu",
"limit":"80",
"current":"32",
"min_avg":"33",
"hr_avg":"29",
"hr_max":"97"
}
]
Python script:
from netmiko import ConnectHandler
device = {
'device_type': 'alcatel_aos',
'host': '<host ip>',
'username': '<username>',
'password': '<password>'
}
with ConnectHandler(**device) as conn:
output = conn.send_command("show health", use_textfsm=True, textfsm_template="textfsm-aos/templates/ale_aos6_show_health.textfsm")
Example Output:
[
{
"resource":"Receive",
"limit":"80",
"current":"01",
"min_avg":"01",
"hr_avg":"01",
"hr_max":"01"
},
{
"resource":"Transmit/Receive",
"limit":"80",
"current":"01",
"min_avg":"01",
"hr_avg":"01",
"hr_max":"01"
},
{
"resource":"Memory",
"limit":"80",
"current":"76",
"min_avg":"76",
"hr_avg":"76",
"hr_max":"76"
},
{
"resource":"Cpu",
"limit":"80",
"current":"32",
"min_avg":"33",
"hr_avg":"29",
"hr_max":"97"
}
]
Ansible task:
- name: AOS6 >> parsed with textfsm
set_fact:
health: "{{ health-aos6 | ansible.netcommon.parse_cli_textfsm('textfsm/templates/ale_aos6_show_health.textfsm') }}"
Example Output:
health:
- healthModuleCpu1HrAvg: '29'
healthModuleCpu1HrMax: '98'
healthModuleCpu1MinAvg: '26'
healthModuleCpuLatest: '31'
healthModuleCpuLimit: '80'
healthModuleMemory1HrAvg: '76'
healthModuleMemory1HrMax: '76'
healthModuleMemory1MinAvg: '76'
healthModuleMemoryLatest: '76'
healthModuleMemoryLimit: '80'
healthModuleRx1HrAvg: '01'
healthModuleRx1HrMax: '01'
healthModuleRx1MinAvg: '01'
healthModuleRxLatest: '01'
healthModuleRxLimit: '80'
healthModuleRxTxRx1HrAvg: '01'
healthModuleRxTxRx1HrMax: '01'
healthModuleRxTxRx1MinAvg: '01'
healthModuleRxTxRxLatest: '01'
healthModuleRxTxRxLimit: '80'
healthModuleSlot: '1'
-
Fork and create a branch with naming
<platform>_<command>
(for example: ale_aos8_show_system). -
Add TextFSM template file in templates folder with naming
<platform>_<command>.textfsm
. -
Add entry in templates_index with attribute command and platform.
-
Add test folder in 'templates' with naming
<platform>_<command>
. -
Add sample cli output file in newly created folder
<platform>_<command>.txt
. -
Add expected parsed data from sample cli output in
<platform>_<command>.yml
. -
Run linting
tox
and testspytest
.
-
Install
Poetry
package manager viapip install poetry
-
Install dev dependencies and textfsm-aos package in development mode with
poetry install
-
Open virtual environment
poetry shell
- Google TextFSM: https://github.com/google/textfsm
- Scrapli: https://github.com/carlmontanari/scrapli
- Netmiko: https://github.com/ktbyers/netmiko
- Getting started with TextFSM: https://pyneng.readthedocs.io