gpt4 book ai didi

terraform - 我怎样才能克服 digitalocean 液滴上的 "Error: Cycle"

转载 作者:行者123 更新时间:2023-12-05 02:58:34 25 4
gpt4 key购买 nike

我确信这是一个简单的问题,我现在不知道如何解释它。

我使用 3 个 droplet(称为 rs)并有一个配置每个的模板文件。

[..]

data "template_file" "rsdata" {
template = file("files/rsdata.tmpl")
count = var.count_rs_nodes
vars = {
docker_version = var.docker_version
private_ip_rs = digitalocean_droplet.rs[count.index].ipv4_address_private
private_ip_mysql = digitalocean_droplet.mysql.ipv4_address_private
}
}

resource "digitalocean_droplet" "rs" {
count = var.count_rs_nodes
image = var.image
name = "${var.prefix}-rs-${count.index}"
region = var.region
size = var.rs_size
private_networking = true
user_data = data.template_file.rsdata.rendered
ssh_keys = var.ssh_keys
depends_on = ["digitalocean_droplet.mysql"]
}

[..]

当我执行 terraform apply 时,我得到:错误:循环:digitalocean_droplet.rs、data.template_file.rsdata

注意这是 terraform 0.12

请问我做错了什么,我该如何克服?

最佳答案

返回此错误是因为 data.template_file.rsdata 资源引用了 digitalocean_droplet.rs 资源,反之亦然。这为 Terraform 造成了不可能的情况:Terraform 无法使用任何顺序来处理这些数据,以确保所有必要的数据在每一步都可用。

关键问题是 droplet 的私有(private) IPv4 地址是在创建它时分配的,但是 user_data 用作该创建的一部分,因此它不能包含 IPv4 地址尚未分配。

处理此问题最直接的方法是将 droplet 的 IP 地址作为其 user_data 的一部分,而是安排正在处理该 user_data 在运行时直接从网络接口(interface)获取主机的 IP 地址。在该 droplet 中运行的内核将知道 IP 地址是什么,因此原则上您可以从那里检索它。


如果出于某种原因,在 user_data 中包含 IP 地址是不可避免的(这可能会发生,例如,如果有一组虚拟机都需要知道每个other) 那么一个更复杂的替代方案是将 IP 地址的分配与实例的创建分开。 DigitalOcean 没有创建与其所属的 droplet 分开的私有(private) 网络接口(interface)的机制,因此在这种情况下,有必要通过 digitalocean_floating_ip 使用公共(public) IP 地址,这可能并不适合所有情况:

resource "digitalocean_floating_ip" "rs" {
count = var.count_rs_nodes

region = var.region
}

resource "digitalocean_droplet" "rs" {
count = var.count_rs_nodes

image = var.image
name = "${var.prefix}-rs-${count.index}"
region = var.region
size = var.rs_size
private_networking = true
ssh_keys = var.ssh_keys
user_data = templatefile("${path.module}/files/rsdata.tmpl", {
docker_version = var.docker_version
private_ip_rs = digitalocean_floating_ip.rs[count.index].ip_address
private_ip_mysql = digitalocean_droplet.mysql.ipv4_address_private
})
}

resource "digitalocean_floating_ip_assignment" "rs" {
count = var.count_rs_nodes

ip_address = digitalocean_floating_ip.rs[count.index].ip_address
droplet_id = digitalocean_droplet.rs[count.index].id
}

因为“ float IP 分配”是在 droplet 启动后作为一个单独的步骤创建的,在 float IP 与实例关联之前会有一些延迟,因此任何依赖该 IP 地址的软件都必须具有弹性在创建关联之前运行。

请注意,我还从使用 data "template_file" 切换到了 the templatefile function因为提供数据源只是为了向后兼容 Terraform 0.11 配置;内置函数是在 Terraform 0.12 中呈现外部模板文件的推荐方式,并且避免了对单独配置 block 的需要。

关于terraform - 我怎样才能克服 digitalocean 液滴上的 "Error: Cycle",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58886245/

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