Skip to content

can't create mutils agent #466

@xrain0610

Description

@xrain0610

resource "coder_agent" "agents" { for_each = local.containers_set arch = data.coder_provisioner.me.arch os = "linux" startup_script = <<-EOT

I want to create a workspace , it contain mutils docker container, I want ever container can use webide, how show I Do?

there is full template

terraform {
  required_providers {
    coder = {
      source = "coder/coder"
    }
    docker = {
      source = "kreuzwerker/docker"
    }
  }
}

locals {
  username        = data.coder_workspace_owner.me.name
  workspace_name  = data.coder_workspace.me.name
  containers_list = jsondecode(data.coder_parameter.spaces.value)
  containers_set = toset(local.containers_list)
  proxy_server    = "http://192.168.0.250:8118"
}

variable "docker_socket" {
  default     = ""
  description = "(Optional) Docker socket URI"
  type        = string
}

provider "docker" {
  host = var.docker_socket != "" ? var.docker_socket : null
}

data "coder_provisioner" "me" {}
data "coder_workspace" "me" {}
data "coder_workspace_owner" "me" {}

data "coder_parameter" "spaces" {
  name        = "工作容器列表"
  description = "每一个名称都会创建一个容器在当前space下"
  mutable     = true
  type        = "list(string)"
  default = jsonencode(["api","app"])
}

data "coder_parameter" "ssh_key" {
  name        = "SSH Private Key"
  description = "SSH Private Key For Git And SSH, 不要包含-----BEGIN OPENSSH PRIVATE KEY-----和-----END OPENSSH PRIVATE KEY-----"
  default     = ""
  mutable     = true
  type        = "string"
}

resource "null_resource" "create_host_dirs" {
  for_each = local.containers_set
  provisioner "local-exec" {
    command = <<-EOT
      host_dir='/data/${local.username}/${local.workspace_name}/${each.value}'
      host_dir_in_coder="/host$host_dir"
      mkdir -p $host_dir_in_coder
      chmod -R 777 $host_dir_in_coder
      echo "Host directory "$host_dir" created"
    EOT
  }
}

resource "docker_volume" "project_volumes" {
  for_each = local.containers_set
  name = "coder-${local.username}-${local.workspace_name}-${each.value}-projects"
  driver_opts = {
    type   = "none"
    device = "/data/${local.username}/${local.workspace_name}/${each.value}"
    o      = "bind"
  }
  
  depends_on = [null_resource.create_host_dirs]

  lifecycle {
    ignore_changes = all
  }

  labels {
    label = "coder.owner"
    value = local.username
  }
  labels {
    label = "coder.workspace_id"
    value = data.coder_workspace.me.id
  }
  labels {
    label = "coder.container_name"
    value = each.value
  }
}

resource "coder_agent" "agents" {
  for_each = local.containers_set
  arch           = data.coder_provisioner.me.arch
  os             = "linux"
  startup_script = <<-EOT
    set -e
    cp -rT /etc/skel ~
    mkdir -p ~/.ssh
    echo "-----BEGIN OPENSSH PRIVATE KEY-----" > ~/.ssh/id_rsa
    echo "${data.coder_parameter.ssh_key.value}" | tr ' ' '\n' >> ~/.ssh/id_rsa
    echo "-----END OPENSSH PRIVATE KEY-----" >> ~/.ssh/id_rsa
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/id_rsa
  EOT

  env = {
    GIT_AUTHOR_NAME     = coalesce(data.coder_workspace_owner.me.full_name, data.coder_workspace_owner.me.name)
    GIT_AUTHOR_EMAIL    = "${data.coder_workspace_owner.me.email}"
    GIT_COMMITTER_NAME  = coalesce(data.coder_workspace_owner.me.full_name, data.coder_workspace_owner.me.name)
    GIT_COMMITTER_EMAIL = "${data.coder_workspace_owner.me.email}"
    # CONTAINER_NAME      = local.containers_list[count.index]  # 直接引用列表值
  }
}
module "code-server" {
  for_each = local.containers_set
  
  source         = "registry.coder.com/coder/code-server/coder"
  version        = "~> 1.0"
  folder         = "/projects"
  slug           = "code-server-${each.value}"
  offline        = true
  install_prefix = "/usr"
  agent_id       = coder_agent.agents[each.value].id
}
resource "docker_container" "containers" {
  for_each = local.containers_set
  image = "xrain0610/debian:coder"
  name  = "coder-${local.username}-${local.workspace_name}-${each.value}"
  hostname = "${local.workspace_name}-${each.value}"
  entrypoint = ["sh", "-c", replace(coder_agent.agents[each.value].init_script, "/localhost|127\\.0\\.0\\.1/", "host.docker.internal")]
  env        = ["CODER_AGENT_TOKEN=${coder_agent.agents[each.key]}"]

  volumes {
    container_path = "/projects"
    volume_name    = docker_volume.project_volumes[each.value].name
    read_only      = false
  }
  labels {
    label = "coder.owner"
    value = local.username
  }
  labels {
    label = "coder.owner_id"
    value = data.coder_workspace_owner.me.id
  }
  labels {
    label = "coder.workspace_id"
    value = data.coder_workspace.me.id
  }
  labels {
    label = "coder.workspace_name"
    value = local.workspace_name
  }
  labels {
    label = "coder.container_name"
    value = each.value
  }
}
` ``

then build error occured,

Error during the build
template import provision for start: plan resources: duplicate agent name: agents
scope
organization

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions