ansible.utils.cli_parse (4.0.0) — module

Parse cli output or text using a variety of parsers

| "added in version" 1.0.0 of ansible.utils"

Authors: Bradley Thornton (@cidrblock)

This plugin has a corresponding action plugin.

Install collection

Install with ansible-galaxy collection install ansible.utils:==4.0.0


Add to requirements.yml

  collections:
    - name: ansible.utils
      version: 4.0.0

Description

Parse cli output or text using a variety of parsers

Usage examples

  • Success
    Steampunk Spotter scan finished with no errors, warnings or hints.

# Using the native parser

# -------------
# templates/nxos_show_interface.yaml
# - example: Ethernet1/1 is up
#   getval: '(?P<name>\S+) is (?P<oper_state>\S+)'
#   result:
#     "{{ name }}":
#         name: "{{ name }}"
#         state:
#         operating: "{{ oper_state }}"
#   shared: True
#
# - example: admin state is up, Dedicated Interface
#   getval: 'admin state is (?P<admin_state>\S+)'
#   result:
#     "{{ name }}":
#         name: "{{ name }}"
#         state:
#         admin: "{{ admin_state }}"
#
# - example: "  Hardware: Ethernet, address: 0000.5E00.5301 (bia 0000.5E00.5301)"
#   getval: '\s+Hardware: (?P<hardware>.*), address: (?P<mac>\S+)'
#   result:
#     "{{ name }}":
#         hardware: "{{ hardware }}"
#         mac_address: "{{ mac }}"

- name: Run command and parse with native
  ansible.utils.cli_parse:
    command: "show interface"
    parser:
      name: ansible.netcommon.native
    set_fact: interfaces_fact
  • Success
    Steampunk Spotter scan finished with no errors, warnings or hints.

- name: Pass text and template_path
  ansible.utils.cli_parse:
    text: "{{ previous_command['stdout'] }}"
    parser:
      name: ansible.netcommon.native
      template_path: "{{ role_path }}/templates/nxos_show_interface.yaml"
  • Success
    Steampunk Spotter scan finished with no errors, warnings or hints.

# Using the ntc_templates parser

# -------------
# The ntc_templates use 'vendor_platform' for the file name
# it will be derived from ansible_network_os if not provided
# example cisco.ios.ios => cisco_ios

- name: Run command and parse with ntc_templates
  ansible.utils.cli_parse:
    command: "show interface"
    parser:
      name: ansible.netcommon.ntc_templates
  register: parser_output
  • Success
    Steampunk Spotter scan finished with no errors, warnings or hints.
- name: Pass text and command
  ansible.utils.cli_parse:
    text: "{{ previous_command['stdout'] }}"
    parser:
      name: ansible.netcommon.ntc_templates
      command: show interface
  register: parser_output
  • Success
    Steampunk Spotter scan finished with no errors, warnings or hints.

# Using the pyats parser

# -------------
# The pyats parser uses 'os' to locate the appropriate parser
# it will be derived from ansible_network_os if not provided
# in the case of pyats: cisco.ios.ios => iosxe

- name: Run command and parse with pyats
  ansible.utils.cli_parse:
    command: "show interface"
    parser:
      name: ansible.netcommon.pyats
  register: parser_output
  • Success
    Steampunk Spotter scan finished with no errors, warnings or hints.
- name: Pass text and command
  ansible.utils.cli_parse:
    text: "{{ previous_command['stdout'] }}"
    parser:
      name: ansible.netcommon.pyats
      command: show interface
  register: parser_output
  • Success
    Steampunk Spotter scan finished with no errors, warnings or hints.
- name: Provide an OS to pyats to use an ios parser
  ansible.utils.cli_parse:
    text: "{{ previous_command['stdout'] }}"
    parser:
      name: ansible.netcommon.pyats
      command: show interface
      os: ios
  register: parser_output
  • Success
    Steampunk Spotter scan finished with no errors, warnings or hints.

# Using the textfsm parser

