【问题标题】:Creating multiple namespaces using Terraform使用 Terraform 创建多个命名空间
【发布时间】:2021-09-21 08:42:47
【问题描述】:

我正在尝试从 json blob 输入文件创建多个命名空间,如下所示:

我的 tfvars.json 文件

{
    "example1" : [
        {
            "namespace_name" : "test-1", 
            "team_name" : "test",  
        },
        {
            "namespace_name" : "test-2", 
            "team_name" : "test2", 
        }
   ]
}

我的 main.tf 文件如下所示:

resource "kubernetes_namespace" "aks_namespace" {
    metadata {
      annotations = {
        name = var.namespace_name
      }
      labels = {
        name = var.team_name
      }
      name = var.namespace_name
      }
}

我已经尝试了几乎所有可用的选项,例如 for_each 和 dynamic.. 在循环中创建命名空间似乎没有任何作用。 只是想知道这是否真的可能.. 不幸的是,我不应该更改输入 .json 格式.. 有什么建议或想法吗?

【问题讨论】:

    标签: kubernetes namespaces azure-aks terraform-provider-azure


    【解决方案1】:

    我尝试了使用您的详细信息的所有可能性,但由于 example1 是一个元组值,因此在 for_each 中声明它会导致创建命名空间出错。

    因此,作为解决方案,我在terraform.tfvars.json 中声明了变量 example1,如下所示:

    {    "example1" : [
        [
                "test-1", 
                "test"
             ],
            [
             "test-2", 
            "test2" 
            ]
        ]
    } 
    

    这是我正在使用的main.tf

    terraform {
      required_providers {
        kubernetes = {
          source = "hashicorp/kubernetes"
          version = "2.5.0"
        }
      }
    }
    variable "example1" {
      
    }
    
    provider "kubernetes" {
      # Configuration options
    }
    resource "kubernetes_namespace" "aks_namespace" {
      for_each = {for i,v in var.example1: i=>v}
    metadata {
      annotations = {
        name = each.value[0]
      }
      labels = {
        name = each.value[1]
      }
      name = each.value[0]
    }
    }
    

    输出:


    更新: terraform.tfvars.json

    {
        "example1" : [
            {
                "namespace_name" : "test-1", 
                "team_name" : "test"
            },
            {
                "namespace_name" : "test-2", 
                "team_name" : "test2"
            }
       ]
    }
    

    main.tf

    terraform {
      required_providers {
        kubernetes = {
          source = "hashicorp/kubernetes"
          version = "2.5.0"
        }
      }
    }
    variable "example1" {
      type = list(object({
        namespace_name = string
        team_name = string
      }))
    }
    
    provider "kubernetes" {
      # Configuration options
    }
    resource "kubernetes_namespace" "aks_namespace" {
      for_each = {for i,v in var.example1: i=>v}
    metadata {
      annotations = {
        name = var.example1[each.key].namespace_name
      }
      labels = {
        name = var.example1[each.key].team_name
      }
      name = var.example1[each.key].namespace_name
    }
    }
    

    【讨论】:

    • 感谢 Ansuman 的努力。我能够使用 count 和 jsondecode 完成这项工作。但是,我仍然想知道是否有办法在不更改输入文件的情况下使用 for_each。
    • @dils_pk,能够在不更改输入文件并使用更新部分提供的代码的情况下满足您的要求。
    • 这太完美了!!它就像一个魅力..感谢您的支持..
    • @dils_pk,很高兴能帮上忙!!
    • 嗨再次..我再次遇到问题..不确定我是否需要创建一个新帖子..但我认为你可能有答案..虽然我们在这里使用 for_each,我注意到在创建对象时存在索引。这将使其具有类似于计数元参数的挑战性。不幸的是,我无法在输入文件中添加或删除对象,这会导致替换命名空间。想知道是否有一种方法可以避免在这里建立索引并使用命名约定,例如 app1 用于第一个命名空间,app2 用于第二个命名空间..
    猜你喜欢
    • 2020-12-26
    • 2021-12-06
    • 2021-05-13
    • 2020-05-04
    • 2019-10-22
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多