Terraform - невозможно передать строковую переменную дочернему модулю
У меня есть установка terraform с несколькими вложенными модулями. Упрощенно это выглядит так
├── modules
│ ├── sec-groups
│ │ ├── main.tf
│ │ ├── outputs.tf
│ │ ├── variables.tf
│ │ └── versions.tf
├── dev
│ ├── env.dev.tfvars
│ ├── main.tf
│ ├── versions.tf
│ └── variables.tf
└── prod
├── env.prod.tfvars
├── main.tf
├── versions.tf
└── variables.tf
Где в dev:
main.tf
module "aws_dev_sec-groups" {
source = "../modules/sec-groups"
vpc_name = aws_vpc.dev_bp_vpc
vpc_id = aws_vpc.dev_bp_vpc.id
localip = var.localip
}
variables.tf
variable "localip" {
type = string
}
env.dev.tfvars
localip = "1.1.1.1/32"
А в модуле сек-группы:
main.tf
resource "aws_security_group" "servers_sg" {
name = "servers_sg"
description = "Traffic allowed to and from Servers"
vpc_id = var.vpc_id
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = [var.localip]
}
}
variables.tf
variable vpc_id {}
variable localip {
type = string
}
-
'terraform init' дает ожидаемые результаты. Однако "план терраформирования" вызывает следующую ошибку. Для меня это означает пустую переменную localip, что означает, что я неправильно объявляю переменную, так ли это?
Error: "" is not a valid CIDR block: invalid CIDR address:
on ../modules/sec-groups/main.tf line 63, in resource "aws_security_group" "servers_sg":
63: resource "aws_security_group" "servers_sg" {
}
заранее спасибо
-
% terraform -v
Terraform v0.13.0
+ provider registry.terraform.io/hashicorp/aws v3.2.0
+ provider registry.terraform.io/hashicorp/random v2.3.0
1 ответ
Оказывается, я совершенно не понял, как работают модули. Я предположил, что подмодули должны использовать переменные из родительского или других подмодулей, указав несколько блоков модулей внутри подмодуля. Я обнаружил, что передавал переменные из нескольких подмодулей в каждый подмодуль, что кажется странным в ретроспективе, но не тогда.
Это означало, что некоторые подмодули пытались повторно создать экземпляр несколько раз в цикле, отсюда и сообщения об ошибках. Теперь я понимаю, что зверский подход заключается в том, что родительский модуль вызывает выходные значения подмодулей для передачи другим подмодулям, и что подмодули не должны ссылаться друг на друга с использованием тех же переменных, что и в родительском модуле.
Спасибо за все указатели с этим, извинения за отвлекающую ссылку на переменную localip.
Переменные из .tfvars
файл назначается корневому модулю.
Если опубликованный вами код действительно находится на корневом уровне, он будет работать, если вы укажете -var-file
.
Если он на самом деле не на корневом уровне, вы, скорее всего, не передадите localip
var правильно. Тот факт, что вы видитеError: "" is not a valid CIDR block: invalid CIDR address:
указывает, что вы где-то передаете пустую строку. Если вы не загрузите.tfvars
правильно, и приведенный выше код фактически находится на корневом уровне, вы получите другую ошибку (отсутствующая переменная), поскольку вы не указали значение по умолчанию для localip
переменная.