Terraform每次添加一个配置块时,都会尝试在循环中重新排序和重新创建配置块
在循环中修改配置块时,我看到一些奇怪的行为 看起来Terraform正在使用配置块或其他东西:Terraform每次添加一个配置块时,都会尝试在循环中重新排序和重新创建配置块,terraform,Terraform,在循环中修改配置块时,我看到一些奇怪的行为 看起来Terraform正在使用配置块或其他东西: // example map variable "my_apps" { type = map(object({ app-type-1 = list(string) })) default = { us-east-1 = { app-type-1 = [ "app1", ] }
// example map
variable "my_apps" {
type = map(object({
app-type-1 = list(string)
}))
default = {
us-east-1 = {
app-type-1 = [
"app1",
]
}
us-west-2 = {
app-type-1 = [
"app1",
"app2",
"app3"
]
}
}
}
// loop over map
resource "aws_elastic_beanstalk_configuration_template" "mytemplate" {
depends_on = [aws_elastic_beanstalk_application.myapp]
provider = aws.us-west-2
for_each = toset(var.beanstalk_applications["us-west-2"]["app-type-1"])
name = "app-type1-base"
application = each.value
solution_stack_name = "64bit Amazon Linux 2015.09 v2.0.8 running Go 1.4"
setting {
namespace = "aws:ec2:vpc"
name = "VPCId"
value = "blah"
}
setting {
namespace = "aws:ec2:vpc"
name = "Subnets"
value = "blah"
}
// added this
setting {
namespace = "aws:ec2:vpc"
name = "ELBSubnets"
value = "blah"
}
}
当我添加一个新的块时,地形会重新排列整个东西
+ setting {
+ name = "ELBSubnets"
+ namespace = "aws:ec2:vpc"
+ value = "blah"
}
- setting {
- name = "Subnets" -> null
- namespace = "aws:ec2:vpc" -> null
- value = "blah" -> null
}
+ setting {
+ name = "Subnets"
+ namespace = "aws:ec2:vpc"
+ value = "blah"
}
- setting {
- name = "VPCId" -> null
- namespace = "aws:ec2:vpc" -> null
- value = "blah" -> null
}
+ setting {
+ name = "VPCId"
+ namespace = "aws:ec2:vpc"
+ value = "blah"
}
查看此资源的代码:
设置
参数不强制新资源,是的,您看到的有点烦人,但没有任何害处
"setting": {
Type: schema.TypeSet,
Optional: true,
Computed: true,
Elem: resourceAwsElasticBeanstalkOptionSetting(),
Set: optionSettingValueHash,
},
"solution_stack_name": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
},
一个解决方案是用一种能保持给定顺序的字体来替换该字体,但可能会有副作用
可以尝试使用动态嵌套块,例如:
provider "aws" {
region = "us-east-1"
}
resource "aws_elastic_beanstalk_configuration_template" "mytemplate" {
for_each = toset(["app1", "app2"])
name = "app-type1-base"
application = each.value
solution_stack_name = "64bit Amazon Linux 2015.09 v2.0.8"
dynamic "setting" {
for_each = toset(sort(["ELBSubnets", "Subnets", "VPCId"]))
content {
namespace = "aws:ec2:vpc"
name = setting.value
value = "blah"
}
}
}
这toset(排序([“子网”、“子网”、“VPCId”)
应始终保持它们的有序性查看此资源的代码:
设置
参数不强制新资源,是的,您看到的有点烦人,但没有任何害处
"setting": {
Type: schema.TypeSet,
Optional: true,
Computed: true,
Elem: resourceAwsElasticBeanstalkOptionSetting(),
Set: optionSettingValueHash,
},
"solution_stack_name": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
},
一个解决方案是用一种能保持给定顺序的字体来替换该字体,但可能会有副作用
可以尝试使用动态嵌套块,例如:
provider "aws" {
region = "us-east-1"
}
resource "aws_elastic_beanstalk_configuration_template" "mytemplate" {
for_each = toset(["app1", "app2"])
name = "app-type1-base"
application = each.value
solution_stack_name = "64bit Amazon Linux 2015.09 v2.0.8"
dynamic "setting" {
for_each = toset(sort(["ELBSubnets", "Subnets", "VPCId"]))
content {
namespace = "aws:ec2:vpc"
name = setting.value
value = "blah"
}
}
}
这toset(排序([“子网”、“子网”、“VPCId”)
应该始终保持它们的顺序但是如果我更改顺序,tf会尝试删除/添加回设置吗?我认为foreach在状态中创建了key=>值的映射,而count只是创建了一个数组。我在想,每个“设置”配置块都会在状态中绑定到自己的键,配置的顺序无关紧要。也许我把一些东西混在一起了,我现在也把动态块和静态配置的设置混在一起了。因此,我有一些单独定义的设置块,还有一个动态设置块-指定区域设置,然后在共享设置地图上循环所有区域使用抱歉@red888我不确定我是否遵循您的评论
foreach创建了一个key=>value的映射
是的,它对资源有效,但对动态块无效。但我的回答的要点是:setting参数不强制新资源您可能不想看到所有这些更改,但它非常好,但是如果我更改顺序,tf会尝试删除/添加回设置吗?我认为foreach在状态中创建了key=>值的映射,而count只是创建了一个数组。我在想,每个“设置”配置块都会在状态中绑定到自己的键,配置的顺序无关紧要。也许我把一些东西混在一起了,我现在也把动态块和静态配置的设置混在一起了。因此,我有一些单独定义的设置块,还有一个动态设置块-指定区域设置,然后在共享设置地图上循环所有区域使用抱歉@red888我不确定我是否遵循您的评论foreach创建了一个key=>value的映射
是的,它为资源创建了映射,但不为动态块创建映射u