terraform - terraform:模块变量作为对象
问题描述
这是我的模块片段:
inputs.tf
:
variable "namespace" {
type = object({
metadata = object({
name = string
})
})
}
main.tf
:
resource "helm_release" "spark" {
name = "spark"
repository = "https://charts.bitnami.com/bitnami"
chart = "spark"
version = "1.2.21"
namespace = var.namespace.metadata.name
}
如您所见,我正在尝试访问以前创建kubernetes_namespace
的 .
进入我的环境工作区:
resource "kubernetes_namespace" "this" {
metadata {
name = var.namespace
}
}
module "spark" {
source = "../modules/spark"
namespace = kubernetes_namespace.this
workers = 1
}
当我尝试制定计划时,我收到了这条消息:
➜ development terraform plan | xclip -selection clipboard
Error: Invalid value for module argument
on main.tf line 14, in module "spark":
14: namespace = kubernetes_namespace.this
The given value is not suitable for child module variable "namespace" defined
at ../modules/spark/inputs.tf:1,1-21: attribute "metadata": object required.
有任何想法吗?
解决方案
该错误报告您分配给namespace
变量的值与其类型约束不兼容。
的metadata
属性kubernetes_namespace
似乎被定义为对象列表而不是单个对象,因此这里的自动类型转换是不可能的。您可以在此处进行的一种方法是更改变量的类型以匹配资源类型架构,如下所示:
variable "namespace" {
type = object({
metadata = list(object({
name = string
}))
})
}
我们可以在提供程序实现中看到,该块被定义为具有MaxItems: 1
,因此只要它仍然正确(这似乎很可能),您就可以期望var.namespace.metadata
它是一个空列表或单项列表,您可以在本地编写变量以便在模块的其他地方更容易使用:
locals {
namespace_name = var.namespace.metadata[0].name
}
以上将local.namespace_name
引用给定的命名空间名称,或者如果给定的命名空间没有metadata
块,则表达式将失败,因为在这种情况下将没有元素[0]
。
以上只是为了访问命名空间名称而变得非常复杂。如果您希望将来需要使用对象的其他属性,则上述结构可能很有用kubernetes_namespace
,但如果您可以仅使用名称,那么将其简化为单个字符串变量可能会有所帮助命名空间名称直接:
variable "namespace_name" {
type = string
}
...您可以让调用者担心如何获取该名称:
resource "kubernetes_namespace" "this" {
metadata {
name = var.namespace
}
}
module "spark" {
source = "../modules/spark"
namespace_name = kubernetes_namespace.this.metadata.name
workers = 1
}
推荐阅读
- yocto - 使用 yocto 发行版的 bitbake 编译颤振桌面应用程序
- javascript - 页面在 Django 中加载很慢
- javascript - null 在尾递归函数中被分配为对象
- java - 删除字符串中不需要的字符
- powerbi - DAX如何返回第N个选定的项目
- php - 如何使用 Eloquent Laravel 在多选中显示数据
- javascript - 如何从文件夹动态加载图像,而不是在数组中输入每个图像名称?
- r - 如何使用 predict.glm() 对未中心化的术语预测进行评分
- list - Python TypeError: 'tuple' object is not callable 我正在尝试遍历 len(list) 但它给了我这个错误
- javascript - D3 总是合并节点,即使是相同的数据