Terraform 模块作为“自定义函数”

Posted

技术标签:

【中文标题】Terraform 模块作为“自定义函数”【英文标题】:Terraform module as "custom function" 【发布时间】:2022-01-13 18:55:45 【问题描述】:

可以使用一些本地模块来返回相同的计算输出。但是你怎么能传递一些参数呢?所以每次你会要求输出值你会根据参数得到不同的值(即不同的前缀)

是否可以将资源传递给模块并使用标签对其进行增强?

我可以想象这两种情况更可能是提供者的情况,但对于一些简单的情况,它也许应该有效。最好是他们实现了一些您可以随意调用的自定义函数。

【问题讨论】:

这取决于资源。无论如何,您都可以使用 local-exec 和自定义数据源做任何您想做的事情,所以一切皆有可能。 您能否详细说明如何根据每次不同的参数生成一些模块输出字符串?假设参数是一些需要在模块中加入的前缀和整数。 遗憾的是您没有提供任何示例,因此很难推测您想要实现什么。 我需要命名 Azure 资源组。所以我喜欢以某种方式创建模块,该模块的输出将用作创建资源的名称。这可能很简单,但名称需要包含一些变化的参数,也就是序列。所以我想调用类似module.output.name(sequence number) 的东西,它会输出包含序列的名称。我怎么能想象它工作的唯一方法是为每个序列创建模块并获取它的输出,但是非常冗长。 module.output.name(sequence number) 你不能那样做。 【参考方案1】:

原则上可以编写一个只包含“命名值”的 Terraform 模块,这是三个模块特性的广义术语Input Variables(类似于函数参数),Local Values(类似于内部的局部声明)你的函数)和Output Values(类似于返回值)。

这样的模块根本不包含任何resourcedata 块,因此将是一个“仅计算”模块,因此它具有与函数式编程语言中的函数相同的所有功能。

variable "a" 
  type = number


variable "b" 
  type = number


locals 
  sum = var.a + var.b


output "sum" 
  value = local.sum

上面的例子只是为了说明原理。这么简单的“函数”实际上并不需要本地值local.sum,因为它的表达式可以直接写在output "sum" 的值中,但我想在这里展示所有三个相关构造的示例。

您可以通过声明一个模块调用来“调用函数”,该模块调用引用包含包含上述源代码的文件的目录:

module "example" 
  source = "./modules/sum"

  a = 1
  b = 2


output "result" 
  value = module.example.sum

我在此处添加了output "result" 块,以展示如何在模块的其他位置引用“函数”的结果,如module.example.sum

当然,这种语法比典型的函数调用更“笨重”,因此在实践中,Terraform 模块作者只会在分解出的逻辑足够重要时才使用这种方法。不过,除了冗长之外,如果您需要使用不同的参数集调用“函数”,您可以根据需要包含尽可能多的引用同一模块的 module 块。对模块的每次调用都可以采用一组不同的输入变量值,因此会产生不同的结果。

【讨论】:

问题是我想获得不同的值而不需要创建新的和新的模块定义。但是像这样的接缝是它在 TF 中的工作方式,没有其他方法。想象一下,我想命名 20 个资源组,并且无法更改创建 20 个模块定义所需的输入。 是的,每个module 块代表对“函数”的一次调用。但是,如果您可以系统地表达您需要的所有调用,那么您可能会使用the for_each argument 编写单个module 块,这将有效地为您提供一个包含调用“函数”的各种不同结果的映射值。跨度> 你能详细说明一下for_each吗,到目前为止,我有一个带有map的输出,并且每个类型的命名都像这样'module.output.names["type"]'。我会调查 for_each。

以上是关于Terraform 模块作为“自定义函数”的主要内容,如果未能解决你的问题,请参考以下文章

pandas编写自定义函数使用apply函数应用自定义函数基于Series数据生成新的dataframe

Spark sql实现自定义函数

Spark sql实现自定义函数

Spark sql实现自定义函数

Spark sql实现自定义函数

作业6随笔