Я новичок в Терраформе. Я пытаюсь настроить несколько сценариев для управления 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, или с моим циклом для здания. Можете ли вы помочь? :) Спасибо!
Пожалуйста, отредактируйте свой пост и покажите нам оба variables.tf
файла.
Привет, Руи, оба файлаvariable.tf имеют одинаковое содержимое. После комментария Тхана (ниже) я заменил это: переменную "building_name" { type = string } на: переменную "buildings" {description = "Список зданий" type = list(object({ Building_name = string родительское_имя_сайта = строка широта = число долгота = число })) }
Вы должны определить ./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 в папке модулей я оставил его только как «переменная «здания» {}» и удалил все объекты (имя_здания, имя_родительского_сайта,...) из обоих файлов переменных. Сейчас я столкнулся с еще одной ошибкой, которую пытаюсь исправить. Если не смогу, я опубликую здесь более подробную информацию.
Если это решило вашу проблему, можете ли вы отметить ее как правильный ответ и опубликовать новый вопрос по другим проблемам?
Это было исправлено путем добавления переменной здания, как описано Тханьем, в корневой файл переменных (lat и long — это числа). В файле vars в папке модулей я оставил его только как 'переменная "здания" {}' и я удалил все объекты (имя_здания, имя_родительского_сайта,...) из обоих файлов переменных.
I have the variables.tf in the root and in the subfolder, not quite sure why
— каждому модулю (корневому модулю или подмодулю) нужны свои переменные.