Terraform digitaloceanfor_each项目和DNS记录



我想在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",
} 
}
一号

第一个问题是项目只能创建一次,而必须将多个资源(服务器)分配给它(参见这里的文档)。因此,我在./modules/server中创建了如下输出:

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

我假设这为我提供了一个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。因此你不能遍历它。

最新更新