【问题标题】:How to run a null_resource in terraform at the start of the script如何在脚本开始时在 terraform 中运行 null_resource
【发布时间】:2021-04-05 04:01:27
【问题描述】:

我有一个用例,我从 terraform 中的本地人获取所有变量,如下所示,但在此之前,我想运行一个 null_resource 块,它将运行 python 脚本并将所有数据更新到本地文件中。

所以简单来说我的用例是在 terraform 脚本的开头执行一个 null_resource 块,然后运行所有其他资源块

我目前的代码示例如下:

// executing script for populating data in app_config.json
resource "null_resource" "populate_data" {
  provisioner "local-exec" {
    command = "python3 scripts/data_populate.py"
  }
}


// reading data variables from app_config.json file
locals {
  config_data = jsondecode(file("${path.module}/app_config.json"))
}

我如何做到这一点?我所尝试的只是在 locals 中添加一个 triggers 命令,如下所示,但即使这样也没有用。

locals {
  triggers = {
    order = null_resource.populate_data.id
  }
  
  config_data = jsondecode(file("${path.module}/app_config.json"))
}

【问题讨论】:

  • 您应该在运行实际的 terraform 命令之前将 terraform 命令包装在触发 python 脚本的 shell 脚本中。您想要实现的不是应该使用什么/如何使用 terraform。除非您更详细地解释脚本的作用、它生成的数据如何与部署的其余部分交互、依赖于它的资源等等。
  • 你的意思是说我无法在 terraform 脚本的开头执行 null_resource 块,因为那是我的用例?
  • 有一种方法,根据时间戳触发null_resource,然后为每个资源添加depends_on关系,以便它们等待null_resource完成。不理想也不好玩。你不应该那样做。首选方法是围绕它包装一个脚本,或者为 python 脚本创建一个自定义数据源,然后显式依赖该脚本输出,而不是写入文件并在其他地方从文件中读取。跨度>
  • 您可以使用外部数据源以更简单的方式完成所有这些操作:registry.terraform.io/providers/hashicorp/external/latest/docs/…

标签: terraform terraform-provider-aws terraform0.12+ terraform-template-file


【解决方案1】:

您可以使用depends_on

resource "null_resource" "populate_data" {
  provisioner "local-exec" {
    command = "python3 scripts/data_populate.py"
  }
}


// reading data variables from app_config.json file
locals {
  depends_on = [null_resource.populate_data]
  config_data = jsondecode(file("${path.module}/app_config.json"))
}

现在locals 将始终在populate_data 之后执行。

【讨论】:

  • 我很确定 locals 的一个特性不是在那里有一个 depends_on 语句,它实际上会导致一个depends_on 关系并且不只是定义一个名为depends_on 的局部变量。这根本无法按预期工作。
猜你喜欢
  • 1970-01-01
  • 2021-12-07
  • 2020-03-22
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
  • 2020-01-01
  • 2020-11-06
相关资源
最近更新 更多