所以,我有一段代码-
resource "bigip_ltm_virtual_server" "agent_vip" {
depends_on = [var.use_traefik ? bigip_ltm_pool.agent_lb_443_pool : bigip_ltm_pool.agent_lb_30443_pool, null_resource.sync_check]
description = "${var.cluster_name}.${var.domain}_443"
destination = "${var.agent_f5_ip_address}"
ip_protocol = "tcp"
name = "/Common/${var.cluster_name}.${var.domain}_443"
pool = var.use_traefik ? "/Common/${var.cluster_name}-lbaas-agent_lb-443-pool" : "/Common/${var.cluster_name}-lbaas-agent_lb-30443-pool"
port = 443
profiles = ["/Common/tcp"]
source_address_translation = "automap"
translate_address = "enabled"
translate_port = "enabled"
}
当我运行Terraform时,应用错误提示-
Error: Invalid expression
on main.tf line 193, in resource "bigip_ltm_virtual_server" "agent_vip":
193: depends_on = var.use_traefik ? [bigip_ltm_pool.agent_lb_443_pool, null_resource.sync_check] : [bigip_ltm_pool.agent_lb_30443_pool, null_resource.sync_check]
A static list expression is required.
答案 0 :(得分:0)
显式依赖项是静态引用,而不是任意表达式。
depends_on = [
bigip_ltm_pool.agent_lb_443_pool,
bigip_ltm_pool.agent_lb_30443_pool,
null_resource.sync_check,
]
这里您需要做的是列出该资源所依赖的详尽资源集。这意味着Terraform将等到这三个条件全部完成后再对bigip_ltm_virtual_server.agent_vip
进行操作,这可能比严格需要的依赖要多,但是这些附加的依赖关系不会引起任何实际问题,因为此依赖关系图是保守的,这意味着它具有所需的所有依赖项,并且更多,而不是少于需要的依赖项。
在Terraform中表达这一点的惯用方式是尽可能通过引用使用隐式依赖关系。在这种情况下,您可以在pool
参数中使用引用来暗示对两个池的依赖性:
resource "bigip_ltm_virtual_server" "agent_vip" {
depends_on = [null_resource.sync_check]
description = "${var.cluster_name}.${var.domain}_443"
destination = var.agent_f5_ip_address
ip_protocol = "tcp"
name = "/Common/${var.cluster_name}.${var.domain}_443"
pool = var.use_traefik ? bigip_ltm_pool.agent_lb_443_pool.name : bigip_ltm_pool.agent_lb_30443_pool.name
port = 443
profiles = ["/Common/tcp"]
source_address_translation = "automap"
translate_address = "enabled"
translate_port = "enabled"
}
由于pool
参数同时引用了bigip_ltm_pool.agent_lb_443_pool
和bigip_ltm_pool.agent_lb_30443_pool
,因此Terraform可以自动推断出这些依赖关系。因此,null_resource.sync_check
中只能出现depends_on
,大概是因为该资源具有某种副作用,不能被描述为资源之间的数据流。