Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.ankra.io/llms.txt

Use this file to discover all available pages before exploring further.

ankra Provider

The Ankra Terraform provider lets you manage Kubernetes clusters, stacks, manifests, and addons on the Ankra platform using Terraform.

Example Usage

terraform {
  required_providers {
    ankra = {
      source  = "ankraio/ankra"
      version = "0.1.5"
    }
  }
}

provider "ankra" {
  ankra_token = var.ankra_token
}

Provider Schema

NameTypeRequiredDescription
ankra_tokenStringYesThe API token for authenticating with Ankra.

Pre-configured Stack Example

terraform {
  required_providers {
    ankra = {
      source  = "local/ankra"
      version = "0.1.5"
    }
  }
}

resource "ankra_cluster" "example" {
  cluster_name            = "dev"
  github_credential_name  = "my-github-cred"
  github_branch           = "main"
  github_repository       = "ankra-io/my-repo"
  ankra_token             = var.ankra_token

  stacks {
    name        = "create-ns-test"
    description = "Test stack for creating a namespace"

    manifests {
      name            = "test-namespace"
      manifest_base64 = base64encode(<<YAML
apiVersion: v1
kind: Namespace
metadata:
  name: test-ns
YAML
      )
    }
    manifests {
      name            = "test-configmap"
      manifest_base64 = base64encode(<<YAML
apiVersion: v1
kind: ConfigMap
metadata:
  name: test-config
  namespace: test-ns
data:
  key: value
YAML
      )
    }
    addons {
      name                 = "test-addon"
      chart_name           = "nginx"
      chart_version        = "1.2.3"
      repository_url       = "https://charts.example.com"
      namespace            = "test-ns"
      # Optional fields:
      # configuration_type  = "values"
      # configuration       = "{}"
      # parents             = []
      # job_configuration   = "{}"
    }
  }
}

output "ankra_cluster_id" {
  value = ankra_cluster.example.cluster_id
}

Data Sources

ankra_clusters

This data source retrieves a list of clusters from the Ankra platform.
data "ankra_clusters" "all" {
  ankra_token = var.ankra_token
}

Example: Realistic Monitoring Stack

Suppose you have these files in your module directory: manifests/grafana-namespace.yaml:
apiVersion: v1
kind: Namespace
metadata:
  name: grafana
manifests/prometheus-namespace.yaml:
apiVersion: v1
kind: Namespace
metadata:
  name: prometheus
manifests/loki-namespace.yaml:
apiVersion: v1
kind: Namespace
metadata:
  name: loki
And values files for each addon, e.g. add-ons/grafana/values.yaml, etc.
resource "ankra_cluster" "monitoring" {
  cluster_name            = "monitoring"
  github_credential_name  = "my-github-cred"
  github_branch           = "main"
  github_repository       = "ankra-io/monitoring"
  ankra_token             = var.ankra_token

  stacks {
    name        = "monitoring infrastructure"
    description = "Monitor our entire infra in this kubernetes."

    manifests {
      name      = "grafana-namespace"
      from_file = "${path.module}/manifests/grafana-namespace.yaml"
      parents   = []
    }
    manifests {
      name      = "prometheus-namespace"
      from_file = "${path.module}/manifests/prometheus-namespace.yaml"
      parents   = []
    }
    manifests {
      name      = "loki-namespace"
      from_file = "${path.module}/manifests/loki-namespace.yaml"
      parents   = []
    }

    addons {
      name           = "grafana"
      chart_name     = "grafana"
      chart_version  = "9.3.0"
      repository_url = "https://grafana.github.io/helm-charts"
      namespace      = "grafana"
      configuration_type = "standalone"
      # configuration = filebase64("${path.module}/add-ons/grafana/values.yaml")
      from_file      = "${path.module}/add-ons/grafana/values.yaml"
      parents        = ["grafana-namespace"]
    }
    addons {
      name           = "prometheus"
      chart_name     = "prometheus"
      chart_version  = "27.28.2"
      repository_url = "https://prometheus-community.github.io/helm-charts"
      namespace      = "prometheus"
      configuration_type = "standalone"
      from_file      = "${path.module}/add-ons/prometheus/values.yaml"
      parents        = ["prometheus-namespace"]
    }
    addons {
      name           = "loki"
      chart_name     = "loki"
      chart_version  = "6.33.0"
      repository_url = "https://grafana.github.io/helm-charts"
      namespace      = "loki"
      configuration_type = "standalone"
      from_file      = "${path.module}/add-ons/loki/values.yaml"
      parents        = ["loki-namespace"]
    }
    addons {
      name           = "fluent-bit"
      chart_name     = "fluent-bit"
      chart_version  = "2.6.0"
      repository_url = "https://grafana.github.io/helm-charts"
      namespace      = "loki"
      configuration_type = "standalone"
      from_file      = "${path.module}/add-ons/fluent-bit/values.yaml"
      parents        = ["loki"]
    }
  }
}

Complete Example: Using from_file for Manifests and Addons

Suppose you have these files in your module directory: namespace.yaml:
apiVersion: v1
kind: Namespace
metadata:
  name: test-ns
secret.yaml:
apiVersion: v1
kind: Secret
metadata:
  name: test-secret
  namespace: test-ns
type: Opaque
data:
  username: dXNlcm5hbWU=
  password: cGFzc3dvcmQ=
resource "ankra_cluster" "example" {
  cluster_name            = "dev"
  github_credential_name  = "my-github-cred"
  github_branch           = "main"
  github_repository       = "ankra-io/my-repo"
  ankra_token             = var.ankra_token

  stacks {
    name        = "create-ns-test"
    description = "Test stack for creating a namespace and secret"

    manifests {
      name      = "test-namespace"
      from_file = "${path.module}/namespace.yaml"
      parents    = [] # No parents for the namespace
    }
    manifests {
      name      = "test-secret"
      from_file = "${path.module}/secret.yaml"
      parents    = ["test-namespace"] # This secret depends on the namespace
    }
    addons {
      name           = "my-addon"
      chart_name     = "nginx"
      chart_version  = "1.2.3"
      repository_url = "https://charts.example.com"
      namespace      = "test-ns"
      parents        = ["test-namespace", "test-secret"] # This addon depends on both
    }
  }
}

Importing a Cluster

If a cluster is created or modified outside of Terraform (for example, via GitOps, CLI, or the Ankra UI), you can import it into your Terraform state:
terraform import ankra_cluster.example <cluster_id>
Replace <cluster_id> with the actual ID of the cluster you want to manage with Terraform. After import, run terraform plan to review any differences and update your configuration as needed.
resource "ankra_cluster" "imported" {
  cluster_name           = data.ankra_clusters.all.clusters[0].name
  github_credential_name = "my-github-cred"
  github_branch          = "main"
  github_repository      = "ankra-io/my-repo"
  ankra_token            = var.ankra_token
  # … other fields …
}

Provider & Data Source Schema

Provider

NameTypeRequiredDescription
ankra_tokenStringYesThe API token for authenticating with Ankra.

Data Source: ankra_clusters

NameTypeDescription
clustersListList of cluster objects.

Cluster Object

NameTypeDescription
idStringThe cluster ID.
nameStringThe cluster name.

For more details, see the Ankra Terraform Provider Registry.