1

我的 terraform 代码中有一个template_file部分,其中有一个变量值可以从如下文件中选择

data "template_file" "post_sql"{
    template = "${file("/home/user/setup_template.yaml")}"
    vars = {
      name1= data.azurerm_storage_account.newazure_storage_data.name           
      name2="${file("/home/user/${var.newname}loca.txt")}"
    }    
}

该文件将在任务中间生成,但 terraform 在apply阶段本身开始时会查找它。我什depends_on至尝试添加无济于事并引发以下错误

Call to function "file" failed: no file exists at
/home/user/newnamerloca.txt.

我怎样才能使这项工作,对此的任何帮助将不胜感激

4

2 回答 2

0

您看到的行为的原因包含在file函数的文档中:

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

file函数旨在读取作为配置的一部分包含在磁盘上的文件,通常与.tf引用它们的文件位于同一目录中,并使用path.module符号指定路径,如下所示:

file("${path.module}/example.tmpl")

您的问题没有解释为什么要从用户的主目录而不是当前模块配置目录中读取文件,或者为什么在运行 Terraform 之前其中一个文件不存在,因此很难就如何继续。该文档提供local_file数据源作为可能的替代方案,但根据您的目标,它可能不是最佳方法。特别是,从当前模块外部读取本地磁盘上的文件通常表明将 Terraform 用于超出其预期范围的事情,因此完全使用不同的工具可能是最合适的。

于 2020-12-16T18:17:51.657 回答
0

试试“cat /home/user/newnamerloca.txt”,看看这个文件是否真的在那里。

编辑:目前没有解决方法,“数据”资源在计划/应用开始时应用,因此需要存在才能使用它们

数据资源具有与为托管资源定义的相同的依赖关系解析行为。在数据块中设置depends_on 元参数会延迟读取数据源,直到应用了对依赖项的所有更改。

注意:在 Terraform 0.12 及更早版本中,由于数据资源行为将读取延迟到应用阶段,当依赖于未知的值时,将 depends_on 与数据资源一起使用将强制读取始终延迟到应用阶段,因此,将depends_on 与数据资源一起使用的配置永远不会收敛。由于这种行为,我们不建议将depends_on 与数据资源一起使用。

所以也许是这样的:

data "template_file" "post_sql"{
    template = "${file("/home/user/setup_template.yaml")}"
    vars = {
      name1= data.azurerm_storage_account.newazure_storage_data.name           
      name2="${file("/home/user/${var.newname}loca.txt")}"
    }    
    depends_on = [null_resource.example1]
}

resource "null_resource" "example1" { # **create the file here**
  provisioner "local-exec" {
  command = "open WFH, '>completed.txt' and print WFH scalarlocaltime"
  interpreter = ["perl", "-e"]
  }
}
于 2020-12-16T11:45:37.330 回答