Terraform:依赖于参数,而不是首先创建指定的资源

Terraform:依赖于参数,而不是首先创建指定的资源,terraform,Terraform,我想将terraform状态文件推送到github repo。Terraform中的file函数无法读取.tfstate文件,因此我需要先将其扩展名更改为.txt。现在为了实现自动化,我创建了一个空资源,它有一个provisioner来运行命令,将tfstate文件复制为同一目录中的txt文件。我遇到了这个“depends_on”参数,它允许您指定在运行当前资源之前是否需要首先生成特定资源。但是,它不起作用,我马上就得到了一个错误,即当文件函数需要时,“terraform.txt”文件没有退出

我想将terraform状态文件推送到github repo。Terraform中的file函数无法读取.tfstate文件,因此我需要先将其扩展名更改为.txt。现在为了实现自动化,我创建了一个空资源,它有一个provisioner来运行命令,将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]
}

dependens\u on
不能真正与
null\u资源一起工作。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"]
       }       


   

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

取决于
实际上不适用于
空资源。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"]
       }       


   
如果copy命令需要更多时间,则delay null资源将确保资源2在第一个之后运行。只需将睡眠更改为更高的数字即可解释此行为:

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

本段还包括如何获得所需结果的建议:使用
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
}

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

如果您的目的是让Terraform将状态保留在远程系统而不是本地磁盘上,通常的方法是进行配置,这将导致Terraform仅远程保留状态,而不使用本地
Terraform.tfstate
文件。

解释了此行为:

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

本段还包括如何获得所需结果的建议:使用
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
}

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


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

将状态文件添加到git repo(希望不是公共的)这不是一个好的做法。你能说明你想要实现什么吗?“也许有更好的办法吗?”马金:是的,这是私人回购。我只想在把东西推到git之前在terraform中运行一个脚本。它可以是任何不一定是tfstate的文件。将状态文件添加到git repo(希望不是公共的)不是一个好做法。你能说明你想要实现什么吗?“也许有更好的办法吗?”马金:是的,这是私人回购。我只想在把东西推到git之前在terraform中运行一个脚本。它可以是不一定是tfstate的任何文件。