Выход модуля Terraform не разрешен для входных переменных в другом модуле - PullRequest
0 голосов
/ 03 февраля 2019

Версия Terraform

Terraform v0.11.11
+ provider.azurerm v1.21.0

Файлы конфигурации Terraform

Я оставил много обязательных полей для краткости (все остальные настройки работали до того, как я добавил строки подключения).

# modules/function/main.tf

variable "conn-value" {}
locals {
  conn = "${map("name", "mydb", "value", "${var.conn-value}", "type", "SQLAzure")}"
}
resource "azurerm_function_app" "functions" {
  connection_string = "${list(local.conn)}"
  # ...
}

# modules/db/main.tf

# ... other variables declared

resource "azurerm_sql_server" "server" {
  # ...
}

output "connection-string" {
  value = "Server=tcp:${azurerm_sql_server.server.fully_qualified_domain_name},1433;Initial Catalog=${var.catalog};Persist Security Info=False;User ID=${var.login};Password=${var.login-password};MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=200;"
}

# main.tf

module "my_db" {
  source = "modules/db"
}

module "my_app" {
  source = "modules/function"
  conn-value = "${module.my_db.connection-string}"
  # ...
}

Ожидаемое поведение при terraform plan

Выход module.my_db.connection-string преобразуется в строку при передаче в переменную my_app conn-value и может использоваться в карте / списке, передаваемом в azurerm_function_app.functions.connection_string переменная.

Фактическое поведение при terraform plan

Я получаю эту ошибку:

module.my_app.azurerm_function_app.functions: connection_string: should be a list

Если заменить "${var.conn-value}" на modules/function/main.tf localsс помощью только строки это работает.

Обновление

В ответ на этот комментарий я обновил приведенный выше скрипт конструкцией строки подключения.

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

Я наконец-то обнаружил проблему GitHub , которая ссылается на проблему, с которой я столкнулся (я обнаружил проблему с помощью этого комментария к списку ).Это точно описывает проблему:

Присвоение значений вложенным блокам не поддерживается, но в некоторых случаях работает из-за ряда совпадений ...

Этоограничение в <= v0.11, но, по-видимому, <a href="https://github.com/hashicorp/terraform/issues/7034#issuecomment-433511035" rel="nofollow noreferrer"> исправлено в v0.12 с блоком dynamic.

0 голосов
/ 03 февраля 2019
  1. должны ли мы установить локальную переменную в правильном формате напрямую, более чем при использовании здесь функций map() и list()?
variable "conn-value" {}

locals {
  conn = {
    name  = "mydb"
    value = "${var.conn-value}"
    type  = "SQLAzure"
  }
}

resource "azurerm_function_app" "functions" {
  connection_string = "${local.conn}"
  # ...
}
Ваш код именования запутал других.Ваша проблема содержит ошибку в этом коде (и я вижу пробелы в строке?)

код:

output "connection-string" {
  value = "Server=tcp:${azurerm_sql_server.server.fully_qualified_domain_name},1433;Initial Catalog=${var.catalog};Persist Security Info=False;User ID=${var.login};Password=${var.login-password};MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=200;"
}

Вывод connection-string не является исходным connection_string определено в ресурсе azurerm_function_app, одно - минус (-), другое - подчеркивание (_)

Таким образом, значение connection-string определено в модуле my_db, на который ссылаются как conn-value, затем передайте ресурсу azurerm_function_app как connection_string, что составляет string.

Отношение:

переменная connection-string определена в модуле my_db

"Сервер = tcp: $ {azurerm_sql_server.server.fully_qualified_domain_name}, 1433; Начальный каталог = $ {var.catalog}; Постоянная информация о безопасности = Ложь; ID пользователя = $ {var.login}; Пароль = ${var.login-password}; MultipleActiveResultSets = False; Encrypt = True; TrustServerCertificate = False; время ожидания подключения = 200; "

==>

var.conn-value

==>

var.connection_string
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...