问题描述
我最近开始使用 Google Cloud Deployment,来自 AWS CloudFormation(和 terraform),我真的很难以动态的方式使用 Jinja,而我在其他方面的做法却很简单。
我目前的问题是,我的部署完全是基于某些用户输入的动态,因此在 AWS CF 和 terraform(同时指向 AWS 和 GCP)中,我使用地图来获取由先前选择确定的设置。以下是 terraform 的示例:
variable "Cluster_Instance_Map" {
type = map
default = {
"C1" = "Single-Node : 0 : A : B"
"C2" = "Multi-Node : 2 : Q : R"
"C3" = "Multi-Node : 4 : X : Y"
"C4" = "Multi-Node : 8 : S : T"
...
}
}
然后,例如,我将使用以前用户从“C1、C2、C3、C4”中选择的 Cluster_Config_Choice 变量获取相应行的第一个值,如下所示:
split ( " : ",var.Cluster_Instance_Map[ var.Cluster_Config_Choice ] ) [0]
到目前为止,我真的很难在 Jinja 中为 GCP 重新创建这种类型的变量。总的来说,我是 GCP 的新手,也是 Jinja 的新手,我在网上找到的大部分内容都让我感到困惑,因此非常感谢您对此的任何帮助!
--- 编辑---
根据要求,我将详细介绍迄今为止我对 Jinja 所做的工作,尽管遗憾的是并没有太多。我最初的想法是通过使用 LIST 和 SPLIT。我想我可以执行以下操作:
{% set list_example = ({ "A" : "1 ; 2 ; 3","B" : "4 ; 5 ; 6" }) %}
{{ list_example [ user_input_variable ].split(';')[1] }}
然后第二行将返回“5”,例如,如果用户选择了 B。我确实编写了该代码(第二行),因此它不适用于语法错误(100% 预期),但我不知道它是否接近。
LIST 和 SPLIT 是要走的路吗?或者是否有我错过的类似 MAP 的功能..
我也不知道如何将我的 SET 函数放在多行而不出错,所以很抱歉上面的混乱。虽然我认为谷歌可以在我不忙的时候告诉我! >.>
希望这有助于澄清事情。
解决方法
在转了一圈之后,在这个过程中学到的东西很少,我实际上意识到我的答案是我已经尝试过的......我上面发布的代码不起作用,但有效 - 尽管它变成了有很多其他原因它没有,但与它本身没有直接关系。
因此,我在 Terraform/AWS CF 中重新创建我拥有的“地图”的答案如下:
{% set Cluster_Instance_Map = ({
"C1" : "Single-Node : 0 : A : B","C2" : "Multi-Node : 2 : Q : R","C3" : "Multi-Node : 4 : X : Y","C4" : "Multi-Node : 8 : S : T",...
}) %}
{% set user_input_variable = "C3" %}
{{ Cluster_Instance_Map [ user_input_variable ].split(':')[1] }}
在这种情况下,最后一块将返回数字 4。我的代码也跨多行,因此现在也更容易阅读 - 这也是一个无关的问题(如前所述,我对 Google 和 Jinja 完全陌生,因此吸取了教训)。
不过,我必须说,与其他文档相比,Google Cloud 的文档确实很糟糕。很容易放飞自我。因此,即使上述内容并不真正需要答案,也最好将其放在这里,以防其他人有类似问题。