#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 для второго пространства имен ..