我创建了一个简单的模块:
.
├── 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.
为什么我无法调用函数“文件”:没有文件?
答案 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}"
。您能否再次检查是否适合您的情况?