0

I'm trying to figure out a textfsm parser to process cisco ios object-lists for use with an Ansible playbook task. (Background: There isn't an ios module for object-groups, so I'm trying to do this manually. Yes, there is a ios.ios_acls, but it doesn't do object-gruops. Yes, the ASA has an object-group module but its not compatible.)

The example input and parser below comes close but I can't get the "LINES" to be combined in a list without some other aspect to break or align incorrectly.

My current parser:

Value Required,Filldown NAME ((network|service|v6-network|v6-service)\s(\S+))
Value List LINES (.*)

Start
  ^object-group -> Continue.Clearall
  ^object-group ${NAME}
  ^ ${LINES} -> Record

EOF

Example input data:

object-group network TEST-obj-1
host 192.168.1.11
host 192.168.1.12
host 192.168.1.13
host 192.168.1.14
object-group network TEST-obj-2
host 192.168.2.21
host 192.168.2.22
host 192.168.2.33
object-group service TEST-ports
tcp eq 22
tcp eq www
tcp eq 443
udp eq tftp
tcp eq telnet
udp eq 3389

Example output:

[
{
    "NAME": "network TEST-obj-1",
    "LINES": [
        "host 192.168.1.11"
    ]
},
{
    "NAME": "network TEST-obj-1",
    "LINES": [
        "host 192.168.1.12"
    ]
},
{
    "NAME": "network TEST-obj-1",
    "LINES": [
        "host 192.168.1.13"
    ]
},
{
    "NAME": "network TEST-obj-1",
    "LINES": [
        "host 192.168.1.14"
    ]
},
{
    "NAME": "network TEST-obj-2",
    "LINES": [
        "host 192.168.2.21"
    ]
},
{
    "NAME": "network TEST-obj-2",
    "LINES": [
        "host 192.168.2.22"
    ]
},
{
    "NAME": "network TEST-obj-2",
    "LINES": [
        "host 192.168.2.33"
    ]
},
{
    "NAME": "service TEST-ports",
    "LINES": [
        "tcp eq 22"
    ]
},
{
    "NAME": "service TEST-ports",
    "LINES": [
        "tcp eq www"
    ]
},
{
    "NAME": "service TEST-ports",
    "LINES": [
        "tcp eq 443"
    ]
},
{
    "NAME": "service TEST-ports",
    "LINES": [
        "udp eq tftp"
    ]
},
{
    "NAME": "service TEST-ports",
    "LINES": [
        "tcp eq telnet"
    ]
},
{
    "NAME": "service TEST-ports",
    "LINES": [
        "udp eq 3389"
    ]
}
]

Desired output, which should be easier to use in a Ansible ios.cli_command task:

[
{
    "NAME": "network TEST-obj-1",
    "LINES": [
        "host 192.168.1.11",
    "host 192.168.1.12",
        "host 192.168.1.13",
        "host 192.168.1.14"
    ]
},
{
    "NAME": "network TEST-obj-2",
    "LINES": [
        "host 192.168.2.21",
        "host 192.168.2.22",
        "host 192.168.2.23"

    ]
},
{
    "NAME": "service TEST-ports",
    "LINES": [
        "tcp eq 22",
        "tcp eq www",
        "tcp eq 443",
        "udp eq tftp",
        "tcp eq telnet",
        "udp eq 3389",
    ]
},
{
]

1 Answer 1

0

In the interest of saving some future person my pain; here is the solution that worked for me:

Value GROUPNAME (object-group (network|service|v6-network|v6-service).*)
Value List LINES ((host|tcp|udp).*)

Start
  ^object-group -> Continue.Record
  ^${GROUPNAME}
  ^\s*${LINES}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.