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.