使用count或for_each在terraform中按顺序创建资源。可能?

时间:2020-09-04 16:01:20

标签: terraform

当我在资源定义中使用count或for_each时,将并行创建资源。 有一种变通方法可以使其按顺序进行?首先创建一个具有count.index = 0的资源,然后创建count.index = 1,然后再创建count.index = 2 e.t.c。

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

2 个答案:

答案 0 :(得分:0)

在我看来,您正在寻找一种方法来创建对各种资源的依赖关系,以便按您描述的顺序方式进行部署。在资源块中实现此目标的一种方法是使用Terraforms元参数depends_on(下面的链接)。这个元参数确实像听起来那样。它允许您在资源(资源A)中定义同一模块(资源B)中另一个资源的名称,以在执行之前完成。换句话说,直到资源B完成,资源A才启动。与for_eachcount

之类的循环结合使用时,我不确定行为

注意:Terraform建议将此作为最后的手段。查看其文档以获取更多详细信息。

https://www.terraform.io/docs/configuration/resources.html#depends_on-explicit-resource-dependencies

答案 1 :(得分:0)

因此,要使事情正常进行,就需要在其他地方存储一种状态。最简单的事情是使用文件:

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]
}

在此示例中,首先上传file_0.txt,然后上传file_1.txt,然后再上传file_2.txt。直到file_x.txt