为什么我收到对“文件”函数的调用失败:没有文件?

时间:2020-06-01 07:50:33

标签: terraform

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

.
├── 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}")}"
    ]
}

如您所见,我正在尝试部署头盔版本。我想设置一个自定义值文件,参数化为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>地形计划 错误:函数调用错误

  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.

为什么我无法调用函数“文件”:没有文件?

2 个答案:

答案 0 :(得分:7)

由于您是在子模块中引用调用模块中的文件,因此应使用 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

答案 1 :(得分:1)

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

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