带有项目和 DNS 记录的 Terraform DigitalOcean for_each

Terraform DigitalOcean for_each with projects and DNS records

我想在 DigitalOcean 上创建多个服务器,将它们放在一个项目中,并为每个创建的服务器创建一个 DNS 记录。

我在根目录下有以下 main.tf 文件:

module "ubuntu-server" {
    source = "./modules/server"

    for_each = var.servers

    name           =       each.value.name
    region         =       each.value.region
}

module "terraform-project" {
    source = "./modules/project" 

    project_name   =       var.project_name
    resources      =       module.ubuntu-server.droplet_urn
}

module "server-record" {
    source = "./modules/record"

    domain_name    =       var.domain_name
    name           =       module.ubuntu-server[*].droplet_name
    value          =       module.ubuntu-server[*].droplet_ip_address
}

服务器模块(./modules/server)包含以下主要文件:

resource "digitalocean_droplet" "server" {
    name    = var.name
    region  = var.region 
}

项目模块(./modules/project):

resource "digitalocean_project" "terraform_project" {
  name        = var.project_name
  resources   = var.resources
}

记录模块(./modules/record):

data "digitalocean_domain" "server" {
  name = var.domain_name
}

resource "digitalocean_record" "www" {
  domain    = data.digitalocean_domain.server.id
  type      = "A"
  name      = var.name
  value     = var.value
}

./modules/server 有以下输出:

output "droplet_ip_address" {
  value = digitalocean_droplet.server.ipv4_address
}

output "droplet_name" {
  value = digitalocean_droplet.server.name
}

output "droplet_urn" {
   value = [
     for row in digitalocean_droplet.server.urn : row.urn
   ]
}

变量文件如下所示:

domain_name     =       "my_domain.com"
project_name    =       "project_name"
servers = {
    server1 = {
        name  = "server1",
        region = "region1",

    },
    server2 = {
        name  = "server2",
        region = "region2",
    } 
}

第 1 期

第一个问题是项目只能创建一次,同时必须为其分配多个资源(服务器)(参见文档 here。因此我在 ./modules/server 中创建了一个输出如下:

output "droplet_urn" {
  value = [
    for row in digitalocean_droplet.server.urn : row.urn
  ]
}

我假设这为我提供了一个骨灰盒列表,因此我可以将该列表分配给项目部分中的 resources 属性。但我收到以下错误(在服务器模块输出中):

│ 字符串类型的值不能作为'for'表达式中的集合。

第 2 期

另一个问题是需要为每个服务器创建 server-record。 我收到以下错误:

│ Error: Unsupported attribute
│ 
│   on main.tf line 28, in module "server-record":
│   28:     name           =       module.ubuntu-server[*].droplet_name
│ 
│ This object does not have an attribute named "droplet_name".
╵
╷
│ Error: Unsupported attribute
│ 
│   on main.tf line 29, in module "server-record":
│   29:     value          =       module.ubuntu-server[*].droplet_ip_address
│ 
│ This object does not have an attribute named "droplet_ip_address".

由于您正在使用 for_each 创建模块,因此您应该:

name           =      values(module.ubuntu-server)[*].droplet_name
value          =      values(module.ubuntu-server)[*].droplet_ip_address

您的 digitalocean_droplet.server 只是一个实例,因为您没有使用任何 countfor_each。因此你不能迭代它。