Невозможно использовать VAR из файла tfvars в Terraform

Я новичок в Терраформе. Я пытаюсь настроить несколько сценариев для управления Cisco Catalyst Center (новое название Cisco DNA, но я все равно использую поставщика DNA :)). Я использовал существующий репозиторий, который я изменил. У меня есть структура, которая выглядит так:

├── main.tf
├── variables.tf
├── modules 
│ └── site_settings 
│   └── site.tf 
│   └── variables.tf
├── Site-1
│ └── site-1.tfvars

В ./main.tf у меня есть:

provider "dnacenter" {

    username = var.dnac_username
    password = var.dnac_password
    base_url = var.dnac_url
    debug = "true"
    ssl_verify = "false"
}

module "site_settings" {
  # Using m0_general_settings module to configure general settings
  source = "../modules/site_settings"

  dnac_username = var.dnac_username
  dnac_password = var.dnac_password
  dnac_url = var.dnac_url

  global_name = var.global_name
  region_name = var.region_name
  country_name = var.country_name
  city_name = var.city_name
  site_name = var.site_name
  buildings = var.buildings
  building_name = var.building_name
}

В ./modules/site_settings/site.tf есть:

resource "dnacenter_area" "country" {
    provider = dnacenter
    parameters {
      site {
        area {
          name = var.country_name
          parent_name = "${var.global_name}/${var.region_name}"
        }
      }
    type = "area"
    }
  }
  
  resource "dnacenter_area" "city" {
    depends_on = [ dnacenter_area.country ]
    provider = dnacenter
    parameters {
      site {
        area {
          name = var.city_name
          parent_name = "${var.global_name}/${var.region_name}/${var.country_name}"
        }
      }
    type = "area"
    }
  }
  
  resource "dnacenter_area" "site" {
    depends_on = [ dnacenter_area.city ]
    provider = dnacenter
    parameters {
      site {
        area {
          name = var.site_name
          parent_name = "${var.parent_name}/${var.global_name}/${var.country_name}/${var.city_name}"
        }
      }
    type = "area"
    }
  }
  
**  resource "dnacenter_building" "building" {
    depends_on = [ dnacenter_area.site ]
    for_each = { for building in var.buildings : building.name => building }
    provider = dnacenter
    parameters {
      site {
        building {
          name        = "${each.value.building_name}"
          parent_name = "${var.global_name}/${var.region_name}/${var.country_name}/${var.city_name}/${each.value.parent_site_name}"
          latitude    = "${each.value.latitude}"
          longitude   = "${each.value.longitude}"
        }
      }
    type = "building"
    }
  }**

Это значения переменных в ./site-1.tfvars:

dnac_username = "Cisco"
dnac_password = "Cisco123"
dnac_url = "https://my-dna-lab.test.net"
global_name = "Global"
region_name = "EMEA"
country_name = "Spain"
city_name = "Madrid"
site_name = "Site-1"
buildings = [
{
building_name = "B01"
parent_site_name = "Site-1"
latitude = "xx.xxxx"
longitude = "xx.xxxx"
},
{
building_name = "B02"
parent_site_name = "Site-1"
latitude = "xx.xxxx"
longitude = "xx.xxxx"
},
]

Переменные определены как в ./variables.tf, так и в ./modules/site_settings/variables.tf... не знаю почему :):

variable "dnac_username" {
    sensitive = true
}
variable "dnac_password" {
    sensitive = true
}
variable "dnac_url" {
  type = string
}
variable "global_name" {
  type = string
}
variable "region_name" {
  type = string
}
variable "country_name" {
  type = string
}
variable "city_name" {
  type = string
}
variable "site_name" {
  type = string
}
variable "building_name" {
  type = string
}
variable "parent_site_name" {
  type = string
}

У меня есть переменные.tf в корне и во подпапке, не совсем понимаю, почему .... но независимо от того, храню ли я их только в одном из них, меня все равно просят указать переменные, даже если я указываю, что хочу использовать из файла site-1.tfvars:

   ~/Doc/G/ccc  on   main ?1  terraform plan -out Site-1/site-1.tfplan **-var-file=Site-1/site-1.tfvars**
**var.building_name
  Enter a value: **

Я ожидаю, что меня не спросят о переменных, определенных в файле tfvars. Я предполагаю, что что-то не так с тем, как переменные устанавливаются/форматируются в этом файле tfvars, или с моим циклом для здания. Можете ли вы помочь? :) Спасибо!

I have the variables.tf in the root and in the subfolder, not quite sure why — каждому модулю (корневому модулю или подмодулю) нужны свои переменные.
Rui Jarimba 22.06.2024 12:07

Пожалуйста, отредактируйте свой пост и покажите нам оба variables.tf файла.

Rui Jarimba 22.06.2024 12:08

Привет, Руи, оба файлаvariable.tf имеют одинаковое содержимое. После комментария Тхана (ниже) я заменил это: переменную "building_name" { type = string } на: переменную "buildings" {description = "Список зданий" type = list(object({ Building_name = string родительское_имя_сайта = строка широта = число долгота = число })) }

MupEHcEH 23.06.2024 12:31
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы должны определить ./variables.tf и ./modules/site_settings/variables.tf как список, который выглядит следующим образом:

variable "buildings" {
  description = "List of buildings"
  type = list(object({
    building_name    = string
    parent_site_name = string
    latitude         = string
    longitude        = string
  }))
}

Из-за этого :

parameters {
      site {
        building {
          name        = "${each.value.building_name}"
          parent_name = "${var.global_name}/${var.region_name}/${var.country_name}/${var.city_name}/${each.value.parent_site_name}"
          latitude    = "${each.value.latitude}"
          longitude   = "${each.value.longitude}"
        }
      }
    type = "building"
    }

И вы предоставили список:

buildings = [
 {
  building_name = "B01"
  parent_site_name = "Site-1"
  latitude = "xx.xxxx"
  longitude = "xx.xxxx"
 },
 {
  building_name = "B02"
  parent_site_name = "Site-1"
  latitude = "xx.xxxx"
  longitude = "xx.xxxx"
 },
]

Спасибо, Тан, это помогло! Что я сделал, так это добавил эту переменную здания, как вы описали (широта и длина - это числа), в файл переменных комнаты. В файле vars в папке модулей я оставил его только как «переменная «здания» {}» и удалил все объекты (имя_здания, имя_родительского_сайта,...) из обоих файлов переменных. Сейчас я столкнулся с еще одной ошибкой, которую пытаюсь исправить. Если не смогу, я опубликую здесь более подробную информацию.

MupEHcEH 23.06.2024 15:07

Если это решило вашу проблему, можете ли вы отметить ее как правильный ответ и опубликовать новый вопрос по другим проблемам?

Thanh Nguyen Van 23.06.2024 19:24

Это было исправлено путем добавления переменной здания, как описано Тханьем, в корневой файл переменных (lat и long — это числа). В файле vars в папке модулей я оставил его только как 'переменная "здания" {}' и я удалил все объекты (имя_здания, имя_родительского_сайта,...) из обоих файлов переменных.

Другие вопросы по теме