{"id":37789469,"url":"https://github.com/spectrocloud/terraform-spectrocloud-edge","last_synced_at":"2026-04-06T19:02:09.022Z","repository":{"id":49877665,"uuid":"518234374","full_name":"spectrocloud/terraform-spectrocloud-edge","owner":"spectrocloud","description":null,"archived":false,"fork":false,"pushed_at":"2026-04-06T14:48:12.000Z","size":193,"stargazers_count":0,"open_issues_count":1,"forks_count":1,"subscribers_count":5,"default_branch":"main","last_synced_at":"2026-04-06T16:27:44.236Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"HCL","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/spectrocloud.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-07-26T22:27:40.000Z","updated_at":"2026-03-08T12:03:04.000Z","dependencies_parsed_at":"2024-08-23T11:59:24.766Z","dependency_job_id":null,"html_url":"https://github.com/spectrocloud/terraform-spectrocloud-edge","commit_stats":null,"previous_names":[],"tags_count":19,"template":false,"template_full_name":null,"purl":"pkg:github/spectrocloud/terraform-spectrocloud-edge","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spectrocloud%2Fterraform-spectrocloud-edge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spectrocloud%2Fterraform-spectrocloud-edge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spectrocloud%2Fterraform-spectrocloud-edge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spectrocloud%2Fterraform-spectrocloud-edge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/spectrocloud","download_url":"https://codeload.github.com/spectrocloud/terraform-spectrocloud-edge/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spectrocloud%2Fterraform-spectrocloud-edge/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31485516,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-06T17:22:55.647Z","status":"ssl_error","status_checked_at":"2026-04-06T17:22:54.741Z","response_time":112,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-16T15:15:32.513Z","updated_at":"2026-04-06T19:02:09.016Z","avatar_url":"https://github.com/spectrocloud.png","language":"HCL","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)\n[![Developed by: Spectro Cloud](https://img.shields.io/badge/Developed%20by-Spectro%20Cloud-blueviolet)](https://www.spectrocloud.com)\n\n# Palette Edge Native Terraform Module\n\nThe Spectro Cloud Provider for Palette is available in the [Terraform Registry](https://registry.terraform.io/providers/spectrocloud/spectrocloud/latest).  This repository contains the module and examples to create a Kubernetes Edge Cluster using Palette.  \n\n## Assumptions\n\nAddon profiles that will be used for the cluster creation have already been defined.  This module will reference those resources rather than create them.  Profiles can be created through the [Cluster Profile Resource](https://registry.terraform.io/providers/spectrocloud/spectrocloud/latest/docs/resources/cluster_profile)\n\n\n## Usage\n\nModule Version |  Required Terraform Version\n---------------|----------------------------\n  \u003c= 1.0.0     |        \u003c= 1.2.9\n  \\\u003e= 1.1.0     |        \u003e= 1.3.0\n\n\nSee the [Examples](https://github.com/spectrocloud/terraform-palette-edge/tree/main/examples) for usage of this module.  This module is written for the Edge Native Deployment option.\n\nThis is a sample \"main.tf\" file.  In this example, we are creating a 3-node Ubuntu-PXKE 1.24 cluster.  This cluster has a basic profile for the Ubuntu Operating System, PXK-E (Palette Optimized Kubernetes for the Edge), a CNI, and a few other example profiles.  These profiles were created ahead of time.\n\nAdditionally, with the \"VIP\" tag, we enable Kubevip for HA.  The Edge Host is now looked up via the \"tag\" on the Edge Host.  Multiple tags can be used for this purpose.  See the example for usage with multiple pools.  The Tag(s) should be added to the Edge Host before running the plan.  This applies to virtual machines as well.  For ease of use, we have provided a QRCode giving you the ability to easily copy the UID of the device.  \n\n\n```tf\n## #########################################################################################\n## Example of using cluster profiles with a cluster template\n## #########################################################################################\n\nmodule \"edge-demo-module-template\" {\n  source  = \"spectrocloud/edge/spectrocloud\"\n  version = \"2.0.4\"\n  # Store Number/Location\n  name = \"demo\"\n  # add tags to the cluster (optional) list(strings)\n  cluster_tags = [\"origin:terraform\"]\n  ssh_keys = [\n    \"ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbm test2\",\n  \"ecdsa-sha2-nistp256 AAAAE2VjZHNhL test1\"]\n  ntp_servers = [\n    \"10.10.10.1\",\n    \"10.10.10.2\"\n  ]\n\n  # Cluster VIP to be used with KubeVIP If not using Overlay\n  cluster_vip = \"10.100.101.71\"\n\n  # Overlay CIDR Range\n  # overlay_cidr_range = \"100.64.128.0/18\"\n\n  # Node Pools for Cluster\n  machine_pools = [\n    # Control Plane Node Pool\n    {\n      name                    = \"control-plane\"\n      control_plane           = true\n      control_plane_as_worker = false\n      additional_labels = {\n        \"region\" : \"east\"\n      }\n      edge_host = [\n        {\n          host_uid        = \"demo-18b14144f3c7e249be69ea02992a8801\"\n          host_name       = \"edge1\"\n          static_ip       = \"10.100.100.31\"\n          subnet_mask     = \"255.255.255.0\"\n          default_gateway = \"10.100.100.1\"\n          dns_servers     = [\"10.100.100.1\", \"10.100.100.2\"]\n\n        },\n        {\n          host_uid        = \"edge123456\"\n          host_name       = \"edge2\"\n          static_ip       = \"10.100.100.32\"\n          subnet_mask     = \"255.255.255.0\"\n          default_gateway = \"10.100.100.1\"\n          dns_servers     = [\"10.100.100.1\", \"10.100.100.2\"]\n          nic_name        = \"auto\"\n\n        }\n      ]\n    },\n    # # Add additional node pools\n    {\n      name          = \"gpu\"\n      control_plane = false\n      edge_host = [\n\n        {\n          host_uid  = \"123test\"\n          static_ip = \"2.2.2.2\"\n        }\n      ]\n      additional_labels = {\n        \"type\" : \"gpu\",\n        \"region\" : \"east\"\n      }\n    }\n\n  ]\n\n  # Cluster Geolocation (Optional)\n  location = {\n    latitude  = 40.442829\n    longitude = -79.950432\n  }\n  rbac_bindings = [\n    {\n      rbac_type = \"ClusterRoleBinding\"\n      rbac_role = {\n        name = \"cluster-admin\"\n        kind = \"ClusterRole\"\n      }\n      subjects = [\n        {\n          name      = \"k8s-admin\"\n          rbac_type = \"Group\"\n        }\n      ]\n    }\n  ]\n\n  # Template and profile IDs are looked up automatically by name\n  cluster_template = {\n    name    = \"east-clusters\"\n    context = \"project\" # Optional: \"project\" (default) or \"tenant\"\n    cluster_profile = [\n      {\n        name    = \"edge-profile\"\n        tag     = \"1.33.5\"  # Optional: version tag\n        context = \"project\" # Optional: \"project\" (default), \"tenant\", or \"system\"\n        variables = {\n          \"clusterCIDR\" = \"10.10.100.0/18\"\n          \"svcCIDR\"     = \"10.10.128.0/18\"\n        }\n      }\n    ]\n  }\n\n}\n\n\n## #########################################################################################\n## Example of using cluster profiles without a cluster template\n## #########################################################################################\n\nmodule \"edge-demo-module-no-template\" {\n  source  = \"spectrocloud/edge/spectrocloud\"\n  version = \"2.0.4\"\n  # Store Number/Location\n  name = \"demo\"\n  # add tags to the cluster (optional) list(strings)\n  cluster_tags = [\"origin:terraform\"]\n  ssh_keys = [\n    \"ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbm test2\",\n  \"ecdsa-sha2-nistp256 AAAAE2VjZHNhL test1\"]\n  ntp_servers = [\n    \"10.10.10.1\",\n    \"10.10.10.2\"\n  ]\n\n  # Cluster VIP to be used with KubeVIP If not using Overlay\n  cluster_vip = \"10.100.101.71\"\n\n  # Overlay CIDR Range\n  # overlay_cidr_range = \"100.64.128.0/18\"\n\n  # Cluster Timezone\n  cluster_timezone = \"America/New_York\"\n\n  # Update worker pools in parallel (optional, default: true)\n  # update_worker_pools_in_parallel = false\n\n  # Node Pools for Cluster\n  machine_pools = [\n    # Control Plane Node Pool\n    {\n      name                    = \"control-plane\"\n      control_plane           = true\n      control_plane_as_worker = false\n      additional_labels = {\n        \"region\" : \"east\"\n      }\n      edge_host = [\n        {\n          host_uid        = \"demo-18b14144f3c7e249be69ea02992a8801\"\n          host_name       = \"edge1\"\n          static_ip       = \"10.100.100.31\"\n          subnet_mask     = \"255.255.255.0\"\n          default_gateway = \"10.100.100.1\"\n          dns_servers     = [\"10.100.100.1\", \"10.100.100.2\"]\n\n        },\n        {\n          host_uid        = \"edge123456\"\n          host_name       = \"edge2\"\n          static_ip       = \"10.100.100.32\"\n          subnet_mask     = \"255.255.255.0\"\n          default_gateway = \"10.100.100.1\"\n          dns_servers     = [\"10.100.100.1\", \"10.100.100.2\"]\n          nic_name        = \"auto\"\n\n        }\n      ]\n    },\n    # # Add additional node pools\n    {\n      name          = \"gpu\"\n      control_plane = false\n      edge_host = [\n\n        {\n          host_uid  = \"123test\"\n          static_ip = \"2.2.2.2\"\n        }\n      ]\n      additional_labels = {\n        \"type\" : \"gpu\",\n        \"region\" : \"east\"\n      }\n    }\n\n  ]\n\n  # Profiles to be added Profile should be an Edge-Native Infra or Full Profile with the OS, Kubernetes Distribution and CNI of choice\n  cluster_profiles = [\n    {\n      name    = \"edge-profile\"\n      tag     = \"1.33.5\"\n      context = \"project\"\n      variables = {\n        \"clusterCIDR\" = \"10.10.100.0/18\"\n        \"svcCIDR\"     = \"10.10.128.0/18\"\n      }\n    },\n    {\n      name    = \"edge-services\"\n      tag     = \"1.0.0\"\n      context = \"project\"\n    },\n    {\n      name    = \"edge-logging\"\n      tag     = \"1.0.0\"\n      context = \"project\"\n    }\n  ]\n  # Cluster Geolocation (Optional)\n  location = {\n    latitude  = 40.442829\n    longitude = -79.950432\n  }\n  rbac_bindings = [\n    {\n      rbac_type = \"ClusterRoleBinding\"\n      rbac_role = {\n        name = \"cluster-admin\"\n        kind = \"ClusterRole\"\n      }\n      subjects = [\n        {\n          name      = \"k8s-admin\"\n          rbac_type = \"Group\"\n        }\n      ]\n    }\n  ]\n}\n\n\n```\n\u003c!-- BEGINNING OF PRE-COMMIT-TERRAFORM DOCS HOOK --\u003e\n## Requirements\n\n| Name | Version |\n|------|---------|\n| \u003ca name=\"requirement_terraform\"\u003e\u003c/a\u003e [terraform](#requirement\\_terraform) | \u003e= 1.3.0 |\n| \u003ca name=\"requirement_spectrocloud\"\u003e\u003c/a\u003e [spectrocloud](#requirement\\_spectrocloud) | \u003e= 0.27.0 |\n\n## Providers\n\n| Name | Version |\n|------|---------|\n| \u003ca name=\"provider_spectrocloud\"\u003e\u003c/a\u003e [spectrocloud](#provider\\_spectrocloud) | \u003e= 0.27.0 |\n\n## Modules\n\nNo modules.\n\n## Resources\n\n| Name | Type |\n|------|------|\n| [spectrocloud_cluster_edge_native.this](https://registry.terraform.io/providers/spectrocloud/spectrocloud/latest/docs/resources/cluster_edge_native) | resource |\n| [spectrocloud_cluster_config_template.this](https://registry.terraform.io/providers/spectrocloud/spectrocloud/latest/docs/data-sources/cluster_config_template) | data source |\n| [spectrocloud_cluster_profile.template_profiles](https://registry.terraform.io/providers/spectrocloud/spectrocloud/latest/docs/data-sources/cluster_profile) | data source |\n| [spectrocloud_cluster_profile.this](https://registry.terraform.io/providers/spectrocloud/spectrocloud/latest/docs/data-sources/cluster_profile) | data source |\n\n## Inputs\n\n| Name | Description | Type | Default | Required |\n|------|-------------|------|---------|:--------:|\n| \u003ca name=\"input_cluster_profiles\"\u003e\u003c/a\u003e [cluster\\_profiles](#input\\_cluster\\_profiles) | Values for the profile(s) to be used for cluster creation.  For `context` a value of [project tenant system] is expected. | \u003cpre\u003elist(object({\u003cbr/\u003e    name    = string\u003cbr/\u003e    tag     = optional(string)\u003cbr/\u003e    context = string # project tenant system\u003cbr/\u003e    packs = optional(list(object({\u003cbr/\u003e      name   = string\u003cbr/\u003e      tag    = string\u003cbr/\u003e      values = optional(string)\u003cbr/\u003e      manifest = optional(list(object({\u003cbr/\u003e        name    = string\u003cbr/\u003e        tag     = string\u003cbr/\u003e        content = string\u003cbr/\u003e      })))\u003cbr/\u003e    })))\u003cbr/\u003e    variables = optional(map(string))\u003cbr/\u003e  }))\u003c/pre\u003e | `[]` | no |\n| \u003ca name=\"input_cluster_tags\"\u003e\u003c/a\u003e [cluster\\_tags](#input\\_cluster\\_tags) | Tags to be added to the profile.  key:value | `list(string)` | `[]` | no |\n| \u003ca name=\"input_cluster_template\"\u003e\u003c/a\u003e [cluster\\_template](#input\\_cluster\\_template) | Optional cluster template configuration. Provide the template name and context, and optionally cluster profiles with variables. IDs are looked up automatically. | \u003cpre\u003eobject({\u003cbr/\u003e    name    = string\u003cbr/\u003e    context = optional(string, \"project\") # project or tenant\u003cbr/\u003e    cluster_profile = optional(list(object({\u003cbr/\u003e      name      = string\u003cbr/\u003e      tag       = optional(string)\u003cbr/\u003e      context   = optional(string, \"project\") # project, tenant, or system\u003cbr/\u003e      variables = optional(map(string))\u003cbr/\u003e    })))\u003cbr/\u003e  })\u003c/pre\u003e | `null` | no |\n| \u003ca name=\"input_cluster_timezone\"\u003e\u003c/a\u003e [cluster\\_timezone](#input\\_cluster\\_timezone) | Timezone for the cluster. | `string` | `\"\"` | no |\n| \u003ca name=\"input_cluster_vip\"\u003e\u003c/a\u003e [cluster\\_vip](#input\\_cluster\\_vip) | IP Address or DNS name for Cluster VIP for HA. If using an IP, it must be unused and on the same layer 2 segment as the node IPs. | `string` | `\"\"` | no |\n| \u003ca name=\"input_location\"\u003e\u003c/a\u003e [location](#input\\_location) | Optional - If used Latitude and Longitude represent the coordinates of the location you wish to assign to the cluster.  https://www.latlong.net/ is one tool that can be used to find this. | \u003cpre\u003eobject({\u003cbr/\u003e    latitude  = optional(number)\u003cbr/\u003e    longitude = optional(number)\u003cbr/\u003e  })\u003c/pre\u003e | \u003cpre\u003e{\u003cbr/\u003e  \"latitude\": 0,\u003cbr/\u003e  \"longitude\": 0\u003cbr/\u003e}\u003c/pre\u003e | no |\n| \u003ca name=\"input_machine_pools\"\u003e\u003c/a\u003e [machine\\_pools](#input\\_machine\\_pools) | Values for the attributes of the Node Pools. 'edge\\_host\\_tags' is used to lookup the Edge Host already registered with Palette. | \u003cpre\u003elist(object({\u003cbr/\u003e    name                    = string\u003cbr/\u003e    additional_labels       = optional(map(string))\u003cbr/\u003e    control_plane           = optional(bool)\u003cbr/\u003e    control_plane_as_worker = optional(bool)\u003cbr/\u003e    taints = optional(list(object({\u003cbr/\u003e      effect = string\u003cbr/\u003e      key    = string\u003cbr/\u003e      value  = string\u003cbr/\u003e    })))\u003cbr/\u003e    edge_host = list(object({\u003cbr/\u003e      host_uid        = string\u003cbr/\u003e      host_name       = optional(string)\u003cbr/\u003e      nic_name        = optional(string)\u003cbr/\u003e      static_ip       = optional(string)\u003cbr/\u003e      subnet_mask     = optional(string)\u003cbr/\u003e      default_gateway = optional(string)\u003cbr/\u003e      dns_servers     = optional(list(string))\u003cbr/\u003e      two_node_role   = optional(string)\u003cbr/\u003e    }))\u003cbr/\u003e  }))\u003c/pre\u003e | n/a | yes |\n| \u003ca name=\"input_name\"\u003e\u003c/a\u003e [name](#input\\_name) | Name of the cluster to be created. | `string` | n/a | yes |\n| \u003ca name=\"input_ntp_servers\"\u003e\u003c/a\u003e [ntp\\_servers](#input\\_ntp\\_servers) | n/a | `list(string)` | `[]` | no |\n| \u003ca name=\"input_overlay_cidr_range\"\u003e\u003c/a\u003e [overlay\\_cidr\\_range](#input\\_overlay\\_cidr\\_range) | CIDR range for the overlay network. | `string` | `\"\"` | no |\n| \u003ca name=\"input_rbac_bindings\"\u003e\u003c/a\u003e [rbac\\_bindings](#input\\_rbac\\_bindings) | RBAC Bindings to be added to the cluster | \u003cpre\u003elist(object({\u003cbr/\u003e    rbac_type = string\u003cbr/\u003e    namespace = optional(string)\u003cbr/\u003e    rbac_role = optional(map(string))\u003cbr/\u003e    subjects = optional(list(object({\u003cbr/\u003e      name      = string\u003cbr/\u003e      rbac_type = string\u003cbr/\u003e      namespace = optional(string)\u003cbr/\u003e    })))\u003cbr/\u003e  }))\u003c/pre\u003e | `[]` | no |\n| \u003ca name=\"input_skip_wait_for_completion\"\u003e\u003c/a\u003e [skip\\_wait\\_for\\_completion](#input\\_skip\\_wait\\_for\\_completion) | n/a | `bool` | `true` | no |\n| \u003ca name=\"input_ssh_keys\"\u003e\u003c/a\u003e [ssh\\_keys](#input\\_ssh\\_keys) | n/a | `list(string)` | `[]` | no |\n| \u003ca name=\"input_update_worker_pools_in_parallel\"\u003e\u003c/a\u003e [update\\_worker\\_pools\\_in\\_parallel](#input\\_update\\_worker\\_pools\\_in\\_parallel) | Whether to update worker pools in parallel. When true, all worker node pools are updated simultaneously. | `bool` | `true` | no |\n\n## Outputs\n\n| Name | Description |\n|------|-------------|\n| \u003ca name=\"output_admin_kube_config\"\u003e\u003c/a\u003e [admin\\_kube\\_config](#output\\_admin\\_kube\\_config) | n/a |\n| \u003ca name=\"output_id\"\u003e\u003c/a\u003e [id](#output\\_id) | n/a |\n| \u003ca name=\"output_kubeconfig\"\u003e\u003c/a\u003e [kubeconfig](#output\\_kubeconfig) | n/a |\n| \u003ca name=\"output_name\"\u003e\u003c/a\u003e [name](#output\\_name) | n/a |\n\u003c!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK --\u003e","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fspectrocloud%2Fterraform-spectrocloud-edge","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fspectrocloud%2Fterraform-spectrocloud-edge","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fspectrocloud%2Fterraform-spectrocloud-edge/lists"}