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