Terraform:depends_on参数不首先创建指定的资源

Nee*_*mar 4 terraform

我想将 terraform 状态文件推送到 github 存储库。Terraform 中的文件函数无法读取 .tfstate 文件,因此我需要先将其扩展名更改为 .txt。现在为了自动化它,我创建了一个空资源,它有一个配置程序来运行命令以将 tfstate 文件复制为同一目录中的 txt 文件。我遇到了这个“depends_on”参数,它可以让您指定在运行当前资源之前是否需要首先创建特定资源。但是,它不起作用,我立即收到错误消息,当文件函数需要它时,“terraform.txt”文件不会退出。

provider "github" {
  token = "TOKEN"
  owner = "USERNAME"
}

resource "null_resource" "tfstate_to_txt" {
  provisioner "local-exec" {
    command = "copy terraform.tfstate terraform.txt"
  }
}

resource "github_repository_file" "state_push" {
  repository = "TerraformStates"
  file       = "terraform.tfstate"
  content    = file("terraform.txt")

  depends_on = [null_resource.tfstate_to_txt]
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ins 9

file函数的文档解释了此行为:

此函数只能用于 Terraform 运行开始时磁盘上已存在的文件。函数不参与依赖关系图,因此此函数不能与 Terraform 操作期间动态生成的文件一起使用。我们不建议在 Terraform 配置中使用动态本地文件,但在极少数有必要的情况下,您可以使用数据local_file读取文件,同时尊重资源依赖性。

本段还包括有关如何获得所需结果的建议:使用来自提供local_file的数据源,将文件读取为资源操作(在应用阶段),而不是作为配置加载的一部分:hashicorp/local

resource "null_resource" "tfstate_to_txt" {
  triggers = {
    source_file = "terraform.tfstate"
    dest_file   = "terraform.txt"
  }

  provisioner "local-exec" {
    command = "copy ${self.triggers.source_file} ${self.triggers.dest_file}"
  }
}

data "local_file" "state" {
  filename = null_resource.tfstate_to_txt.triggers.dest_file
}

resource "github_repository_file" "state_push" {
  repository = "TerraformStates"
  file       = "terraform.tfstate"
  content    = data.local_file.state.content
}
Run Code Online (Sandbox Code Playgroud)

请注意,虽然上面应该得到您所询问的操作顺序,但terraform.tfstate在 Terraform 运行时读取文件是一件非常不寻常的事情,并且可能会导致未定义的行为,因为 Terraform 可以在整个过程中在不可预测的时刻重复更新该文件terraform apply

如果您的目的是让 Terraform 将状态保存在远程系统而不是本地磁盘上,则实现此目的的常用方法是配置远程状态,这将导致 Terraform远程保存状态,而不使用本地terraform.tfstate文件根本不。


Mon*_*ina 6

depends_on并不真正适用于null_resource.provisioner.

这是一个可以帮助您的解决方法:

   resource "null_resource" "tfstate_to_txt" {
        provisioner "local-exec" {
        command = "copy terraform.tfstate terraform.txt"
         }
       }
        
   resource "null_resource" "delay" {
        provisioner "local-exec" {
            command = "sleep 20"
         }
        triggers = {
            "before" = null_resource.tfstate_to_txt.id
         }
        }
  resource "github_repository_file" "state_push" {
        repository = "TerraformStates"
        file       = "terraform.tfstate"
        content    = file("terraform.txt")
        depends_on = ["null_resource.delay"]
       }       


   
Run Code Online (Sandbox Code Playgroud)

如果复制命令需要更多时间,则延迟空资源将确保资源 2 在第一个资源之后运行,只需将睡眠更改为更高的数字