Создание нескольких пространств имен с помощью Terraform

#kubernetes #namespaces #azure-aks #terraform-provider-azure

Вопрос:

Я пытаюсь создать несколько пространств имен из входного файла 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..
Есть какие-нибудь предложения или идеи?

Ответ №1:

Я попытался использовать все возможности , используя ваши данные, но, поскольку пример1 является значением кортежа, объявление его в for_each приведет к ошибке при создании пространства имен.

Итак , в качестве решения я объявил переменную example1, terraform.tfvars.json как показано ниже:

 {    "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
}
}
 

Комментарии:

1. спасибо вам, Ансуман, за ваши усилия.. Я смог сделать это с помощью count и jsondecode.. Тем не менее, мне все еще интересно, есть ли способ использовать for_each без изменения входного файла..

2. @dils_pk, смог выполнить ваши требования без изменения входного файла и с использованием кода, предоставленного в разделе обновления .

3. Это прекрасно!! Это действует как заклинание.. Спасибо за вашу поддержку..

4. @dils_pk, Рад помочь!!

5. Еще Раз Привет.. Я снова сталкиваюсь с проблемой.. не уверен, нужно ли мне создавать новый пост … но подумал, что у вас может быть ответ на него.. Хотя мы используем здесь for_each, я заметил, что при создании объектов происходит индексация.. Это сделает его сложным, как и подсчет мета-аргументов.. К сожалению, я не могу добавлять или удалять объекты во входном файле между ними, что приводит к замене пространств имен.. Мне было интересно, есть ли способ избежать индексации здесь и использовать соглашение об именах, например app1 для 1-го пространства имен и app2 для второго пространства имен ..