【问题标题】:terraform how to properly implement delay with time_sleep resourceterraform 如何使用 time_sleep 资源正确实现延迟
【发布时间】:2021-11-29 07:59:25
【问题描述】:

由 terraform 创建后创建的资源会占用创建它的集群上的 CPU/RAM, 因此在创建同一集群上的下一个资源之前需要某种延迟。

作为实现这一目标的一个选项,决定使用 time_sleep terraform 资源来实现 创建资源之前的一些延迟。

还决定使用-parallelism=1,以便资源一个一个地创建。

假设我们有一个模块(尽可能简单):

模块测试,main.tf

resource "time_sleep" "wait_3_seconds" {
  create_duration = "3s"
}

resource "null_resource" "topic_events" {
  triggers = {
    always_run = timestamp()
    topic = var.topic_name
  }
  depends_on = [time_sleep.wait_3_seconds]
}

模块测试,变量.tf

variable topic_name {}

主模块调用模块测试(见上文):

module "test" {
  for_each= tomap(var.environments[var.dim_arr].clusters.events.topics)
  source = "./test"
  topic_name = "${var.dim_arr}.${each.value.topic}"
}

逻辑是在循环中处理输入值,但由于 time_sleep 测试模块中的资源在这个循环中引入了一些延迟,这反过来又 应该会减少服务器的负载。

但是 terraform 尝试在嵌套模块中创建所有 time_sleep 资源 然后遍历主模块中的对象并以这种方式创建它们:

a) 创建所有 time_sleep 资源

b) 所有依赖于它们的资源(参见 a))都被创建

有什么办法可以改变这个逻辑,让

-创建使用时间睡眠的资源

-time_sleep 资源导致延迟以减少集群负载

-处理循环中的下一个对象

欢迎提出任何建议或想法。

谢谢。

【问题讨论】:

  • TF 是声明性编程语言,而不是程序性语言。您正在尝试做的只是现在 TF 的设计方式。为什么不使用其他 IoC 工具来让您正确地做自己想做的事?
  • 我有一个 for_each 循环。在这个循环中处理资源,但是不是循环 terraform 将工作拆分为 2 个部分(忽略depends_on)并创建第一部分,然后将其链接到第二部分,而不是创建任何一个 time_sleep 资源的资源实现我想要实现的目标。
  • 我只是在测试一些东西,depends_on 非常严格,我们几乎无能为力我尝试使用for_each 创建两个模块,并在它们之间使用索引depends_on = [module.test2[each.key]] 但不允许,它与A single static variable reference is required: only attribute access and indexing with constant keys. No calculations, function calls, template expressions, etc are allowed here 出错

标签: foreach terraform delay


【解决方案1】:

我发现的唯一方法是使用外部源来确定是否该运行,否则我们等待,模块中的所有其他资源将不得不依赖此等待或依赖于等待的其他资源...

我这里有代码:
https://github.com/heldersepu/hs-scripts/tree/master/TerraForm/sequential_wait

我们的想法是创建一个文件,该文件将为我们记录现在正在运行的人以及其他所有人都在等待,我正在使用空资源创建文件:

resource "null_resource" "set_initial_state" {
  provisioner "local-exec" {
    interpreter = ["bash", "-c"]
    command = "echo \"0\" > counter"
  }
}

然后在您的模块中,我们检查该文件并等待:

resource "null_resource" "wait" {
  provisioner "local-exec" {
    interpreter = ["bash", "-c"]
    command = "while [[ $(cat counter) != \"${var.index}\" ]]; do sleep 5; done; sleep 3;"
  }
}

这是terraform apply的输出

