Требуемый аргумент не найден при использовании Terraform validate

#terraform #terraform-template-file

#terraform #terraform-template-file

Вопрос:

Моя структура каталогов Terraform выглядит примерно так :

 ├── deploy
│      ├── dev.tfvars
│      └── qa.tfvars
├── modules
│   ├── private
│   │   ├── bastion.tf
│       ├── db.tf
│   │   └── variables.tf
│   └── public
│       ├── web.tf
│       └── variables.tf
├── main.tf

  

В bastion.tf , Я пытаюсь вызвать переменную из variables.tf вот так :

 resource "aws_eip" "bastion" {
  instance = "var.eip"
  vpc = true
}
  

где, eip = 10.x.x.x задается, скажем, в dev.tfvars.

И конфигурация для main.tf выглядит так :

 provider "aws" {}

terraform {
  backend "s3" {}
}

module "private" {
  source = "./modules/private"
}
  

При запуске terraform validate выдается сообщение об ошибке, что — Требуется аргумент «eip», но определение не найдено. Даже если я попытаюсь предоставить eip модулю, например :

 module "private" {
  source = "./modules/private"
  eip = var.eip
}
  

это выдает мне другую ошибку : введите описание изображения здесь

Входная переменная с именем «eip» не была объявлена. Эта переменная может быть объявлена с переменной «eip» {} block

Я variable "eip" {} уже определил в своем variables.tf такой, что он принимает значения из файла.tfvars, но почему-то это не так. Кто-нибудь может подсказать, чего еще мне может не хватать?

Комментарии:

1. Первая ошибка заключается в том, что у вас нет значения по умолчанию для eip аргумента для private модуля, поэтому вам необходимо указать его. Вторая ошибка связана с тем, что вы предоставили модулю аргумент для eip , который является необъявленной переменной. Вам нужно либо указать аргумент, который определен, либо объявить eip переменную и определить для нее значение.

2. У меня есть значение eip, определенное в файле .tfvars. Что мне нужно для извлечения значения из .tfvars и просто пустого объявления eip like — variable eip {} в variables.tf ?

Ответ №1:

Похоже, вам не хватает объявлений переменных…

Из вашей файловой структуры:

 ├── deploy
│      ├── dev.tfvars
│      └── qa.tfvars
├── modules
│   ├── private
│   │   ├── bastion.tf
│       ├── db.tf
│   │   └── variables.tf
│   └── public
│       ├── web.tf
│       └── variables.tf
├── main.tf
  

Похоже, что не существует сопутствующего, variables.tf для main.tf каждого уровня необходимо объявлять переменные, которые будут использоваться ресурсами или подмодулями.

Если вы загрузите свой код на GitHub и разместите ссылку, я мог бы помочь разблокировать вас.

Комментарии:

1. Я попытался добавить variabless.tf файл в том же расположении, что и main.tf и добавлены пустые переменные для передачи модулям, но это также не сработало и выдало ошибку: Ошибка: отсутствует требуемый аргумент на main.tf строка 9 в модуле «private»: модуль «private» { Требуется аргумент «eip», но определение не найдено.

2. @s_neenu Я внес исправление в ваш файл переменных github.com/heldersepu/terraform-snippet/blob/master/terraform / … с этим я могу запустить plan без каких-либо проблем

3. Спасибо! Будет ли то же самое работать для terraform validate ? В соответствии с этим проверка не принимает значения .tfvars [ссылка] github.com/hashicorp/terraform/issues/15733

4. @s_neenu да, должно быть … но не верьте мне на слово, просто клонируйте мой репозиторий и протестируйте его