带有项目和 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
只是一个实例,因为您没有使用任何 count
或 for_each
。因此你不能迭代它。
我想在 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
只是一个实例,因为您没有使用任何 count
或 for_each
。因此你不能迭代它。