module.test["3"].null_resource.wait: Creating...
module.test["0"].null_resource.wait: Creating...
module.test["2"].null_resource.wait: Creating...
null_resource.set_initial_state: Creating...
module.test["1"].null_resource.wait: Creating...
module.test["2"].null_resource.wait: Provisioning with 'local-exec'...
module.test["0"].null_resource.wait: Provisioning with 'local-exec'...
module.test["2"].null_resource.wait (local-exec): Executing: ["bash" "-c" "while [[ $(cat counter) != \"2\" ]]; do sleep 5; done; sleep 3;"]
module.test["3"].null_resource.wait: Provisioning with 'local-exec'...
module.test["3"].null_resource.wait (local-exec): Executing: ["bash" "-c" "while [[ $(cat counter) != \"3\" ]]; do sleep 5; done; sleep 3;"]
null_resource.set_initial_state: Provisioning with 'local-exec'...
null_resource.set_initial_state (local-exec): Executing: ["bash" "-c" "echo \"0\" > counter"]
module.test["0"].null_resource.wait (local-exec): Executing: ["bash" "-c" "while [[ $(cat counter) != \"0\" ]]; do sleep 5; done; sleep 3;"]
null_resource.set_initial_state: Creation complete after 0s [id=8614789881521489088]
module.test["1"].null_resource.wait: Provisioning with 'local-exec'...
module.test["1"].null_resource.wait (local-exec): Executing: ["bash" "-c" "while [[ $(cat counter) != \"1\" ]]; do sleep 5; done; sleep 3;"]
module.test["0"].null_resource.wait: Creation complete after 3s [id=2055094284904046261]
module.test["0"].null_resource.test: Creating...
module.test["0"].null_resource.test: Provisioning with 'local-exec'...
module.test["0"].null_resource.test (local-exec): Executing: ["bash" "-c" "date"]
module.test["0"].null_resource.test (local-exec): Tue Nov 30 14:02:16 EST 2021
module.test["0"].null_resource.test: Creation complete after 0s [id=4696397823999126287]
module.test["0"].null_resource.inc: Creating...
module.test["0"].null_resource.inc: Provisioning with 'local-exec'...
module.test["0"].null_resource.inc (local-exec): Executing: ["bash" "-c" "echo \"1\" > counter"]
module.test["0"].null_resource.inc: Creation complete after 0s [id=6621987075727255534]
module.test["1"].null_resource.wait: Creation complete after 8s [id=8925579995767074961]
module.test["1"].null_resource.test: Creating...
module.test["1"].null_resource.test: Provisioning with 'local-exec'...
module.test["1"].null_resource.test (local-exec): Executing: ["bash" "-c" "date"]
module.test["1"].null_resource.test (local-exec): Tue Nov 30 14:02:21 EST 2021
module.test["1"].null_resource.test: Creation complete after 0s [id=5320532609227697061]
module.test["1"].null_resource.inc: Creating...
module.test["1"].null_resource.inc: Provisioning with 'local-exec'...
module.test["1"].null_resource.inc (local-exec): Executing: ["bash" "-c" "echo \"2\" > counter"]
module.test["1"].null_resource.inc: Creation complete after 0s [id=5315818672844469230]
module.test["2"].null_resource.wait: Still creating... [10s elapsed]
module.test["3"].null_resource.wait: Still creating... [10s elapsed]
module.test["2"].null_resource.wait: Creation complete after 13s [id=3209055618166905619]
module.test["2"].null_resource.test: Creating...
module.test["2"].null_resource.test: Provisioning with 'local-exec'...
module.test["2"].null_resource.test (local-exec): Executing: ["bash" "-c" "date"]
module.test["2"].null_resource.test (local-exec): Tue Nov 30 14:02:26 EST 2021
module.test["2"].null_resource.test: Creation complete after 0s [id=4919718470589558801]
module.test["2"].null_resource.inc: Creating...
module.test["2"].null_resource.inc: Provisioning with 'local-exec'...
module.test["2"].null_resource.inc (local-exec): Executing: ["bash" "-c" "echo \"3\" > counter"]
module.test["2"].null_resource.inc: Creation complete after 0s [id=1455157426309278256]
module.test["3"].null_resource.wait: Creation complete after 18s [id=8455991137394172301]
module.test["3"].null_resource.test: Creating...
module.test["3"].null_resource.test: Provisioning with 'local-exec'...
module.test["3"].null_resource.test (local-exec): Executing: ["bash" "-c" "date"]
module.test["3"].null_resource.test (local-exec): Tue Nov 30 14:02:31 EST 2021
module.test["3"].null_resource.test: Creation complete after 0s [id=3412367143530453609]
module.test["3"].null_resource.inc: Creating...
module.test["3"].null_resource.inc: Provisioning with 'local-exec'...
module.test["3"].null_resource.inc (local-exec): Executing: ["bash" "-c" "echo \"4\" > counter"]
module.test["3"].null_resource.inc: Creation complete after 0s [id=4184091859253605007]

Apply complete! Resources: 13 added, 0 changed, 0 destroyed.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 2022-10-18
    • 1970-01-01
    • 2018-08-03
    相关资源
    最近更新 更多