Ste*_*fan 6 json terraform hcl
我正在寻找一种基于 JSON 值生成 Terraform 代码的方法。假设我有一个具有以下结构的 JSON 文件:
{
"settings": [
{
"conf": [
{
"setting": "DeploymentPolicy",
"namespace": "aws:elasticbeanstalk:command",
"value": "AllAtOnce"
},
{
"setting": "BatchSize",
"namespace": "aws:elasticbeanstalk:command",
"value": "30"
},
{
"setting": "BatchSizeType",
"namespace": "aws:elasticbeanstalk:command",
"value": "Percentage"
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
我想做的是:根据 JSON 文件值创建一个工作 Terraform 资源,例如像这样的 beanstalk 环境:
resource "aws_elastic_beanstalk_environment" "app_prod" {
name = "${aws_elastic_beanstalk_application_version.app.name}-prod"
application = aws_elastic_beanstalk_application.app.name
solution_stack_name = data.aws_elastic_beanstalk_solution_stack.latest_linux_java.name
wait_for_ready_timeout = "10m"
version_label = aws_elastic_beanstalk_application_version.app.name
# Elastic beanstalk configuration
setting {
name = "DeploymentPolicy"
namespace = "aws:elasticbeanstalk:command"
value = "AllAtOnce"
}
setting {
name = "BatchSize"
namespace = "aws:elasticbeanstalk:command"
value = "30"
}
...
}
Run Code Online (Sandbox Code Playgroud)
因此,我必须根据 JSON 值在 HCL(Terraform 配置)中创建设置块。这意味着上面的 JSON 文件应生成:
setting {
name = "DeploymentPolicy"
namespace = "aws:elasticbeanstalk:command"
value = "AllAtOnce"
}
setting {
name = "BatchSize"
namespace = "aws:elasticbeanstalk:command"
value = "30"
}
setting {
name = "BatchSizeType"
namespace = "aws:elasticbeanstalk:command"
value = "Percentage"
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,JSON 和 HCL 的结构非常相似,但并不完全相同。请参阅设置、conf 或设置,而不是 JSON 中的名称。
一种可能的方法是读取 JSON 值并将它们存储在数组或映射中。但我不知道如何生成有效的 HCL 并将其注入资源的所需部分。此外,我尝试使用模板,但 Terraform 不支持我需要迭代设置的循环功能。
总结:
有谁知道如何做到这一点?还有其他方法吗?多谢!
假设您的 JSON 对象位于settings.json模块目录内调用的文件中,您可以执行以下操作:
locals {
environment_settings = jsondecode(file("${path.module}/settings.json")).settings[0].conf[0]
}
resource "aws_elastic_beanstalk_environment" "app_prod" {
name = "${aws_elastic_beanstalk_application_version.app.name}-prod"
application = aws_elastic_beanstalk_application.app.name
solution_stack_name = data.aws_elastic_beanstalk_solution_stack.latest_linux_java.name
wait_for_ready_timeout = "10m"
version_label = aws_elastic_beanstalk_application_version.app.name
dynamic "setting" {
for_each = local.environment_settings
content {
namespace = setting.value.namespace
name = setting.value.setting
value = setting.value.value
}
}
}
Run Code Online (Sandbox Code Playgroud)
这个特殊的dynamic块是一种用于创建重复setting块的宏,每个块与 中给出的集合的一个元素相关for_each。
您可以在块中使用 Terraform 的表达式语言对输入进行任何所需的转换,locals以确保该local.environment_settings值包含您将生成的每个块的一个元素setting,然后在content嵌套块中告诉 Terraform 如何setting根据这些元素值填充参数。
| 归档时间: |
|
| 查看次数: |
8518 次 |
| 最近记录: |