DEV-258: added code to configure (users|roles) objects in elastic
parent
ea231be89f
commit
a0f70890f1
@ -0,0 +1,184 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
# creates elastic objetcs for smardigo instances
|
||||||
|
# to empower dudes to find relevant logmessages faster and
|
||||||
|
# reduce/abolish "monkey business" in creating needed ES-related objects for (devops|admin)-dudes
|
||||||
|
# - executed on stage specific server: {{ stage }}-elastic-stack-kibana-01-kibana
|
||||||
|
|
||||||
|
# Parameters:
|
||||||
|
# playbook inventory
|
||||||
|
# stage := the type of the stage (e.g. dev, int, qa, prod)
|
||||||
|
# tenant_id := (unique key for the tenant, e.g. customer)
|
||||||
|
# cluster_name := (business name for the cluster, e.g. product, department )
|
||||||
|
# cluster_size := (WIP node count for the cluster) (Currently max is 2 master/slave)
|
||||||
|
# cluster_services_str := (services to setup, e.g. 'connect,wordpress')
|
||||||
|
# smardigo message callback
|
||||||
|
# scope_id := (scope id of the management process)
|
||||||
|
# process_instance_id := (process instance id of the management process)
|
||||||
|
# smardigo_management_action := (smardigo management action anme of the management process)
|
||||||
|
|
||||||
|
#############################################################
|
||||||
|
# Creating inventory dynamically for given parameters
|
||||||
|
#############################################################
|
||||||
|
|
||||||
|
- hosts: localhost
|
||||||
|
gather_facts: false
|
||||||
|
connection: local
|
||||||
|
|
||||||
|
pre_tasks:
|
||||||
|
- name: "Check if ansible version is at least 2.10.x"
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- ansible_version.major >= 2
|
||||||
|
- ansible_version.minor >= 10
|
||||||
|
msg: "The ansible version has to be at least ({{ ansible_version.full }})"
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
cluster_services: "{{ cluster_services_str | split(',') }}"
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
- name: Add kibana server(s) to hosts if necessary
|
||||||
|
add_host:
|
||||||
|
name: "{{ stage }}-elastic-stack-kibana-01-kibana"
|
||||||
|
groups:
|
||||||
|
- "stage_{{ stage }}"
|
||||||
|
with_items: "{{ cluster_services }}"
|
||||||
|
when: item in ['connect']
|
||||||
|
|
||||||
|
#############################################################
|
||||||
|
# configure elastic search objects
|
||||||
|
#############################################################
|
||||||
|
- hosts: "stage_{{ stage }}"
|
||||||
|
serial: "{{ serial_number | default(1) }}"
|
||||||
|
gather_facts: no
|
||||||
|
remote_user: root
|
||||||
|
vars:
|
||||||
|
ansible_connection: local
|
||||||
|
ansible_ssh_host: "{{ stage_server_domain }}"
|
||||||
|
api_endpoint: '{{ stage }}-elastic-stack-kibana-01-kibana.{{ domain }}'
|
||||||
|
elastic_state: present
|
||||||
|
elastic_users:
|
||||||
|
-
|
||||||
|
username: '{{ stage }}-{{ tenant_id }}'
|
||||||
|
roles:
|
||||||
|
- '{{ stage }}-{{ tenant_id }}'
|
||||||
|
full_name: ''
|
||||||
|
password: '{{ password | default( stage + "-" + tenant_id ) }}'
|
||||||
|
email: '{{ email | default("") }}'
|
||||||
|
enabled: true
|
||||||
|
elastic_state: '{{ elastic_state }}'
|
||||||
|
elastic_roles:
|
||||||
|
-
|
||||||
|
elastic_state: '{{ elastic_state }}'
|
||||||
|
name: '{{ stage }}-{{ tenant_id }}'
|
||||||
|
elasticsearch:
|
||||||
|
cluster: []
|
||||||
|
indices:
|
||||||
|
- names:
|
||||||
|
- '{{ stage }}-{{ tenant_id }}-{{ cluster_name }}-*'
|
||||||
|
privileges:
|
||||||
|
- read
|
||||||
|
- read_cross_cluster
|
||||||
|
allow_restricted_indices: false
|
||||||
|
run_as: []
|
||||||
|
kibana:
|
||||||
|
- base: []
|
||||||
|
feature:
|
||||||
|
advancedSettings:
|
||||||
|
- read
|
||||||
|
dashboard:
|
||||||
|
- read
|
||||||
|
discover:
|
||||||
|
- read
|
||||||
|
indexPatterns:
|
||||||
|
- read
|
||||||
|
savedObjectsManagement:
|
||||||
|
- read
|
||||||
|
spaces:
|
||||||
|
- '{{ stage }}-{{ tenant_id }}'
|
||||||
|
elastic_spaces:
|
||||||
|
-
|
||||||
|
elastic_state: '{{ elastic_state }}'
|
||||||
|
id: &es_space_name '{{ stage }}-{{ tenant_id }}'
|
||||||
|
name: '{{ stage }}-{{ tenant_id }}'
|
||||||
|
description: ''
|
||||||
|
disabledFeatures:
|
||||||
|
- canvas
|
||||||
|
- maps
|
||||||
|
- ml
|
||||||
|
- visualize
|
||||||
|
- enterpriseSearch
|
||||||
|
- logs
|
||||||
|
- infrastructure
|
||||||
|
- apm
|
||||||
|
- uptime
|
||||||
|
- observabilityCases
|
||||||
|
- siem
|
||||||
|
- monitoring
|
||||||
|
- fleet
|
||||||
|
- stackAlerts
|
||||||
|
- actions
|
||||||
|
- osquery
|
||||||
|
- savedObjectsTagging
|
||||||
|
es_indexpattern_name: '{{ stage }}-{{ tenant_id }}-{{ cluster_name }}-*'
|
||||||
|
es_search_name: '{{ stage }}-{{ tenant_id }}-{{ cluster_name }}-{{ cluster_services_str }}'
|
||||||
|
es_dashboard_name: '{{ stage }}-{{ tenant_id }}-{{ cluster_name }}-{{ cluster_services_str }}'
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
- name: "Do some stuff in elastic with spaces ... "
|
||||||
|
include_role:
|
||||||
|
name: elastic
|
||||||
|
tasks_from: _configure_spaces.yml
|
||||||
|
apply:
|
||||||
|
tags:
|
||||||
|
- es-spaces
|
||||||
|
loop: "{{ elastic_spaces }}"
|
||||||
|
loop_control:
|
||||||
|
loop_var: elastic_space
|
||||||
|
tags:
|
||||||
|
- es-spaces
|
||||||
|
|
||||||
|
- name: "Do some stuff in elastic with roles ... "
|
||||||
|
include_role:
|
||||||
|
name: elastic
|
||||||
|
tasks_from: _configure_roles.yml
|
||||||
|
apply:
|
||||||
|
tags:
|
||||||
|
- es-roles
|
||||||
|
loop: "{{ elastic_roles }}"
|
||||||
|
loop_control:
|
||||||
|
loop_var: elastic_role
|
||||||
|
tags:
|
||||||
|
- es-roles
|
||||||
|
|
||||||
|
- name: "Do some stuff in elastic with users ... "
|
||||||
|
include_role:
|
||||||
|
name: elastic
|
||||||
|
tasks_from: _configure_users.yml
|
||||||
|
apply:
|
||||||
|
tags:
|
||||||
|
- es-users
|
||||||
|
loop: "{{ elastic_users }}"
|
||||||
|
loop_control:
|
||||||
|
loop_var: elastic_user
|
||||||
|
tags:
|
||||||
|
- es-users
|
||||||
|
|
||||||
|
- name: "Do some stuff in elastic with spaces ... "
|
||||||
|
include_role:
|
||||||
|
name: elastic
|
||||||
|
tasks_from: _import_savedobjects.yml
|
||||||
|
apply:
|
||||||
|
tags:
|
||||||
|
- es-importobjects
|
||||||
|
vars:
|
||||||
|
es_space: *es_space_name
|
||||||
|
es_indexpattern_title: '{{ es_indexpattern_name }}'
|
||||||
|
es_indexpattern_uuid: '{{ es_indexpattern_name | to_uuid }}'
|
||||||
|
es_search_title: '{{ es_search_name }}'
|
||||||
|
es_search_uuid: '{{ es_search_name | to_uuid }}'
|
||||||
|
es_panel_uuid: "{{ 'panel_' + es_dashboard_name | to_uuid }}"
|
||||||
|
es_dashboard_title: '{{ es_dashboard_name }}'
|
||||||
|
es_dashboard_uuid: '{{ es_dashboard_name | to_uuid }}'
|
||||||
|
tags:
|
||||||
|
- es-importobjects
|
||||||
@ -0,0 +1,166 @@
|
|||||||
|
---
|
||||||
|
- set_fact:
|
||||||
|
api_path: '/s/{{ es_space }}/api/saved_objects'
|
||||||
|
es_object_type: dashboard
|
||||||
|
dashboard_exists: False
|
||||||
|
elastic_dashboard_cleaned: {}
|
||||||
|
ref_obj_modified: {}
|
||||||
|
|
||||||
|
- name: "Dashboards: Get all searches in elasticsearch"
|
||||||
|
delegate_to: localhost
|
||||||
|
uri:
|
||||||
|
url: "https://{{ api_endpoint }}{{ api_path }}/_find?per_page=10000&type={{ es_object_type }}"
|
||||||
|
method: GET
|
||||||
|
status_code: [200]
|
||||||
|
user: "{{ elastic_admin_username_vault }}"
|
||||||
|
password: "{{ elastic_admin_password_vault }}"
|
||||||
|
force_basic_auth: yes
|
||||||
|
register: all_dashboards
|
||||||
|
become: false
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
lookup_dashboard_object: '{{ all_dashboards.json | community.general.json_query(querystr1) | first | community.general.json_query(dashboard_query) }}'
|
||||||
|
vars:
|
||||||
|
querystr1: "[saved_objects[*]]"
|
||||||
|
dashboard_query: "[?attributes.title=='{{ elastic_dashboard.attributes.title }}']"
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
dashboard_exists: True
|
||||||
|
when:
|
||||||
|
- lookup_dashboard_object | length > 0
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
elastic_dashboard_cleaned: "{{ elastic_dashboard_cleaned | combine({item.key: item.value}) }}"
|
||||||
|
with_dict: '{{ elastic_dashboard }}'
|
||||||
|
when:
|
||||||
|
- item.key not in ['elastic_state']
|
||||||
|
|
||||||
|
|
||||||
|
### begin of block
|
||||||
|
- name: 'Dashboards: Lookup ID of search'
|
||||||
|
delegate_to: localhost
|
||||||
|
block:
|
||||||
|
- name: "Dashboards: Get all searches in elasticsearch"
|
||||||
|
delegate_to: localhost
|
||||||
|
uri:
|
||||||
|
url: "https://{{ api_endpoint }}/s/{{ es_space }}/api/saved_objects/_find?per_page=10000&type=search"
|
||||||
|
method: GET
|
||||||
|
status_code: [200]
|
||||||
|
user: "{{ elastic_admin_username_vault }}"
|
||||||
|
password: "{{ elastic_admin_password_vault }}"
|
||||||
|
force_basic_auth: yes
|
||||||
|
register: all_searches
|
||||||
|
become: false
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
lookup_search_object: '{{ all_searches.json | community.general.json_query(querystr1) | first | community.general.json_query(search_query) }}'
|
||||||
|
vars:
|
||||||
|
querystr1: "[saved_objects[*]]"
|
||||||
|
search_query: "[?attributes.title=='{{ elastic_dashboard.references[0].search_refname }}']"
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
search_exists: True
|
||||||
|
when:
|
||||||
|
- lookup_search_object | length > 0
|
||||||
|
|
||||||
|
- debug:
|
||||||
|
msg: 'lookup_search_object{{ lookup_search_object }}'
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
panelindex_uuid: '{{ elastic_dashboard.references[0].search_refname | to_uuid }}'
|
||||||
|
|
||||||
|
- name: "Doing evil string concatination with ansible in addition with variables"
|
||||||
|
delegate_to: localhost
|
||||||
|
set_fact:
|
||||||
|
panelsJSON: '{{ (''[{"version":"7.16.1","type":"search","gridData":{"x":0,"y":0,"w":48,"h":28,"i":"'' + ( panelindex_uuid | string ) + ''"},"panelIndex":"'' + ( panelindex_uuid | string ) + ''","embeddableConfig":{"enhancements":{}},"panelRefName":"panel_'' + ( panelindex_uuid | string ) + ''"}]'') | string }}'
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
ref_obj_modified:
|
||||||
|
attributes:
|
||||||
|
title: '{{ elastic_dashboard.attributes.title }}'
|
||||||
|
panelsJSON: '{{ panelsJSON | string }}'
|
||||||
|
references:
|
||||||
|
-
|
||||||
|
name: '{{ panelindex_uuid }}'
|
||||||
|
delegate_to: localhost
|
||||||
|
type: 'search'
|
||||||
|
id: '{{ lookup_search_object[0].id }}'
|
||||||
|
when:
|
||||||
|
- lookup_search_object | length > 0
|
||||||
|
when:
|
||||||
|
- elastic_dashboard.elastic_state == 'present'
|
||||||
|
### end of block
|
||||||
|
|
||||||
|
- name: "Dashboards: Kick out not needed keys in {{ es_object_type }}dict"
|
||||||
|
delegate_to: localhost
|
||||||
|
set_fact:
|
||||||
|
elastic_dashboard_cleaned: "{{ elastic_dashboard_cleaned | combine({item.key: item.value}) }}"
|
||||||
|
with_dict: '{{ elastic_dashboard }}'
|
||||||
|
when:
|
||||||
|
- item.key not in ['elastic_state','references']
|
||||||
|
|
||||||
|
- name: " Dashboards: Crafting new {{ es_object_type }} object to throw it against ES-API"
|
||||||
|
delegate_to: localhost
|
||||||
|
set_fact:
|
||||||
|
elastic_dashboard_cleaned: "{{ elastic_dashboard_cleaned | combine( ref_obj_modified ) }}"
|
||||||
|
|
||||||
|
- debug:
|
||||||
|
msg: 'DEBUG elastic_dashboard_cleaned: {{ elastic_dashboard_cleaned }}'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
- name: "Create {{ es_object_type }} <<{{ elastic_dashboard.attributes.title }}>>"
|
||||||
|
delegate_to: localhost
|
||||||
|
uri:
|
||||||
|
url: "https://{{ api_endpoint }}{{ api_path }}/{{ es_object_type }}"
|
||||||
|
method: POST
|
||||||
|
status_code: [200]
|
||||||
|
user: "{{ elastic_admin_username_vault }}"
|
||||||
|
password: "{{ elastic_admin_password_vault }}"
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
kbn-xsrf: true
|
||||||
|
body_format: json
|
||||||
|
body: '{{ elastic_dashboard_cleaned | to_json }}'
|
||||||
|
become: false
|
||||||
|
when:
|
||||||
|
- not dashboard_exists
|
||||||
|
- elastic_dashboard.elastic_state == 'present'
|
||||||
|
|
||||||
|
- name: "Update {{ es_object_type }} <<{{ elastic_dashboard.attributes.title }}>>"
|
||||||
|
delegate_to: localhost
|
||||||
|
uri:
|
||||||
|
url: 'https://{{ api_endpoint }}{{ api_path }}/{{ es_object_type }}/{{ lookup_dashboard_object[0]["id"] }}'
|
||||||
|
method: PUT
|
||||||
|
status_code: [200]
|
||||||
|
user: "{{ elastic_admin_username_vault }}"
|
||||||
|
password: "{{ elastic_admin_password_vault }}"
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
kbn-xsrf: true
|
||||||
|
body_format: json
|
||||||
|
body: '{{ elastic_dashboard_cleaned | to_json }}'
|
||||||
|
become: false
|
||||||
|
when:
|
||||||
|
- dashboard_exists
|
||||||
|
- elastic_dashboard.elastic_state == 'present'
|
||||||
|
|
||||||
|
- name: "DELETE {{ es_object_type }} <<{{ elastic_dashboard.attributes.title }}>>"
|
||||||
|
delegate_to: localhost
|
||||||
|
uri:
|
||||||
|
url: 'https://{{ api_endpoint }}{{ api_path }}/{{ es_object_type }}/{{ lookup_dashboard_object[0]["id"] }}'
|
||||||
|
method: DELETE
|
||||||
|
status_code: [200]
|
||||||
|
user: "{{ elastic_admin_username_vault }}"
|
||||||
|
password: "{{ elastic_admin_password_vault }}"
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
kbn-xsrf: true
|
||||||
|
become: false
|
||||||
|
when:
|
||||||
|
- dashboard_exists
|
||||||
|
- elastic_dashboard.elastic_state == 'absent'
|
||||||
@ -0,0 +1,90 @@
|
|||||||
|
---
|
||||||
|
- set_fact:
|
||||||
|
api_path: '/s/{{ es_space }}/api/saved_objects'
|
||||||
|
es_object_type: 'index-pattern'
|
||||||
|
indexpattern_exists: False
|
||||||
|
elastic_indexpattern_cleaned: {}
|
||||||
|
|
||||||
|
- name: "Get all indexpatterns in elasticsearch"
|
||||||
|
delegate_to: localhost
|
||||||
|
uri:
|
||||||
|
url: "https://{{ api_endpoint }}{{ api_path }}/_find?per_page=10000&type=index-pattern"
|
||||||
|
method: GET
|
||||||
|
status_code: [200]
|
||||||
|
user: "{{ elastic_admin_username_vault }}"
|
||||||
|
password: "{{ elastic_admin_password_vault }}"
|
||||||
|
force_basic_auth: yes
|
||||||
|
register: all_indexpatterns
|
||||||
|
become: false
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
lookup_indexpattern_object: '{{ all_indexpatterns.json | community.general.json_query(querystr1) | first | community.general.json_query(indexpattern_query) }}'
|
||||||
|
vars:
|
||||||
|
querystr1: "[saved_objects[*]]"
|
||||||
|
indexpattern_query: "[?attributes.title=='{{ elastic_indexpattern.attributes.title }}']"
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
indexpattern_exists: True
|
||||||
|
when:
|
||||||
|
- lookup_indexpattern_object | length > 0
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
elastic_indexpattern_cleaned: "{{ elastic_indexpattern_cleaned | combine({item.key: item.value}) }}"
|
||||||
|
with_dict: '{{ elastic_indexpattern }}'
|
||||||
|
when:
|
||||||
|
- item.key not in ['elastic_state']
|
||||||
|
|
||||||
|
- name: "Create {{ es_object_type }} <<{{ elastic_indexpattern.attributes.title }}>>"
|
||||||
|
delegate_to: localhost
|
||||||
|
uri:
|
||||||
|
url: "https://{{ api_endpoint }}{{ api_path }}/{{ es_object_type }}"
|
||||||
|
method: POST
|
||||||
|
status_code: [200]
|
||||||
|
user: "{{ elastic_admin_username_vault }}"
|
||||||
|
password: "{{ elastic_admin_password_vault }}"
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
kbn-xsrf: true
|
||||||
|
body_format: json
|
||||||
|
body: '{{ elastic_indexpattern_cleaned | to_json }}'
|
||||||
|
become: false
|
||||||
|
when:
|
||||||
|
- not indexpattern_exists
|
||||||
|
- elastic_indexpattern.elastic_state == 'present'
|
||||||
|
|
||||||
|
- name: "Update {{ es_object_type }} <<{{ elastic_indexpattern.attributes.title }}>>"
|
||||||
|
delegate_to: localhost
|
||||||
|
uri:
|
||||||
|
url: 'https://{{ api_endpoint }}{{ api_path }}/{{ es_object_type }}/{{ lookup_indexpattern_object[0]["id"] }}'
|
||||||
|
method: PUT
|
||||||
|
status_code: [200]
|
||||||
|
user: "{{ elastic_admin_username_vault }}"
|
||||||
|
password: "{{ elastic_admin_password_vault }}"
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
kbn-xsrf: true
|
||||||
|
body_format: json
|
||||||
|
body: '{{ elastic_indexpattern_cleaned | to_json }}'
|
||||||
|
become: false
|
||||||
|
when:
|
||||||
|
- indexpattern_exists
|
||||||
|
- elastic_indexpattern.elastic_state == 'present'
|
||||||
|
|
||||||
|
- name: "DELETE {{ es_object_type }} <<{{ elastic_indexpattern.attributes.title }}>>"
|
||||||
|
delegate_to: localhost
|
||||||
|
uri:
|
||||||
|
url: 'https://{{ api_endpoint }}{{ api_path }}/{{ es_object_type }}/{{ lookup_indexpattern_object[0]["id"] }}'
|
||||||
|
method: DELETE
|
||||||
|
status_code: [200]
|
||||||
|
user: "{{ elastic_admin_username_vault }}"
|
||||||
|
password: "{{ elastic_admin_password_vault }}"
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
kbn-xsrf: true
|
||||||
|
become: false
|
||||||
|
when:
|
||||||
|
- indexpattern_exists
|
||||||
|
- elastic_indexpattern.elastic_state == 'absent'
|
||||||
@ -0,0 +1,88 @@
|
|||||||
|
---
|
||||||
|
- set_fact:
|
||||||
|
api_path: '/api/security/role'
|
||||||
|
role_exists: False
|
||||||
|
elastic_role_cleaned: {}
|
||||||
|
|
||||||
|
- name: "Get all roles in elasticsearch"
|
||||||
|
delegate_to: localhost
|
||||||
|
uri:
|
||||||
|
url: "https://{{ api_endpoint }}{{ api_path }}"
|
||||||
|
method: GET
|
||||||
|
status_code: [200]
|
||||||
|
user: "{{ elastic_admin_username_vault }}"
|
||||||
|
password: "{{ elastic_admin_password_vault }}"
|
||||||
|
force_basic_auth: yes
|
||||||
|
register: all_roles
|
||||||
|
become: false
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
lookup_role_object: '{{ all_roles.json | community.general.json_query(roles_query) }}'
|
||||||
|
vars:
|
||||||
|
roles_query: "[?name=='{{ elastic_role.name }}']"
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
role_exists: True
|
||||||
|
when:
|
||||||
|
- lookup_role_object | length > 0
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
elastic_role_cleaned: "{{ elastic_role_cleaned | combine({item.key: item.value}) }}"
|
||||||
|
with_dict: '{{ elastic_role }}'
|
||||||
|
when:
|
||||||
|
- item.key not in ['elastic_state','name']
|
||||||
|
|
||||||
|
- name: "Create role <<{{ elastic_role.name }}>>"
|
||||||
|
delegate_to: localhost
|
||||||
|
uri:
|
||||||
|
url: "https://{{ api_endpoint }}{{ api_path }}/{{ elastic_role.name }}"
|
||||||
|
method: PUT
|
||||||
|
status_code: [204]
|
||||||
|
user: "{{ elastic_admin_username_vault }}"
|
||||||
|
password: "{{ elastic_admin_password_vault }}"
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
kbn-xsrf: true
|
||||||
|
body_format: json
|
||||||
|
body: '{{ elastic_role_cleaned | to_json }}'
|
||||||
|
become: false
|
||||||
|
when:
|
||||||
|
- not role_exists
|
||||||
|
- elastic_role.elastic_state == 'present'
|
||||||
|
|
||||||
|
- name: "Update role <<{{ elastic_role.name }}>>"
|
||||||
|
delegate_to: localhost
|
||||||
|
uri:
|
||||||
|
url: "https://{{ api_endpoint }}{{ api_path }}/{{ elastic_role.name }}"
|
||||||
|
method: PUT
|
||||||
|
status_code: [204]
|
||||||
|
user: "{{ elastic_admin_username_vault }}"
|
||||||
|
password: "{{ elastic_admin_password_vault }}"
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
kbn-xsrf: true
|
||||||
|
body_format: json
|
||||||
|
body: '{{ elastic_role_cleaned | to_json }}'
|
||||||
|
become: false
|
||||||
|
when:
|
||||||
|
- role_exists
|
||||||
|
- elastic_role.elastic_state == 'present'
|
||||||
|
|
||||||
|
- name: "DELETE role <<{{ elastic_role.name }}>>"
|
||||||
|
delegate_to: localhost
|
||||||
|
uri:
|
||||||
|
url: "https://{{ api_endpoint }}{{ api_path }}/{{ elastic_role.name }}"
|
||||||
|
method: DELETE
|
||||||
|
status_code: [204]
|
||||||
|
user: "{{ elastic_admin_username_vault }}"
|
||||||
|
password: "{{ elastic_admin_password_vault }}"
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
kbn-xsrf: true
|
||||||
|
become: false
|
||||||
|
when:
|
||||||
|
- role_exists
|
||||||
|
- elastic_role.elastic_state == 'absent'
|
||||||
@ -0,0 +1,152 @@
|
|||||||
|
---
|
||||||
|
- set_fact:
|
||||||
|
api_path: '/s/{{ es_space }}/api/saved_objects'
|
||||||
|
es_object_type: search
|
||||||
|
search_exists: False
|
||||||
|
elastic_search_cleaned: {}
|
||||||
|
ref_obj_modified: {}
|
||||||
|
|
||||||
|
- name: "Get all searches in elasticsearch"
|
||||||
|
delegate_to: localhost
|
||||||
|
uri:
|
||||||
|
url: "https://{{ api_endpoint }}{{ api_path }}/_find?per_page=10000&type=search"
|
||||||
|
method: GET
|
||||||
|
status_code: [200]
|
||||||
|
user: "{{ elastic_admin_username_vault }}"
|
||||||
|
password: "{{ elastic_admin_password_vault }}"
|
||||||
|
force_basic_auth: yes
|
||||||
|
register: all_searches
|
||||||
|
become: false
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
lookup_search_object: '{{ all_searches.json | community.general.json_query(querystr1) | first | community.general.json_query(search_query) }}'
|
||||||
|
vars:
|
||||||
|
querystr1: "[saved_objects[*]]"
|
||||||
|
search_query: "[?attributes.title=='{{ elastic_search.attributes.title }}']"
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
search_exists: True
|
||||||
|
when:
|
||||||
|
- lookup_search_object | length > 0
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
elastic_search_cleaned: "{{ elastic_search_cleaned | combine({item.key: item.value}) }}"
|
||||||
|
with_dict: '{{ elastic_search }}'
|
||||||
|
when:
|
||||||
|
- item.key not in ['elastic_state']
|
||||||
|
|
||||||
|
### begin of block
|
||||||
|
- name: 'Lookup ID of indexpattern'
|
||||||
|
delegate_to: localhost
|
||||||
|
block:
|
||||||
|
- name: "Get all indexpatterns in elasticsearch"
|
||||||
|
delegate_to: localhost
|
||||||
|
uri:
|
||||||
|
url: "https://{{ api_endpoint }}/s/{{ es_space }}/api/saved_objects/_find?per_page=10000&type=index-pattern"
|
||||||
|
method: GET
|
||||||
|
status_code: [200]
|
||||||
|
user: "{{ elastic_admin_username_vault }}"
|
||||||
|
password: "{{ elastic_admin_password_vault }}"
|
||||||
|
force_basic_auth: yes
|
||||||
|
register: all_indexpatterns
|
||||||
|
become: false
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
lookup_indexpattern_object: '{{ all_indexpatterns.json | community.general.json_query(querystr1) | first | community.general.json_query(indexpattern_query) }}'
|
||||||
|
vars:
|
||||||
|
querystr1: "[saved_objects[*]]"
|
||||||
|
indexpattern_query: "[?attributes.title=='{{ elastic_search.references[0].ref_name }}']"
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
indexpattern_exists: True
|
||||||
|
when:
|
||||||
|
- lookup_indexpattern_object | length > 0
|
||||||
|
|
||||||
|
- debug:
|
||||||
|
msg: 'lookup_indexpattern_object:{{ lookup_indexpattern_object }}'
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
ref_obj_modified:
|
||||||
|
references:
|
||||||
|
-
|
||||||
|
name: '{{ elastic_search.references[0].name }}'
|
||||||
|
delegate_to: localhost
|
||||||
|
type: 'index-pattern'
|
||||||
|
id: '{{ lookup_indexpattern_object[0].id }}'
|
||||||
|
when:
|
||||||
|
- lookup_indexpattern_object | length > 0
|
||||||
|
when:
|
||||||
|
- elastic_search.elastic_state == 'present'
|
||||||
|
### end of block
|
||||||
|
|
||||||
|
- name: "Kick out not needed keys in search dict"
|
||||||
|
delegate_to: localhost
|
||||||
|
set_fact:
|
||||||
|
elastic_search_cleaned: "{{ elastic_search_cleaned | combine({item.key: item.value}) }}"
|
||||||
|
with_dict: '{{ elastic_search }}'
|
||||||
|
when:
|
||||||
|
- item.key not in ['elastic_state','references']
|
||||||
|
|
||||||
|
- name: "Crafting new search object to throw it against ES-API"
|
||||||
|
delegate_to: localhost
|
||||||
|
set_fact:
|
||||||
|
elastic_search_cleaned: "{{ elastic_search_cleaned | combine( ref_obj_modified ) }}"
|
||||||
|
|
||||||
|
- debug:
|
||||||
|
msg: 'DEBUG elastic_search_cleaned: {{ elastic_search_cleaned }}'
|
||||||
|
|
||||||
|
|
||||||
|
- name: "Create {{ es_object_type }} <<{{ elastic_search.attributes.title }}>>"
|
||||||
|
delegate_to: localhost
|
||||||
|
uri:
|
||||||
|
url: "https://{{ api_endpoint }}{{ api_path }}/{{ es_object_type }}"
|
||||||
|
method: POST
|
||||||
|
status_code: [200]
|
||||||
|
user: "{{ elastic_admin_username_vault }}"
|
||||||
|
password: "{{ elastic_admin_password_vault }}"
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
kbn-xsrf: true
|
||||||
|
body_format: json
|
||||||
|
body: '{{ elastic_search_cleaned | to_json }}'
|
||||||
|
become: false
|
||||||
|
when:
|
||||||
|
- not search_exists
|
||||||
|
- elastic_search.elastic_state == 'present'
|
||||||
|
|
||||||
|
- name: "Update {{ es_object_type }} <<{{ elastic_search.attributes.title }}>>"
|
||||||
|
delegate_to: localhost
|
||||||
|
uri:
|
||||||
|
url: 'https://{{ api_endpoint }}{{ api_path }}/{{ es_object_type }}/{{ lookup_search_object[0]["id"] }}'
|
||||||
|
method: PUT
|
||||||
|
status_code: [200]
|
||||||
|
user: "{{ elastic_admin_username_vault }}"
|
||||||
|
password: "{{ elastic_admin_password_vault }}"
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
kbn-xsrf: true
|
||||||
|
body_format: json
|
||||||
|
body: '{{ elastic_search_cleaned | to_json }}'
|
||||||
|
become: false
|
||||||
|
when:
|
||||||
|
- search_exists
|
||||||
|
- elastic_search.elastic_state == 'present'
|
||||||
|
|
||||||
|
- name: "DELETE {{ es_object_type }} <<{{ elastic_search.attributes.title }}>>"
|
||||||
|
delegate_to: localhost
|
||||||
|
uri:
|
||||||
|
url: 'https://{{ api_endpoint }}{{ api_path }}/{{ es_object_type }}/{{ lookup_search_object[0]["id"] }}'
|
||||||
|
method: DELETE
|
||||||
|
status_code: [200]
|
||||||
|
user: "{{ elastic_admin_username_vault }}"
|
||||||
|
password: "{{ elastic_admin_password_vault }}"
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
kbn-xsrf: true
|
||||||
|
become: false
|
||||||
|
when:
|
||||||
|
- search_exists
|
||||||
|
- elastic_search.elastic_state == 'absent'
|
||||||
@ -0,0 +1,91 @@
|
|||||||
|
---
|
||||||
|
- set_fact:
|
||||||
|
api_path: '/api/spaces/space'
|
||||||
|
space_exists: False
|
||||||
|
elastic_space_cleaned: {}
|
||||||
|
|
||||||
|
- name: "Get all spaces in elasticsearch"
|
||||||
|
delegate_to: localhost
|
||||||
|
uri:
|
||||||
|
url: "https://{{ api_endpoint }}{{ api_path }}"
|
||||||
|
method: GET
|
||||||
|
status_code: [200]
|
||||||
|
user: "{{ elastic_admin_username_vault }}"
|
||||||
|
password: "{{ elastic_admin_password_vault }}"
|
||||||
|
force_basic_auth: yes
|
||||||
|
register: all_spaces
|
||||||
|
become: false
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
lookup_space_object: '{{ all_spaces.json | community.general.json_query(spaces_query) }}'
|
||||||
|
vars:
|
||||||
|
spaces_query: "[?name=='{{ elastic_space.name }}']"
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
space_exists: True
|
||||||
|
when:
|
||||||
|
- lookup_space_object | length > 0
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
elastic_space_cleaned: "{{ elastic_space_cleaned | combine({item.key: item.value}) }}"
|
||||||
|
with_dict: '{{ elastic_space }}'
|
||||||
|
when:
|
||||||
|
- item.key not in ['elastic_state']
|
||||||
|
|
||||||
|
- debug:
|
||||||
|
msg: '{{ lookup_space_object | to_json }}'
|
||||||
|
|
||||||
|
- name: "Create space <<{{ elastic_space.name }}>>"
|
||||||
|
delegate_to: localhost
|
||||||
|
uri:
|
||||||
|
url: "https://{{ api_endpoint }}{{ api_path }}"
|
||||||
|
method: POST
|
||||||
|
status_code: [200]
|
||||||
|
user: "{{ elastic_admin_username_vault }}"
|
||||||
|
password: "{{ elastic_admin_password_vault }}"
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
kbn-xsrf: true
|
||||||
|
body_format: json
|
||||||
|
body: '{{ elastic_space_cleaned | to_json }}'
|
||||||
|
become: false
|
||||||
|
when:
|
||||||
|
- not space_exists
|
||||||
|
- elastic_space.elastic_state == 'present'
|
||||||
|
|
||||||
|
- name: "Update space <<{{ elastic_space.name }}>>"
|
||||||
|
delegate_to: localhost
|
||||||
|
uri:
|
||||||
|
url: "https://{{ api_endpoint }}{{ api_path }}/{{ elastic_space.name }}"
|
||||||
|
method: PUT
|
||||||
|
status_code: [200]
|
||||||
|
user: "{{ elastic_admin_username_vault }}"
|
||||||
|
password: "{{ elastic_admin_password_vault }}"
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
kbn-xsrf: true
|
||||||
|
body_format: json
|
||||||
|
body: '{{ elastic_space_cleaned | to_json }}'
|
||||||
|
become: false
|
||||||
|
when:
|
||||||
|
- space_exists
|
||||||
|
- elastic_space.elastic_state == 'present'
|
||||||
|
|
||||||
|
- name: "DELETE space <<{{ elastic_space.name }}>>"
|
||||||
|
delegate_to: localhost
|
||||||
|
uri:
|
||||||
|
url: "https://{{ api_endpoint }}{{ api_path }}/{{ elastic_space.name }}"
|
||||||
|
method: DELETE
|
||||||
|
status_code: [204]
|
||||||
|
user: "{{ elastic_admin_username_vault }}"
|
||||||
|
password: "{{ elastic_admin_password_vault }}"
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
kbn-xsrf: true
|
||||||
|
become: false
|
||||||
|
when:
|
||||||
|
- space_exists
|
||||||
|
- elastic_space.elastic_state == 'absent'
|
||||||
@ -0,0 +1,96 @@
|
|||||||
|
---
|
||||||
|
- set_fact:
|
||||||
|
api_path: '/internal/security/users'
|
||||||
|
user_exists: False
|
||||||
|
elastic_user_cleaned__create: {}
|
||||||
|
elastic_user_cleaned__update: {}
|
||||||
|
|
||||||
|
- name: "Get all users in elasticsearch"
|
||||||
|
delegate_to: localhost
|
||||||
|
uri:
|
||||||
|
url: "https://{{ api_endpoint }}{{ api_path }}"
|
||||||
|
method: GET
|
||||||
|
status_code: [200]
|
||||||
|
user: "{{ elastic_admin_username_vault }}"
|
||||||
|
password: "{{ elastic_admin_password_vault }}"
|
||||||
|
force_basic_auth: yes
|
||||||
|
register: all_users
|
||||||
|
become: false
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
lookup_user_object: '{{ all_users.json | community.general.json_query(users_query) }}'
|
||||||
|
vars:
|
||||||
|
users_query: "[?username=='{{ elastic_user.username }}']"
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
user_exists: True
|
||||||
|
when:
|
||||||
|
- lookup_user_object | length > 0
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
elastic_user_cleaned__create: "{{ elastic_user_cleaned__create | combine({item.key: item.value}) }}"
|
||||||
|
with_dict: '{{ elastic_user }}'
|
||||||
|
when:
|
||||||
|
- item.key not in ['elastic_state']
|
||||||
|
|
||||||
|
# make sure to not override userdefined password with initial password
|
||||||
|
- set_fact:
|
||||||
|
elastic_user_cleaned__update: "{{ elastic_user_cleaned__update | combine({item.key: item.value}) }}"
|
||||||
|
with_dict: '{{ elastic_user_cleaned__create }}'
|
||||||
|
when:
|
||||||
|
- item.key not in ['password']
|
||||||
|
|
||||||
|
- name: "Create user <<{{ elastic_user.username }}>>"
|
||||||
|
delegate_to: localhost
|
||||||
|
uri:
|
||||||
|
url: "https://{{ api_endpoint }}{{ api_path }}/{{ elastic_user.username }}"
|
||||||
|
method: POST
|
||||||
|
status_code: [200]
|
||||||
|
user: "{{ elastic_admin_username_vault }}"
|
||||||
|
password: "{{ elastic_admin_password_vault }}"
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
kbn-xsrf: true
|
||||||
|
body_format: json
|
||||||
|
body: '{{ elastic_user_cleaned__create | to_json }}'
|
||||||
|
become: false
|
||||||
|
when:
|
||||||
|
- not user_exists
|
||||||
|
- elastic_user.elastic_state == 'present'
|
||||||
|
|
||||||
|
- name: "Update user <<{{ elastic_user.username }}>>"
|
||||||
|
delegate_to: localhost
|
||||||
|
uri:
|
||||||
|
url: "https://{{ api_endpoint }}{{ api_path }}/{{ elastic_user.username }}"
|
||||||
|
method: POST
|
||||||
|
status_code: [200]
|
||||||
|
user: "{{ elastic_admin_username_vault }}"
|
||||||
|
password: "{{ elastic_admin_password_vault }}"
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
kbn-xsrf: true
|
||||||
|
body_format: json
|
||||||
|
body: '{{ elastic_user_cleaned__update | to_json }}'
|
||||||
|
become: false
|
||||||
|
when:
|
||||||
|
- user_exists
|
||||||
|
- elastic_user.elastic_state == 'present'
|
||||||
|
|
||||||
|
- name: "DELETE user << elastic_user.username >>"
|
||||||
|
delegate_to: localhost
|
||||||
|
uri:
|
||||||
|
url: "https://{{ api_endpoint }}{{ api_path }}/{{ elastic_user.username }}"
|
||||||
|
method: DELETE
|
||||||
|
status_code: [204]
|
||||||
|
user: "{{ elastic_admin_username_vault }}"
|
||||||
|
password: "{{ elastic_admin_password_vault }}"
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
kbn-xsrf: true
|
||||||
|
become: false
|
||||||
|
when:
|
||||||
|
- user_exists
|
||||||
|
- elastic_user.elastic_state == 'absent'
|
||||||
@ -0,0 +1,66 @@
|
|||||||
|
---
|
||||||
|
- set_fact:
|
||||||
|
api_path: '/s/{{ es_space }}/api/saved_objects'
|
||||||
|
|
||||||
|
- name: "Import smardigo default dashboard and its related objects (index-pattern,search)"
|
||||||
|
delegate_to: localhost
|
||||||
|
set_fact:
|
||||||
|
es_import_objects: "{{ lookup('template','smardigo_default_objects.json.j2') }}"
|
||||||
|
when:
|
||||||
|
- elastic_state == 'present'
|
||||||
|
|
||||||
|
- name: "Print objects to local file"
|
||||||
|
delegate_to: localhost
|
||||||
|
copy:
|
||||||
|
dest: '/tmp/es_objects_ready_to_import__objects.ndjson'
|
||||||
|
content: '{{ es_import_objects }}'
|
||||||
|
when:
|
||||||
|
- elastic_state == 'present'
|
||||||
|
|
||||||
|
- name: "Import elastic objects ..."
|
||||||
|
delegate_to: localhost
|
||||||
|
uri:
|
||||||
|
url: "https://{{ api_endpoint }}{{ api_path }}/_import?overwrite=true"
|
||||||
|
method: POST
|
||||||
|
status_code: [200]
|
||||||
|
user: "{{ elastic_admin_username_vault }}"
|
||||||
|
password: "{{ elastic_admin_password_vault }}"
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
kbn-xsrf: true
|
||||||
|
body_format: form-multipart
|
||||||
|
body:
|
||||||
|
file:
|
||||||
|
filename: '/tmp/es_objects_ready_to_import__objects.ndjson'
|
||||||
|
mime_type: 'application/octet-stream'
|
||||||
|
become: false
|
||||||
|
when:
|
||||||
|
- elastic_state == 'present'
|
||||||
|
|
||||||
|
- name: "Remove temporarily created file"
|
||||||
|
delegate_to: localhost
|
||||||
|
file:
|
||||||
|
state: absent
|
||||||
|
path: '/tmp/es_objects_ready_to_import__objects.ndjson'
|
||||||
|
when:
|
||||||
|
- elastic_state == 'present'
|
||||||
|
|
||||||
|
|
||||||
|
- name: "Set default indexpattern ..."
|
||||||
|
delegate_to: localhost
|
||||||
|
uri:
|
||||||
|
url: "https://{{ api_endpoint }}/s/dev-fgrz/api/kibana/settings"
|
||||||
|
method: POST
|
||||||
|
status_code: [200]
|
||||||
|
user: "{{ elastic_admin_username_vault }}"
|
||||||
|
password: "{{ elastic_admin_password_vault }}"
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
kbn-xsrf: true
|
||||||
|
body_format: json
|
||||||
|
body:
|
||||||
|
changes:
|
||||||
|
defaultIndex: '{{ es_indexpattern_uuid }}'
|
||||||
|
become: false
|
||||||
|
when:
|
||||||
|
- elastic_state == 'present'
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
{"attributes":{"fieldAttrs":"{}","fields":"[]","runtimeFieldMap":"{}","timeFieldName":"@timestamp","title":"{{ es_indexpattern_title }}","typeMeta":"{}"},"coreMigrationVersion":"7.16.1","id":"{{ es_indexpattern_uuid }}","migrationVersion":{"index-pattern":"7.11.0"},"references":[],"type":"index-pattern"}
|
||||||
|
{"attributes":{"columns":[],"description":"","grid":{},"hideChart":false,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[["@timestamp","desc"]],"title":"{{ es_search_title }}"},"coreMigrationVersion":"7.16.1","id":"{{ es_search_uuid }}","migrationVersion":{"search":"7.9.3"},"references":[{"id":"{{ es_indexpattern_uuid }}","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"search"}
|
||||||
|
{"attributes":{"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}"},"optionsJSON":"{\"useMargins\":true,\"syncColors\":false,\"hidePanelTitles\":false}","panelsJSON":"[{\"version\":\"7.16.1\",\"type\":\"search\",\"gridData\":{\"x\":0,\"y\":0,\"w\":50,\"h\":50,\"i\":\"{{ es_panel_uuid }}\"},\"panelIndex\":\"{{ es_panel_uuid }}\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_{{ es_panel_uuid }}\"}]","timeRestore":false,"title":"{{ es_dashboard_title }}","version":1},"coreMigrationVersion":"7.16.1","id":"{{ es_dashboard_uuid }}","migrationVersion":{"dashboard":"7.16.0"},"references":[{"id":"{{ es_search_uuid }}","name":"{{ es_panel_uuid }}:panel_{{ es_panel_uuid }}","type":"search"}],"type":"dashboard"}
|
||||||
Loading…
Reference in New Issue