我一直在尝试通过terraform在azure开发中创建两个不同的环境。但有一点我做不到,那就是"亲手"给这些羡慕者起名字。在终端
使用下面的代码:
main.tf
resource "azuredevops_environment" "environment1" {
project_id = azuredevops_project.project.id
name = var.env_name1
}
resource "azuredevops_environment" "environment2" {
project_id = azuredevops_project.project.id
name = var.env_name2
}
variables.tf
variable env_name1 {
type = string
sensitive = true
}
variable env_name2 {
type = string
sensitive = true
}
在我使用terraform apply之后,我必须在terminal中命名这两个env——这是我想要的。但是我想在一个模块中得到这个,而不是两个(例如通过使用count或for each),但我不知道如何。
这应该是相当容易做到的:
variable "environments" {
type = list(string)
sensitive = true
}
然后,假设您像这样将值添加到上述变量中:
environments = ["env1", "env2"]
最后:
resource "azuredevops_environment" "environment" {
for_each = toset(var.environments)
project_id = azuredevops_project.project.id
name = each.value
}
在这里,内置的toset
函数[1]与for_each
元参数一起使用。这将创建两个键为env1
和env2
的环境,也就是说,它们将在输出中显示为azuredevops_environment.environment["env1"]
和azuredevops_environment.environment["env2"]
。
根据注释(h/t: @MattSchuchard),变量可以立即使用set(string)
类型,这将避免使用toset
:
variable "environments" {
type = set(string)
sensitive = true
}
变量的值将保持不变,资源块必须更新为:
resource "azuredevops_environment" "environment" {
for_each = var.environments
project_id = azuredevops_project.project.id
name = each.value
}
[1] https://developer.hashicorp.com/terraform/language/functions/toset
[2] https://developer.hashicorp.com/terraform/language/meta-arguments/for_each