Назад | Перейти на главную страницу

Terraform - имена аргументов нельзя заключать в кавычки

Я использую Terraform v0.12.6 и столкнулся с проблемой при развертывании OpenShift 4.1 на vSphere 6.5. Когда я запускаю ./terraform apply, validate или plan, я получаю тот же ответ:

Error: Invalid argument name

  on machine/main.tf line 47, in resource "vsphere_virtual_machine" "vm":
  47:       "guestinfo.ignition.config.data"          = "${base64encode(data.ignition_config.ign.*.rendered[count.index])}"

Argument names must not be quoted.

Я попытался удалить кавычки из строки 47, но ошибка изменилась на что-то другое. Помощь очень ценится.

Я использую файл main.tf по следующему URL-адресу: https://github.com/openshift/installer/blob/master/upi/vsphere/machine/main.tf

Основная проблема здесь в том, что эта конфигурация не использует правильный синтаксис для properties аргумент. Это аргумент, ожидающий значение карты, а не вложенный блок, поэтому его нужно записать следующим образом:

  vapp {
    properties = {
      "guestinfo.ignition.config.data"          = "${base64encode(data.ignition_config.ign.*.rendered[count.index])}"
      "guestinfo.ignition.config.data.encoding" = "base64"
    }
  }

Назначив properties значение карты, а не использовать его как вложенный блок, Terraform может видеть, что это выражение карты, и, таким образом, знать, что здесь действительны цитируемые ключи карты. Вместо этого внутри вложенных блоков Terraform ожидает имен аргументов, которые всегда должны быть допустимыми идентификаторами (только буквы, цифры, подчеркивания и дефисы).

Упомянутый вами файл, похоже, написан для Terraform 0.11, поэтому могут быть другие ситуации, когда для Terraform 0.12 потребуются некоторые изменения. Если это ваш модуль, подумайте о том, чтобы запустить автоматический процесс обновления для обновления синтаксиса идиомы Terraform 0.12 и автоматического исправления многих небольших различий в синтаксисе нового языка Terraform 0.12. В частности, автоматический инструмент должен автоматически обнаруживать и устранять проблему, с которой вы столкнулись при ответе на этот вопрос.