# -------------
# templates/nxos_show_version.textfsm
#
# Value UPTIME ((\d+\s\w+.s.,?\s?){4})
# Value LAST_REBOOT_REASON (.+)
# Value OS (\d+.\d+(.+)?)
# Value BOOT_IMAGE (.*)
# Value PLATFORM (\w+)
#
# Start
#   ^\s+(NXOS: version|system:\s+version)\s+${OS}\s*$$
#   ^\s+(NXOS|kickstart)\s+image\s+file\s+is:\s+${BOOT_IMAGE}\s*$$
#   ^\s+cisco\s+${PLATFORM}\s+[cC]hassis
#   ^\s+cisco\s+Nexus\d+\s+${PLATFORM}
#   # Cisco N5K platform
#   ^\s+cisco\s+Nexus\s+${PLATFORM}\s+[cC]hassis
#   ^\s+cisco\s+.+-${PLATFORM}\s*
#   ^Kernel\s+uptime\s+is\s+${UPTIME}
#   ^\s+Reason:\s${LAST_REBOOT_REASON} -> Record

- name: Run command and parse with textfsm
  ansible.utils.cli_parse:
    command: "show version"
    parser:
      name: ansible.utils.textfsm
  register: parser_output
  • Success
    Steampunk Spotter scan finished with no errors, warnings or hints.
- name: Pass text and command
  ansible.utils.cli_parse:
    text: "{{ previous_command['stdout'] }}"
    parser:
      name: ansible.utils.textfsm
      command: show version
  register: parser_output
  • Success
    Steampunk Spotter scan finished with no errors, warnings or hints.
# Using the ttp parser

# -------------
# templates/nxos_show_interface.ttp
#
# {{ interface }} is {{ state }}
# admin state is {{ admin_state }}{{ ignore(".*") }}

- name: Run command and parse with ttp
  ansible.utils.cli_parse:
    command: "show interface"
    parser:
      name: ansible.utils.ttp
    set_fact: new_fact_key
  • Success
    Steampunk Spotter scan finished with no errors, warnings or hints.
- name: Pass text and template_path
  ansible.utils.cli_parse:
    text: "{{ previous_command['stdout'] }}"
    parser:
      name: ansible.utils.ttp
      template_path: "{{ role_path }}/templates/nxos_show_interface.ttp"
  register: parser_output
  • Success
    Steampunk Spotter scan finished with no errors, warnings or hints.
# Using the XML parser

# -------------
- name: Run command and parse with xml
  ansible.utils.cli_parse:
    command: "show interface | xml"
    parser:
      name: ansible.utils.xml
  register: parser_output
  • Success
    Steampunk Spotter scan finished with no errors, warnings or hints.
- name: Pass text and parse with xml
  ansible.utils.cli_parse:
    text: "{{ previous_command['stdout'] }}"
    parser:
      name: ansible.utils.xml
  register: parser_output

Inputs

    
text:
    description:
    - Text to be parsed
    type: str

parser:
    description:
    - Parser specific parameters
    required: true
    suboptions:
      command:
        description:
        - The command used to locate the parser's template
        type: str
      name:
        description:
        - The name of the parser to use
        required: true
        type: str
      os:
        description:
        - Provide an operating system value to the parser
        - For `ntc_templates` parser, this should be in the supported `<vendor>_<os>`
          format.
        type: str
      template_path:
        description:
        - Path of the parser template on the Ansible controller
        - This can be a relative or an absolute path
        type: str
      vars:
        description:
        - Additional parser specific parameters
        - See the cli_parse user guide for examples of parser specific variables
        - U(https://docs.ansible.com/ansible/latest/network/user_guide/cli_parsing.html)
        type: dict
    type: dict

command:
    description:
    - The command to run on the host
    type: str

set_fact:
    description:
    - Set the resulting parsed data as a fact
    type: str

Outputs

parsed:
  description: The structured data resulting from the parsing of the text
  returned: always
  sample: null
  type: dict
stdout:
  description: The output from the command run
  returned: when provided a command
  sample: null
  type: str
stdout_lines:
  description: The output of the command run split into lines
  elements: str
  returned: when provided a command
  sample: null
  type: list