这个不可读的 terraform 代码片段可以变得更像样吗?
Can this unreadable terraform code-snippet be made more presentable?
我有一个为 GKE 集群设置节点池名称的代码片段,它非常难读。我将不胜感激任何帮助,使其更形象,更容易理解正在发生的事情。
output "test" {
value = regex("(?:[a-z](?:[-a-z0-9]{0,38}[a-z0-9])?)", lower(var.node_pool_version != "" ? var.node_pool_name != "" ? "${var.node_pool_name}-v${replace("${var.node_pool_version}",".","-")}" : "${var.name_prefix}-v${replace("${var.node_pool_version}",".","-")}" : var.node_pool_name != "" ? var.node_pool_name : "${var.name_prefix}-standard"))
}
variable "node_pool_version" {
description = "Override node_version for cluster upgrades"
type = string
default = ""
}
variable "node_pool_name" {
type = string
default = ""
}
variable "name_prefix" {
type = string
default = "develop"
}
输出:
❯ terraform apply
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
test = develop-standard
❯ terraform apply -var node_pool_version=1.16.15-gke.7800
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
test = develop-v1-16-15-gke-7800
❯ terraform apply -var node_pool_version=1.16.15-gke.7800 -var node_pool_name=develop-standard
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
test = develop-standard-v1-16-15-gke-7800
编辑:
我担心的是广泛使用 String Functions
& Conditional Expressions
来生成输出。我的用例是,如果用户未通过 node_pool_version
或 node_pool_name
,我的输出仍应设法生成一个易于识别的节点名称。有没有更好的方法来重写此代码并使其对 Terraform 的新手更具可读性?
我想你能做的最好的事情就是使用 locals 块:
variable "node_pool_version" {
description = "Override node_version for cluster upgrades"
type = string
default = ""
}
variable "node_pool_name" {
type = string
default = ""
}
variable "name_prefix" {
type = string
default = "develop"
}
locals {
version = replace("${var.node_pool_version}", ".", "-")
prefix = var.node_pool_name != "" ? var.node_pool_name : var.name_prefix
id = var.node_pool_name != "" ? local.prefix : "${local.prefix}-standard"
versioned_id = local.version != "" ? "${local.prefix}-v${local.version}" : local.id
clean_versioned_id = regex("(?:[a-z](?:[-a-z0-9]{0,38}[a-z0-9])?)", lower(local.versioned_id))
}
output "test" {
value = local.clean_versioned_id
}
我有一个为 GKE 集群设置节点池名称的代码片段,它非常难读。我将不胜感激任何帮助,使其更形象,更容易理解正在发生的事情。
output "test" {
value = regex("(?:[a-z](?:[-a-z0-9]{0,38}[a-z0-9])?)", lower(var.node_pool_version != "" ? var.node_pool_name != "" ? "${var.node_pool_name}-v${replace("${var.node_pool_version}",".","-")}" : "${var.name_prefix}-v${replace("${var.node_pool_version}",".","-")}" : var.node_pool_name != "" ? var.node_pool_name : "${var.name_prefix}-standard"))
}
variable "node_pool_version" {
description = "Override node_version for cluster upgrades"
type = string
default = ""
}
variable "node_pool_name" {
type = string
default = ""
}
variable "name_prefix" {
type = string
default = "develop"
}
输出:
❯ terraform apply
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
test = develop-standard
❯ terraform apply -var node_pool_version=1.16.15-gke.7800
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
test = develop-v1-16-15-gke-7800
❯ terraform apply -var node_pool_version=1.16.15-gke.7800 -var node_pool_name=develop-standard
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
test = develop-standard-v1-16-15-gke-7800
编辑:
我担心的是广泛使用 String Functions
& Conditional Expressions
来生成输出。我的用例是,如果用户未通过 node_pool_version
或 node_pool_name
,我的输出仍应设法生成一个易于识别的节点名称。有没有更好的方法来重写此代码并使其对 Terraform 的新手更具可读性?
我想你能做的最好的事情就是使用 locals 块:
variable "node_pool_version" {
description = "Override node_version for cluster upgrades"
type = string
default = ""
}
variable "node_pool_name" {
type = string
default = ""
}
variable "name_prefix" {
type = string
default = "develop"
}
locals {
version = replace("${var.node_pool_version}", ".", "-")
prefix = var.node_pool_name != "" ? var.node_pool_name : var.name_prefix
id = var.node_pool_name != "" ? local.prefix : "${local.prefix}-standard"
versioned_id = local.version != "" ? "${local.prefix}-v${local.version}" : local.id
clean_versioned_id = regex("(?:[a-z](?:[-a-z0-9]{0,38}[a-z0-9])?)", lower(local.versioned_id))
}
output "test" {
value = local.clean_versioned_id
}