|
| 1 | +#!/usr/bin/python |
| 2 | + |
| 3 | +# Copyright: (c) 2022 Steve Brasier [email protected] |
| 4 | +from __future__ import (absolute_import, division, print_function) |
| 5 | +__metaclass__ = type |
| 6 | + |
| 7 | +DOCUMENTATION = r''' |
| 8 | +--- |
| 9 | +module: grafana_elasticsearch_query |
| 10 | +
|
| 11 | +short_description: Get elasticsearch hits via grafana |
| 12 | +
|
| 13 | +version_added: "1.0.0" |
| 14 | +
|
| 15 | +description: Returns hits from selected datasource and indices. |
| 16 | +
|
| 17 | +author: |
| 18 | + - Steve Brasier |
| 19 | +''' |
| 20 | + |
| 21 | +EXAMPLES = r''' |
| 22 | +- name: Get elasticsearch hits |
| 23 | + grafana_elasticsearch_query: |
| 24 | + grafana_url: http://{{ grafana_api_address }}:{{ grafana_port }} |
| 25 | + grafana_username: grafana |
| 26 | + grafana_password: "{{ vault_grafana_admin_password }}" |
| 27 | + datasource: slurmstats |
| 28 | + index_pattern: 'filebeat-*' |
| 29 | +''' |
| 30 | + |
| 31 | +RETURN = r''' |
| 32 | +# These are examples of possible return values, and in general should use other names for return values. |
| 33 | +docs: |
| 34 | + description: List of dicts with the original json in each document. |
| 35 | + returned: always |
| 36 | + type: list |
| 37 | +''' |
| 38 | + |
| 39 | +from ansible.module_utils.basic import AnsibleModule |
| 40 | +import requests |
| 41 | +import json |
| 42 | + |
| 43 | +def run_module(): |
| 44 | + module_args = dict( |
| 45 | + grafana_url=dict(type="str", required=True), |
| 46 | + grafana_username=dict(type="str", required=True), |
| 47 | + grafana_password=dict(type="str", required=True), |
| 48 | + datasource=dict(type="str", required=True), |
| 49 | + index_pattern=dict(type="str", required=True), |
| 50 | + ) |
| 51 | + |
| 52 | + result = dict( |
| 53 | + changed=False, |
| 54 | + jobs=[] |
| 55 | + ) |
| 56 | + |
| 57 | + module = AnsibleModule(argument_spec=module_args, supports_check_mode=True) |
| 58 | + |
| 59 | + auth=(module.params['grafana_username'], module.params['grafana_password']) |
| 60 | + |
| 61 | + # list datasources: |
| 62 | + datasources_api_url = module.params["grafana_url"] + '/api/datasources' |
| 63 | + r = requests.get(datasources_api_url, auth=auth) |
| 64 | + datasources = json.loads(r.text) |
| 65 | + |
| 66 | + # select required datasource: |
| 67 | + ds = [s for s in datasources if s['name'] == module.params["datasource"]][0] |
| 68 | + |
| 69 | + # get documents: |
| 70 | + datasource_proxy_url = module.params["grafana_url"] + '/api/datasources/proxy/' + str(ds['id']) + '/' + module.params['index_pattern'] + '/_search' |
| 71 | + r = requests.get(datasource_proxy_url, auth=auth) |
| 72 | + search = json.loads(r.text) |
| 73 | + # see https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html#search-api-response-body: |
| 74 | + docs = [h['_source']['json'] for h in search['hits']['hits']] |
| 75 | + |
| 76 | + result = { |
| 77 | + 'docs': docs, |
| 78 | + } |
| 79 | + |
| 80 | + module.exit_json(**result) |
| 81 | + |
| 82 | + |
| 83 | +def main(): |
| 84 | + run_module() |
| 85 | + |
| 86 | + |
| 87 | +if __name__ == '__main__': |
| 88 | + main() |
0 commit comments