【问题标题】:Call to function "file" failed: no file exists - Terraform调用函数“文件”失败:不存在文件 - Terraform
【发布时间】:2021-03-26 17:37:41
【问题描述】:

我的 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.

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

【问题讨论】:

  • 这方面有什么帮助吗?

标签: terraform terraform-template-file


【解决方案1】:

the documentation for the file function 中包含您所看到行为的原因:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    注意:在 Terraform 0.12 及更早版本中,由于数据资源行为将读取延迟到应用阶段,当依赖于未知的值时,将 depends_on 与数据资源一起使用将强制读取始终延迟到apply 阶段,因此将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"]
      }
    }
    

    【讨论】:

    • 不,它不会在那里,正如我所提到的,它是在所有任务的中间创建的,但是 terraform 在开始阶段本身会搜索它。
    • 目前没有解决方法,“数据”资源在计划/应用开始时应用,因此需要存在才能使用它们。
    • 您可以尝试在此数据资源中创建依赖项,请参阅编辑后的帖子
    • 正如我在帖子中提到的,我已经这样做了,但无济于事。 :(
    • 如何创建文件?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 2022-01-25
    • 1970-01-01
    • 2020-12-18
    相关资源
    最近更新 更多