我想方便地尝试使用Terraform的for_each功能
首先
使用 Terraform 的 for_each 功能真是方便呢。
如果需要创建多个不同的资源,这是必不可少的。对我来说,这非常体现了基础设施即代码的观念。
有时候,尽管与直觉相悖,我们还是需要采取一些不寻常的用法。
比如,在需要对map的列表进行for_each操作时。
在这种时候,我常常会想到这样的事情。
我想要在尝试各种方式时确认一下for_each的功能!
那么。 (Nà me.)
但是,由于for_each只能在资源内部使用,所以首先需要准备好资源才能进行尝试。
虽然这样说,但是特意使用AWS等资源有点麻烦。
因此,這次我們…
- for_eachの動きをちゃんとしたresourceを用意せずに確認する。
我在那个时候进行了一番调查,找出了应对方法,现在与你分享。
结论:让我们使用 Null Provider!
只有这个。
文件在这里:
https://registry.terraform.io/providers/hashicorp/null/latest/docs
如果对此了解的人们或许只需要这些就够了,
不过既然已经麻烦了,也可以使用null,通过实际测试来确认for_each的运行情况。
使用方法 (shǐ fǎ)
阅读上述文档时,… (When reading the aforementioned document…)
resource "null_resource" "cluster" {
# Changes to any instance of the cluster requires re-provisioning
triggers = {
cluster_instance_ids = join(",", aws_instance.cluster.*.id)
}
用null_resource资源,并将map放入触发器中,就可以实现类似这样的效果。
让我们立刻试一试。
轻轻地尝试一下
进行null安装和terraform init操作
terraform {
required_version = ">= 0.12"
required_providers {
null = {
source = "hashicorp/null"
version = "3.1.0"
}
}
}
provider "null" {}
执行terraform init。
尝试对 map 列表进行 for_each。
locals {
members = [
{"id" = 1, "name" = "Takashi"},
{"id" = 2, "name" = "Satoshi"},
]
}
resource null_resource for_each {
for_each = {for k in local.members : k.id => k}
triggers = {
"${each.value.id}" = each.value.name
}
}
然后尝试进行terraform plan,
Terraform will perform the following actions:
# null_resource.for_each["1"] will be created
+ resource "null_resource" "for_each" {
+ id = (known after apply)
+ triggers = {
+ "1" = "Takashi"
}
}
# null_resource.for_each["2"] will be created
+ resource "null_resource" "for_each" {
+ id = (known after apply)
+ triggers = {
+ "2" = "Satoshi"
}
}
Plan: 2 to add, 0 to change, 0 to destroy.
好的!在triggers里面,map以很好的方式被输出出来了,感觉就是这样。
通过这样,我们能够方便地确认for_each的运作方式。非常感谢!
最后的话
我只使用AWS作为主要的供应商,但是一旦我知道还有其他提供者,我就立刻想要调查一下了。
如果有什么新的方便事物,我想试一试然后写成文章。
请提供相关信息。
hashicorp/null | Terraform注册表
类型和值-配置语言| HashiCorp的Terraform
类型约束-配置语言| HashiCorp的Terraform
对于表达式-配置语言| HashiCorp的Terraform
for_each元参数-配置语言| HashiCorp的Terraform