在terraform中连续创建资源,每个资源都有count或for_。可能的

在terraform中连续创建资源,每个资源都有count或for_。可能的,terraform,Terraform,当我在资源定义中使用count或for_时,资源是并行创建的。 是否有一种解决方法可以使其顺序化?首先创建count.index=0的资源,然后创建count.index=1,然后创建count.index=2的e.t.c 有点背景。。。 我正在使用terraform进行Hyperledger结构的初始设置。对于某些任务,我需要按顺序进行区块链网络的配置更新(如批准参与组织的链码)。否则我会得到(MVCC_READ_CONFLICT)。 如果我将此逻辑完全外包给某个bash脚本,当然可以实现这一

当我在资源定义中使用count或for_时,资源是并行创建的。 是否有一种解决方法可以使其顺序化?首先创建count.index=0的资源,然后创建count.index=1,然后创建count.index=2的e.t.c

有点背景。。。 我正在使用terraform进行Hyperledger结构的初始设置。对于某些任务,我需要按顺序进行区块链网络的配置更新(如批准参与组织的链码)。否则我会得到(MVCC_READ_CONFLICT)。
如果我将此逻辑完全外包给某个bash脚本,当然可以实现这一点,但可能…

我觉得您正在寻找一种方法来创建对各种资源的依赖关系,以便按照您描述的顺序部署它们。在资源块中实现这一点的一种方法是使用Terraforms元参数
取决于
(下面的链接)。这个元参数的作用和它听起来的完全一样。它允许您在资源(资源A)中定义同一模块(资源B)中另一个资源的名称,以便在执行之前完成。换句话说,在完成资源B之前,资源A不会启动。当与循环一起使用时,例如
for\u each
count

注意:Terraform建议将此作为最后手段。查看他们的文档以了解更多详细信息


因此,要使事情正常运行,需要在别处存储一种状态。最简单的方法是使用文件:

resource "null_resource" "set_initial_state" {
    provisioner "local-exec" {
        interpreter = ["bash", "-c"]
        command = "echo \"0\" > current_state.txt"
    }
}
第二个资源在开始时实现等待循环,在结束时实现状态更改:

resource "null_resource" "sequential_resources" {
    count = var.x
    provisioner "local-exec" {
        interpreter = ["bash", "-c"]
        command = "while [[ $(cat current_state.txt) != \"${count.index}\" ]]; do echo \"${count.index} is waiting...\";sleep 5;done"
    }

# Here you pack your sequential logic, e.g. upload of files to a service, 
# that can handle only one file at once.

    provisioner "file" {
        connection {
                type     = "ssh"
                host     = var.ip_address
                private_key = file(var.config.private_key)
                user     = var.config.admin_username
                script_path = var.provisioner_script_path
        }
        source = "${var.local_folder}/file_${count.index}.txt"
        destination = "/opt/data/file_${count.index}.txt"
    }

    provisioner "local-exec" {
        interpreter = ["bash", "-c"]
        command = "echo \"${count.index+1}\" > current_state.txt"
    }

depends_on = [null_resource.set_initial_state]
}

在这个例子中,先上传文件0.txt,然后上传文件1.txt,然后上传文件2.txt e.t.c,直到文件x.txt

我很确定没有地形特性,但当我在谷歌上搜索MVCC_READ_CONFLICT,看看它是否意味着我认为它意味着什么时,我发现对您的特定场景有各种讨论,可能会有所帮助。不是真的。我有很多相似的资源,它们以一种无法比拟的方式相互依赖。今天我有3个明天50个。如果我将它们定义为不同的资源,并且使用取决于,那么在更改编号时,我必须修改每个资源的代码库。但这是可行的。如果我使用count,我只需要更改一个变量。但在这种情况下,所有50个资源同时创建。terraform之外的逻辑就像所有现有资源都批准添加新资源一样,但他们可以一次添加一个,而不是3个或50个。这是有道理的。我不确定使用循环时它将如何工作。根据dependens_on的文档,您不能使用任意表达式作为值,因此动态定义依赖关系可能是一个问题。我不知道还有什么其他方法可以实现你所做的。通常,当我遇到这样一堵墙时,通常意味着是时候重新考虑我解决问题的方法了。