gpt4 book ai didi

Terraform 在应用时触发循环错误

转载 作者:行者123 更新时间:2023-12-05 02:03:26 24 4
gpt4 key购买 nike

我正在尝试使用 terraform 构建一个 galera 集群。为此,我需要使用节点 ip 渲染 galera 配置,因此我使用了一个文件模板。

应用时,terraform 会引发错误

Error: Cycle: data.template_file.galera_node_config, hcloud_server.galera_node

申请时好像是循环引用,因为在使用数据模板之前没有创建服务器。

我怎样才能避免这种情况?

谢谢

galera_node.tf
data "template_file" "galera_node_config" {
template = file("sys/etc/mysql/mariadb.conf/galera.cnf")

vars = {
galera_node0 = hcloud_server.galera_node[0].ipv4_address
galera_node1 = hcloud_server.galera_node[1].ipv4_address
galera_node2 = hcloud_server.galera_node[2].ipv4_address
curnode_ip = hcloud_server.galera_node[count.index].ipv4_address
curnode = hcloud_server.galera_node[count.index].id
}
}


resource "hcloud_server" "galera_node" {
count = var.galera_nodes
name = "galera-${count.index}"
image = var.os_type
server_type = var.server_type
location = var.location
ssh_keys = [hcloud_ssh_key.default.id]

labels = {
type = "cluster"
}

user_data = file("galera_cluster.sh")

provisioner "file" {
content = data.template_file.galera_node_config.rendered
destination = "/tmp/galera_cnf"
connection {
type = "ssh"
user = "root"
host = self.ipv4_address
private_key = file("~/.ssh/id_rsa")
}

}



}

最佳答案

这里的问题是您有多个相互依赖的节点,因此 Terraform 没有有效的顺序来创建它们:它们必须在创建任何其他节点之前全部创建。

要解决这个问题,需要采用不同的方法。为此有几个不同的选项,但似乎最接近您已经尝试的选项是使用特殊资源类型 null_resource 将配置分解为 Terraform 可以处理的单独资源仅在所有 hcloud_server 实例准备就绪后。

另请注意,template_file 数据源已弃用,取而代之的是 the templatefile function ,因此这是一个通过使用该函数来简化配置的好机会。

这两个变化共同导致了这一点:

resource "hcloud_server" "galera_node" {
count = var.galera_nodes
name = "galera-${count.index}"
image = var.os_type
server_type = var.server_type
location = var.location
ssh_keys = [hcloud_ssh_key.default.id]

labels = {
type = "cluster"
}

user_data = file("galera_cluster.sh")
}

resource "null_resource" "galera_config" {
count = length(hcloud_server.galera_node)

triggers = {
config_file = templatefile("${path.module}/sys/etc/mysql/mariadb.conf/galera.cnf", {
all_addresses = hcloud_server.galera_node[*].ipv4_address
this_address = hcloud_server.galera_node[count.index].ipv4_address
this_id = hcloud_server.galera_node[count.index].id
})
}

provisioner "file" {
content = self.triggers.config_file
destination = "/tmp/galera_cnf"
connection {
type = "ssh"
user = "root"
host = hcloud_server.galera_node[count.index].ipv4_address
private_key = file("~/.ssh/id_rsa")
}
}
}

上面的 triggers 参数用于告诉 Terraform 它必须在每次配置文件以任何方式发生变化时重新运行配置器,例如,这可能是因为您添加了一个新节点:然后将重新配置所有现有节点,以在其配置中包含该附加节点。

Provisioners are considered a last resort在 Terraform 文档中,但在这种特殊情况下,备选方案可能要复杂得多。一个典型的非供应商对此的回答是使用服务发现系统,其中每个节点都可以在启动时注册自己,然后发现其他节点,例如 HashiCorp Consul。的服务目录。但是,除非您的基础设施中有很多类似的用例,它们都可以共享 Consul 集群,否则与仅使用供应商相比,必须运行另一项服务可能是不合理的成本。

关于Terraform 在应用时触发循环错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65250228/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com