所以...我有一个案例,我基本上这样做:
resource "openstack_compute_instance_v2" "foo" {
count = N
...
network {
...
}
network {
...
}
}
resource "ovh_domain_zone_record" "foo" {
count = N
...
target = "${openstack_compute_instance_v2.foo.*.network.1.fixed_ip_v4[count.index]}"
}
一切都很棒......直到它没有。
如果实例的资源创建失败且部分状态,实例已创建但未启动,则在network.1.fixed_ip_v4
下也未分配任何内容。* ovh_domain_zone_record.foo: 1 error(s) occurred:
* ovh_domain_zone_record.foo[2]: index 2 out of range for list openstack_compute_instance_v2.foo.*.network.1.fixed_ip_v4 (max 2) in:
${openstack_compute_instance_v2.foo.*.network.1.fixed_ip_v4[count.index]}
因此,这里的问题似乎是,如果带有计数的资源在整个实例中导致不连贯状态(某些实例具有值,有些则没有),并且该属性稍后被引用具有相同计数的另一个资源,以创建适当的"兄弟"资源(在我的情况下,主机的DNS名称)然后由$ {resource。*。attribute}插值产生的列表将不包含主资源失败的空条目。相反,它会因计数失败而缩短,因此,由于兄弟资源的最后一个实例无法获取其信息,因此terraform将因失败资源的数量而失败。
其次,这意味着如果第二个实例的主要资源的创建失败,则第三个实例的相关资源的创建将失败。因为整个TF会抱怨并且根本不会进行,所以它不会被错误地创建,并且不是真正的问题。
问题是,如何在使用count = N
时创建相关资源集?