如何在脚本开始时在 terraform 中运行 null_resource

Posted

技术标签:

【中文标题】如何在脚本开始时在 terraform 中运行 null_resource【英文标题】:How to run a null_resource in terraform at the start of the script 【发布时间】: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/… 【参考方案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 的局部变量。这根本无法按预期工作。

以上是关于如何在脚本开始时在 terraform 中运行 null_resource的主要内容,如果未能解决你的问题,请参考以下文章

如何在 terraform 中运行 kubectl apply 命令

如何使用 terraform 将 aws ec2 私有 ips 传递给模板文件

Terraform Azure 流分析作业 - 开始/停止

如何从不同的文件夹运行 terraform init?

如何仅在代码第一次运行时在 python 中运行函数?

如何从 terraform 重新开始?