kubernetes - 用于重新部署的 Terraform ConfigMap 哈希
问题描述
我正在将 Terraform 与 Kubernetes Provider 一起使用。现在在创建ConfigMap时,我希望它们的名称具有内容后缀。通常它是内容的哈希值。
这样,它应该在使用时强制执行部署。
所以我希望它的工作类似于:
resource "kubernetes_config_map" "prometheus_config" {
metadata {
name = "prometheus-" + computeHash(file("${path.module}/alerts.yml"), file("${path.module}/recordings.yml"), "abcd")
}
data = {
"foo" = file("${path.module}/alerts.yml")
"bar" = file("${path.module}/recordings.yml")
"txt" = "abcd"
}
}
有什么方法可以实现自定义功能computeHash
吗?或者以另一种方式实现这一目标?
解决方案
在 Terraform中无法实现自定义哈希函数,但 Terraform 有许多内置函数可以实现不同的标准哈希函数。
例如,要使用 base64 编码的 SHA256 哈希,您可以使用函数编写如下内容base64sha256
:
name = "prometheus-" + base64sha256(join("\n", [
file("${path.module}/alerts.yml"),
file("${path.module}/recordings.yml"),
"abcd",
])
因为该file
函数返回一个字符串,所以所有引用的文件都必须包含有效的 UTF-8 文本。然后哈希将是文件中 unicode 字符的 UTF-8 编码。
的文档页面base64sha256
包括指向各种其他“哈希和加密函数”的导航链接,其中一些实现了其他哈希算法。
如果您的目标是仅包含data
地图中的所有内容,则可以通过将其分解为本地值然后散列地图的字符串表示形式来避免重复,例如 JSON 序列化:
locals {
prometheus_config = {
"foo" = file("${path.module}/alerts.yml")
"bar" = file("${path.module}/recordings.yml")
"txt" = "abcd"
}
}
resource "kubernetes_config_map" "prometheus_config" {
metadata {
name = "prometheus-" + base64sha256(jsonencode(local.prometheus_config))
}
data = local.prometheus_config
}
推荐阅读
- ruby - Ruby net/http PUT 请求中的流式数据
- powershell - 如何在 PowerShell Core (pwsh) 中查找或安装缺少的命令?
- javascript - 单击多个元素相同的类名
- python - 在循环中在python中传递多个参数
- php - 如何在symfony中显示数组关系ManyToMany
- java - VS 中的发布模式和调试模式
- reactjs - 通过 react-helmet 添加脚本标签时如何忽略 TypeScript 错误?
- javascript - 正则表达式检查具有最小值和最大值的总位数
- yii2 - 使用 Cloudflare 背后的 Yii2 访问规则来限制 ips 的操作
- laravel - 分组后计数错误