Skip to content

Instantly share code, notes, and snippets.

@mkoertgen
Last active June 3, 2021 16:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mkoertgen/b39bc813f9c4a27056f9e5742d4ea1ab to your computer and use it in GitHub Desktop.
Save mkoertgen/b39bc813f9c4a27056f9e5742d4ea1ab to your computer and use it in GitHub Desktop.
Lookup Kibana Alias for Open Distro Tenant

Lookup Kibana Alias for Open Distro Tenant

The "Open Distro"-fork of Elasticsearch uses Tenants instead of Kibana Spaces where each tenant corresponds to a separate Kibana Index / Alias.

When provisioning Kibana Objects on an "Open Distro"-cluster using the Phil Bakers Terraform Elasticsearch community provider it will by default create resources in .kibana-index which corresponds to the global tenant.

For example after spinning up a single node cluster the different Kibana indexes may look like

GET _alias/.kibana_*
{
  // The private admin tenant
  ".kibana_92668751_admin_1" : {
    "aliases" : {
      ".kibana_92668751_admin" : { }
    }
  },
  // The global tenant'
  ".kibana_1" : {
    "aliases" : {
      ".kibana" : { }
    }
  }
  // Some custom private tenant 'monitoring'
  ".kibana_1852089416_monitoring_1" : {
    "aliases" : {
      ".kibana_1852089416_monitoring" : { }
    }
  }
}

Usage Example

Say you have a terraform module for provisioning Index Patterns, Dashboards & Visualizations for an Open Distro Cluster

After successfully applying it the resources will be only visible in the global tenant and not in the private tenants admin or monitoring. Until this is possible you may use kibana_alias.py as a workaround.

See example usage in elastic.tf

References

# Create a tenant (similar to a Kibana space), cf.:
# - https://github.com/phillbaker/terraform-provider-elasticsearch/blob/master/docs/resources/opendistro_kibana_tenant.md
resource "elasticsearch_opendistro_kibana_tenant" "monitoring" {
tenant_name = "monitoring"
description = "Monitoring Tenant"
}
# Workaround for looking up the kibana index-alias for an Open Distro Tenant, cf.:
# - https://github.com/phillbaker/terraform-provider-elasticsearch/issues/140
# https://registry.terraform.io/providers/hashicorp/external/latest/docs/data-sources/data_source
data "external" "kibana_alias" {
program = ["python", "${path.module}/kibana_alias.py", elasticsearch_opendistro_kibana_tenant.monitoring.tenant_name ]
}
# Provision Kibana Objects, cf.:
# - https://github.com/phillbaker/terraform-provider-elasticsearch/blob/master/docs/resources/kibana_object.md
resource "elasticsearch_kibana_object" "kibana" {
for_each = fileset("${path.module}/templates/kibana", "*.json")
body = templatefile("${path.module}/templates/kibana/${each.key}", {})
index = data.external.kibana_alias.result.alias
}
#!/bin/env python
# -*- coding: utf-8 -*-
# - https://raw.githubusercontent.com/jcantrill/cluster-logging-tools/master/scripts/kibana-index-name
'''
OD toUserIndexName()
originalKibanaIndex+"_"+tenant.hashCode()+"_"+tenant.toLowerCase().replaceAll("[^a-z0-9]+",EMPTY_STRING);
'''
import sys,re,json
username = sys.argv[1]
def java_string_hashcode(s):
"""https://stackoverflow.com/questions/22845913/function-to-replicate-the-output-of-java-lang-string-hashcode-in-python-and-no"""
"""Mimic Java's hashCode in python 2"""
h = 0
for c in list(s.encode('utf8')):
v = ord(c) if isinstance(c, str) else c
h = int((((31 * h + v) ^ 0x80000000) & 0xFFFFFFFF) - 0x80000000)
return h
hashCode = java_string_hashcode(username)
alias = ".kibana_" + str(hashCode) + "_" + re.sub("[^a-z0-9]","",username.lower())
print(json.dumps({"alias": alias}))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment