mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
3802d54922
JC: Add plugin parser functionality to JC Filter Plugin (#6043)
* Add plugin parser functionality to JC Filter Plugin
The parse function was added in jc v1.18.0 which allows plugin parsers to be used. This change will try the new API if available, else fallback to the old API so there is no change in behavior.
* remove whitespace from blank line
* Add changelog fragment for JC plugin parser support
* add .yml extension to file name
* Formatting
* add period at end
(cherry picked from commit c168f9c3be
)
Co-authored-by: Kelly Brazil <kellyjonbrazil@gmail.com>
160 lines
4.7 KiB
Python
160 lines
4.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Copyright (c) 2015, Filipe Niero Felisbino <filipenf@gmail.com>
|
|
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
#
|
|
# contributed by Kelly Brazil <kellyjonbrazil@gmail.com>
|
|
|
|
from __future__ import (absolute_import, division, print_function)
|
|
__metaclass__ = type
|
|
|
|
DOCUMENTATION = '''
|
|
name: jc
|
|
short_description: Convert output of many shell commands and file-types to JSON
|
|
version_added: 1.1.0
|
|
author: Kelly Brazil (@kellyjonbrazil)
|
|
description:
|
|
- Convert output of many shell commands and file-types to JSON.
|
|
- Uses the L(jc library,https://github.com/kellyjonbrazil/jc).
|
|
positional: parser
|
|
options:
|
|
_input:
|
|
description: The data to convert.
|
|
type: string
|
|
required: true
|
|
parser:
|
|
description:
|
|
- The correct parser for the input data.
|
|
- For example C(ifconfig).
|
|
- "Note: use underscores instead of dashes (if any) in the parser module name."
|
|
- See U(https://github.com/kellyjonbrazil/jc#parsers) for the latest list of parsers.
|
|
type: string
|
|
required: true
|
|
quiet:
|
|
description: Set to C(false) to not suppress warnings.
|
|
type: boolean
|
|
default: true
|
|
raw:
|
|
description: Set to C(true) to return pre-processed JSON.
|
|
type: boolean
|
|
default: false
|
|
requirements:
|
|
- jc installed as a Python library (U(https://pypi.org/project/jc/))
|
|
'''
|
|
|
|
EXAMPLES = '''
|
|
- name: Install the prereqs of the jc filter (jc Python package) on the Ansible controller
|
|
delegate_to: localhost
|
|
ansible.builtin.pip:
|
|
name: jc
|
|
state: present
|
|
|
|
- name: Run command
|
|
ansible.builtin.command: uname -a
|
|
register: result
|
|
|
|
- name: Convert command's result to JSON
|
|
ansible.builtin.debug:
|
|
msg: "{{ result.stdout | community.general.jc('uname') }}"
|
|
# Possible output:
|
|
#
|
|
# "msg": {
|
|
# "hardware_platform": "x86_64",
|
|
# "kernel_name": "Linux",
|
|
# "kernel_release": "4.15.0-112-generic",
|
|
# "kernel_version": "#113-Ubuntu SMP Thu Jul 9 23:41:39 UTC 2020",
|
|
# "machine": "x86_64",
|
|
# "node_name": "kbrazil-ubuntu",
|
|
# "operating_system": "GNU/Linux",
|
|
# "processor": "x86_64"
|
|
# }
|
|
'''
|
|
|
|
RETURN = '''
|
|
_value:
|
|
description: The processed output.
|
|
type: any
|
|
'''
|
|
|
|
from ansible.errors import AnsibleError, AnsibleFilterError
|
|
import importlib
|
|
|
|
try:
|
|
import jc # noqa: F401, pylint: disable=unused-import
|
|
HAS_LIB = True
|
|
except ImportError:
|
|
HAS_LIB = False
|
|
|
|
|
|
def jc_filter(data, parser, quiet=True, raw=False):
|
|
"""Convert returned command output to JSON using the JC library
|
|
|
|
Arguments:
|
|
|
|
parser required (string) the correct parser for the input data (e.g. 'ifconfig')
|
|
see https://github.com/kellyjonbrazil/jc#parsers for latest list of parsers.
|
|
quiet optional (bool) True to suppress warning messages (default is True)
|
|
raw optional (bool) True to return pre-processed JSON (default is False)
|
|
|
|
Returns:
|
|
|
|
dictionary or list of dictionaries
|
|
|
|
Example:
|
|
- name: run date command
|
|
hosts: ubuntu
|
|
tasks:
|
|
- name: install the prereqs of the jc filter (jc Python package) on the Ansible controller
|
|
delegate_to: localhost
|
|
ansible.builtin.pip:
|
|
name: jc
|
|
state: present
|
|
- ansible.builtin.shell: date
|
|
register: result
|
|
- ansible.builtin.set_fact:
|
|
myvar: "{{ result.stdout | community.general.jc('date') }}"
|
|
- ansible.builtin.debug:
|
|
msg: "{{ myvar }}"
|
|
|
|
produces:
|
|
|
|
ok: [192.168.1.239] => {
|
|
"msg": {
|
|
"day": 9,
|
|
"hour": 22,
|
|
"minute": 6,
|
|
"month": "Aug",
|
|
"month_num": 8,
|
|
"second": 22,
|
|
"timezone": "UTC",
|
|
"weekday": "Sun",
|
|
"weekday_num": 1,
|
|
"year": 2020
|
|
}
|
|
}
|
|
"""
|
|
|
|
if not HAS_LIB:
|
|
raise AnsibleError('You need to install "jc" as a Python library on the Ansible controller prior to running jc filter')
|
|
|
|
try:
|
|
# new API (jc v1.18.0 and higher) allows use of plugin parsers
|
|
if hasattr(jc, 'parse'):
|
|
return jc.parse(parser, data, quiet=quiet, raw=raw)
|
|
|
|
# old API (jc v1.17.7 and lower)
|
|
else:
|
|
jc_parser = importlib.import_module('jc.parsers.' + parser)
|
|
return jc_parser.parse(data, quiet=quiet, raw=raw)
|
|
|
|
except Exception as e:
|
|
raise AnsibleFilterError('Error in jc filter plugin: %s' % e)
|
|
|
|
|
|
class FilterModule(object):
|
|
''' Query filter '''
|
|
|
|
def filters(self):
|
|
return {
|
|
'jc': jc_filter,
|
|
}
|