chore(examples/templates/digitalocean-linux): make template more friendly (#15938)

This commit is contained in:
Phorcys
2024-12-24 20:52:23 +01:00
committed by GitHub
parent 26b1f1c3a3
commit 03edd604a7
3 changed files with 25 additions and 27 deletions

View File

@ -66,7 +66,7 @@
"linux", "linux",
"digitalocean" "digitalocean"
], ],
"markdown": "\n# Remote Development on DigitalOcean Droplets\n\nProvision DigitalOcean Droplets as [Coder workspaces](https://coder.com/docs/workspaces) with this example template.\n\n\u003c!-- TODO: Add screenshot --\u003e\n\n## Prerequisites\n\nTo deploy workspaces as DigitalOcean Droplets, you'll need:\n\n- DigitalOcean [personal access token (PAT)](https://docs.digitalocean.com/reference/api/create-personal-access-token/)\n\n- DigitalOcean project ID (you can get your project information via the `doctl`\n CLI by running `doctl projects list`)\n\n- Remove the following sections from the `main.tf` file if you don't want to\n associate your workspaces with a project:\n\n - `variable \"step2_do_project_id\"`\n - `resource \"digitalocean_project_resources\" \"project\"`\n\n- **Optional:** DigitalOcean SSH key ID (obtain via the `doctl` CLI by running\n `doctl compute ssh-key list`)\n\n- Note that this is only required for Fedora images to work.\n\n### Authentication\n\nThis template assumes that coderd is run in an environment that is authenticated\nwith Digital Ocean. Obtain a [Digital Ocean Personal Access\nToken](https://cloud.digitalocean.com/account/api/tokens) and set the\nenvironment variable `DIGITALOCEAN_TOKEN` to the access token before starting\ncoderd. For other ways to authenticate [consult the Terraform docs](https://registry.terraform.io/providers/digitalocean/digitalocean/latest/docs).\n\n## Architecture\n\nThis template provisions the following resources:\n\n- Azure VM (ephemeral, deleted on stop)\n- Managed disk (persistent, mounted to `/home/coder`)\n\nThis means, when the workspace restarts, any tools or files outside of the home directory are not persisted. To pre-bake tools into the workspace (e.g. `python3`), modify the VM image, or use a [startup script](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/script).\n\n\u003e **Note**\n\u003e This template is designed to be a starting point! Edit the Terraform to extend the template to support your use case.\n" "markdown": "\n# Remote Development on DigitalOcean Droplets\n\nProvision DigitalOcean Droplets as [Coder workspaces](https://coder.com/docs/workspaces) with this example template.\n\n\u003c!-- TODO: Add screenshot --\u003e\n\n## Prerequisites\n\nTo deploy workspaces as DigitalOcean Droplets, you'll need:\n\n- DigitalOcean [personal access token (PAT)](https://docs.digitalocean.com/reference/api/create-personal-access-token)\n\n- DigitalOcean project ID (you can get your project information via the `doctl` CLI by running `doctl projects list`)\n\n - Remove the following sections from the `main.tf` file if you don't want to\n associate your workspaces with a project:\n\n - `variable \"project_uuid\"`\n - `resource \"digitalocean_project_resources\" \"project\"`\n\n- **Optional:** DigitalOcean SSH key ID (obtain via the `doctl` CLI by running\n `doctl compute ssh-key list`)\n\n - Note that this is only required for Fedora images to work.\n\n### Authentication\n\nThis template assumes that the Coder Provisioner is run in an environment that is authenticated with Digital Ocean.\n\nObtain a [Digital Ocean Personal Access Token](https://cloud.digitalocean.com/account/api/tokens) and set the `DIGITALOCEAN_TOKEN` environment variable to the access token.\nFor other ways to authenticate [consult the Terraform provider's docs](https://registry.terraform.io/providers/digitalocean/digitalocean/latest/docs).\n\n## Architecture\n\nThis template provisions the following resources:\n\n- DigitalOcean VM (ephemeral, deleted on stop)\n- Managed disk (persistent, mounted to `/home/coder`)\n\nThis means, when the workspace restarts, any tools or files outside of the home directory are not persisted. To pre-bake tools into the workspace (e.g. `python3`), modify the VM image, or use a [startup script](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/script).\n\n\u003e [!NOTE]\n\u003e This template is designed to be a starting point! Edit the Terraform to extend the template to support your use case.\n"
}, },
{ {
"id": "docker", "id": "docker",

View File

@ -17,38 +17,36 @@ Provision DigitalOcean Droplets as [Coder workspaces](https://coder.com/docs/wor
To deploy workspaces as DigitalOcean Droplets, you'll need: To deploy workspaces as DigitalOcean Droplets, you'll need:
- DigitalOcean [personal access token (PAT)](https://docs.digitalocean.com/reference/api/create-personal-access-token/) - DigitalOcean [personal access token (PAT)](https://docs.digitalocean.com/reference/api/create-personal-access-token)
- DigitalOcean project ID (you can get your project information via the `doctl` - DigitalOcean project ID (you can get your project information via the `doctl` CLI by running `doctl projects list`)
CLI by running `doctl projects list`)
- Remove the following sections from the `main.tf` file if you don't want to - Remove the following sections from the `main.tf` file if you don't want to
associate your workspaces with a project: associate your workspaces with a project:
- `variable "step2_do_project_id"` - `variable "project_uuid"`
- `resource "digitalocean_project_resources" "project"` - `resource "digitalocean_project_resources" "project"`
- **Optional:** DigitalOcean SSH key ID (obtain via the `doctl` CLI by running - **Optional:** DigitalOcean SSH key ID (obtain via the `doctl` CLI by running
`doctl compute ssh-key list`) `doctl compute ssh-key list`)
- Note that this is only required for Fedora images to work. - Note that this is only required for Fedora images to work.
### Authentication ### Authentication
This template assumes that coderd is run in an environment that is authenticated This template assumes that the Coder Provisioner is run in an environment that is authenticated with Digital Ocean.
with Digital Ocean. Obtain a [Digital Ocean Personal Access
Token](https://cloud.digitalocean.com/account/api/tokens) and set the Obtain a [Digital Ocean Personal Access Token](https://cloud.digitalocean.com/account/api/tokens) and set the `DIGITALOCEAN_TOKEN` environment variable to the access token.
environment variable `DIGITALOCEAN_TOKEN` to the access token before starting For other ways to authenticate [consult the Terraform provider's docs](https://registry.terraform.io/providers/digitalocean/digitalocean/latest/docs).
coderd. For other ways to authenticate [consult the Terraform docs](https://registry.terraform.io/providers/digitalocean/digitalocean/latest/docs).
## Architecture ## Architecture
This template provisions the following resources: This template provisions the following resources:
- Azure VM (ephemeral, deleted on stop) - DigitalOcean VM (ephemeral, deleted on stop)
- Managed disk (persistent, mounted to `/home/coder`) - Managed disk (persistent, mounted to `/home/coder`)
This means, when the workspace restarts, any tools or files outside of the home directory are not persisted. To pre-bake tools into the workspace (e.g. `python3`), modify the VM image, or use a [startup script](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/script). This means, when the workspace restarts, any tools or files outside of the home directory are not persisted. To pre-bake tools into the workspace (e.g. `python3`), modify the VM image, or use a [startup script](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/script).
> **Note** > [!NOTE]
> This template is designed to be a starting point! Edit the Terraform to extend the template to support your use case. > This template is designed to be a starting point! Edit the Terraform to extend the template to support your use case.

View File

@ -9,30 +9,29 @@ terraform {
} }
} }
provider "coder" { provider "coder" {}
}
variable "step1_do_project_id" { variable "project_uuid" {
type = string type = string
description = <<-EOF description = <<-EOF
Enter project ID DigitalOcean project ID
$ doctl projects list $ doctl projects list
EOF EOF
sensitive = true sensitive = true
validation { validation {
# make sure length of alphanumeric string is 36 # make sure length of alphanumeric string is 36 (UUIDv4 size)
condition = length(var.step1_do_project_id) == 36 condition = length(var.project_uuid) == 36
error_message = "Invalid Digital Ocean Project ID." error_message = "Invalid Digital Ocean Project ID."
} }
} }
variable "step2_do_admin_ssh_key" { variable "ssh_key_id" {
type = number type = number
description = <<-EOF description = <<-EOF
Enter admin SSH key ID (some Droplet images require an SSH key to be set): DigitalOcean SSH key ID (some Droplet images require an SSH key to be set):
Can be set to "0" for no key. Can be set to "0" for no key.
@ -41,9 +40,10 @@ variable "step2_do_admin_ssh_key" {
$ doctl compute ssh-key list $ doctl compute ssh-key list
EOF EOF
sensitive = true sensitive = true
default = 0
validation { validation {
condition = var.step2_do_admin_ssh_key >= 0 condition = var.ssh_key_id >= 0
error_message = "Invalid Digital Ocean SSH key ID, a number is required." error_message = "Invalid Digital Ocean SSH key ID, a number is required."
} }
} }
@ -291,11 +291,11 @@ resource "digitalocean_droplet" "workspace" {
coder_agent_token = coder_agent.main.token coder_agent_token = coder_agent.main.token
}) })
# Required to provision Fedora. # Required to provision Fedora.
ssh_keys = var.step2_do_admin_ssh_key > 0 ? [var.step2_do_admin_ssh_key] : [] ssh_keys = var.ssh_key_id > 0 ? [var.ssh_key_id] : []
} }
resource "digitalocean_project_resources" "project" { resource "digitalocean_project_resources" "project" {
project = var.step1_do_project_id project = var.project_uuid
# Workaround for terraform plan when using count. # Workaround for terraform plan when using count.
resources = length(digitalocean_droplet.workspace) > 0 ? [ resources = length(digitalocean_droplet.workspace) > 0 ? [
digitalocean_volume.home_volume.urn, digitalocean_volume.home_volume.urn,