Пробую свои силы в модулях терраформирования и столкнулся со странной проблемой (я думаю).
Вот моя структура:
Вот корень main.tf:
provider "azurerm" {
features {
}
}
module "createrg" {
source = "./modules/rg"
my_loc = var.my_loc
rgName = var.rgName
}
Вот корневые переменные.tf
variable "my_loc" {
type = "string"
}
variable "rgName" {
type = "string"
}
вот main.tf для модуля "rg":
provider "azurerm" {
## dev_subscription_id = var.dev_subscription
features {
}
}
resource "azurerm_resource_group" "rgDev" {
location = var.my_loc
name = var.rgName
}
а вот переменная.tf для модуля "rg"
variable "my_loc" {
type = "string"
}
variable "rgName" {
type = "string"
}
вот dev.tfvars
my_loc = "canadacentral"
rgName = "rg_ModuleTest"
Я запускаю план как:
terraform plan -var-file=./variables/dev.tfvars
Поскольку я только начал работать с terraform, я использую последнюю версию. Если я удаляю какие-либо переменные из одной или обеих переменных. tf, я получаю ошибки, и план не выполняется. Например, если я удаляю объявление переменной из корневого файла variable.tf, я получаю сообщение об ошибке: «Ошибка: ссылка на необъявленную входную переменную», а если я удаляю объявление переменной из файла variable.tf в модуле rg, я получаю сообщение об ошибке. ошибка: «Ошибка: неподдерживаемый аргумент... Здесь не ожидается аргумент с именем «rgName».» План работает только тогда, когда у меня есть одни и те же переменные в файле variable.tf как в корневом модуле, так и в модуле rg.
Так должны работать модули? Я искал в Интернете объяснение, но я думаю, что здесь что-то упустил. Я имею в виду, что если у меня есть модули для создания 20 ресурсов, кажется абсурдным думать, что мне нужно реплицировать переменные в обоих местах — корневом каталоге и файле variable.tf соответствующего модуля.
Заранее спасибо за вашу помощь.
Модули автономны. Все переменные, необходимые для успешного выполнения вашего модуля rg, определены в ./modules/rg/variables.tf
.
Поскольку вы не определили для них никаких значений по умолчанию, они унифицированы. Таким образом, в вашем корневом main.tf, когда вы создаете свой модуль createrg
, вы должны явно установить все эти переменные.
Что касается именования, в вашем «.root/main» ваши переменные var.my_loc
и var.rgName
не обязательно должны иметь те же имена, что и в ./modules/rg/variables.tf
. Они могут иметь любые имена или быть константами, если вы собираетесь установить все эти неинициализированные переменные вашего модуля.