【问题标题】:Why do I get Call to function "file" failed: no file exists?为什么我调用函数“文件”失败:不存在文件?
【发布时间】:2020-06-01 19:30:13
【问题描述】:

我创建了一个简单的模块:

.
├── inputs.tf
└── main.tf

输入变量在inputs.tf中声明:

variable "workers" {
    type = number
    description = "Amount of spark workers"
}
variable "values_values_path" {}

main.tf 是:

resource "helm_release" "spark" {
    name       = "spark"
    repository = "https://charts.bitnami.com/bitnami" 
    chart      = "spark"
    version    = "1.2.21"
    namespace  = ...

    set {
        name  = "worker.replicaCount"
        value = var.workers
    }

    values = [
        "${file("${var.custom_values_path}")}"
    ]
}

如您所见,我正在尝试部署 helm 版本。我想设置一个参数化为custom_values_path的自定义值文件:

.
├── main.tf
├── provider.tf
└── spark-values.yaml

我的main.tf 是:

module "spark" {
    source = "../modules/spark"

    workers = 1
    custom_values_path = "./spark_values.yaml"
}

但是,我得到:

Error: Error in function call

  on ../modules/spark/main.tf line 14, in resource "helm_release" "spark":
  14:         "${file("${var.custom_values_path}")}"
    |----------------
    | var.custom_values_path is "./spark_values.yaml"

Call to function "file" failed: no file exists at spark_values.yaml.

完整的目录结构是:

.
├── stash
│   ├── main.tf
│   ├── provider.tf
│   └── spark-values.yaml
└── modules
    └── spark
        ├── inputs.tf
        └── main.tf

当我执行terraform plan 时,我在./stash

所以完整的命令应该是:

$ > cd ./stash $ stash > terraform 计划 错误:函数调用出错

  on ../modules/spark/main.tf line 14, in resource "helm_release" "spark":
  14:         "${file("${var.custom_values_path}")}"
    |----------------
    | var.custom_values_path is "./spark_values.yaml"

Call to function "file" failed: no file exists at spark_values.yaml.

为什么我调用函数“文件”失败:没有文件存在?

【问题讨论】:

    标签: terraform


    【解决方案1】:

    由于您是从子模块引用调用模块中的文件,因此您应该使用 path.module 提供基于调用模块路径的绝对路径,如下所示:

    module "spark" {
        source = "../modules/spark"
    
        workers = 1
        custom_values_path = "${path.module}/spark_values.yaml"
    }
    

    我建议不要在 Terraform 中跨模块边界引用文件。您最好将模块之间的依赖关系保留为变量,以免出现此类奇怪的问题。另一种方法是将整个文件作为变量提供(这就是 file 函数所做的)。

    module "spark" {
        source = "../modules/spark"
    
        workers = 1
        custom_values = file("${path.module}/spark_values.yaml")
    }
    

    然后修改您的 Spark 模块以期望 custom_values 的内容而不是文件的路径:

    resource "helm_release" "spark" {
        name       = "spark"
        repository = "https://charts.bitnami.com/bitnami" 
        chart      = "spark"
        version    = "1.2.21"
        namespace  = ...
    
        set {
            name  = "worker.replicaCount"
            value = var.workers
        }
    
        values = [
            var.custom_values
        ]
    }
    

    看着那个,我怀疑 values 参数需要 list(string) 所以你可能需要在 custom_values 上使用 yamldecode

    【讨论】:

      【解决方案2】:

      我认为我在这里发生的事情是相对路径的问题。您将变量传递给模块并相对于模块路径,文件spark_values.yaml 位于“../../stash/spark_values.yaml”。

      在使用file 模块时,我通常使用${path.module}。我将变量命名为文件名:spark_values.yaml。然后我会这样称呼它:file("${path.module}/${var.file_name}"。您能否再次检查这是否适用于您的情况?

      【讨论】:

        猜你喜欢
        • 2021-03-26
        • 2023-02-22
        • 1970-01-01
        • 2019-04-30
        • 1970-01-01
        • 2019-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多