Неверная команда terraform config post 0.12upgrade

В простейшем виде main.tf выглядит следующим образом:

data "azurerm_resource_group" "tf-rg-external" {
  name = var.rg_name
}

# Reference existing Virtual Network
data "azurerm_virtual_network" "tf-vn" {
  name                = var.vnet_name
  resource_group_name = data.azurerm_resource_group.tf-rg-external.name
}

# Reference existing subnet
data "azurerm_subnet" "tf-sn" {
  name                 = var.subnet_name
  virtual_network_name = data.azurerm_virtual_network.tf-vn.name
  resource_group_name  = data.azurerm_resource_group.tf-rg-external.name
}

resource "azurerm_network_security_group" "tf-nsg" {
  name                = var.app_nsg
  location            = data.azurerm_virtual_network.tf-vn.location
  resource_group_name = data.azurerm_resource_group.tf-rg-external.name
}

resource "azurerm_network_security_rule" "tf-nsr-5986" {
  name                   = "Open Port 5986"
  priority               = 101
  direction              = "Inbound"
  access                 = "Allow"
  protocol               = "Tcp"
  source_port_range      = "*"
  destination_port_range = "5986"
  source_address_prefixes     = var.allowed_source_ips
  destination_address_prefix  = "VirtualNetwork"
  resource_group_name         = data.azurerm_resource_group.tf-rg-external.name
  network_security_group_name = azurerm_network_security_group.tf-nsg.name
}

resource "azurerm_network_security_rule" "tf-nsr-3389" {
  name                   = "Open Port 3389"
  priority               = 102
  direction              = "Inbound"
  access                 = "Allow"
  protocol               = "Tcp"
  source_port_range      = "*"
  destination_port_range = "3389"
  source_address_prefixes     = var.allowed_source_ips
  destination_address_prefix  = "VirtualNetwork"
  resource_group_name         = data.azurerm_resource_group.tf-rg-external.name
  network_security_group_name = azurerm_network_security_group.tf-nsg.name
}

# Assosciate NSG to subnet
resource "azurerm_subnet_network_security_group_association" "tf-snnsg" {
  subnet_id                 = data.azurerm_subnet.tf-sn.id
  network_security_group_id = azurerm_network_security_group.tf-nsg.id
}

# Network inteface for Interface
resource "azurerm_network_interface" "tf-ni" {
  count               = var.vm_count
  name                = "${var.base_hostname}${format("%02d", count.index + 1)}-nic01"
  location            = data.azurerm_virtual_network.tf-vn.location
  resource_group_name = data.azurerm_resource_group.tf-rg-external.name

  ip_configuration {
    name                          = "${var.base_hostname}${format("%02d", count.index)}-iip01"
    subnet_id                     = data.azurerm_subnet.tf-sn.id
    private_ip_address_allocation = "dynamic"
    public_ip_address_id          = element(azurerm_public_ip.tf-pip.*.id, count.index)
  }
}

resource "azurerm_public_ip" "tf-pip" {
  count               = var.vm_count
  location            = data.azurerm_virtual_network.tf-vn.location
  name                = "${var.base_hostname}${format("%02d", count.index + 1)}-pip01"
  resource_group_name = data.azurerm_resource_group.tf-rg-external.name
  allocation_method   = "Dynamic"
}

# Storage Account
resource "azurerm_storage_account" "tf-sa" {
  count                    = var.vm_count
  name                     = "${lower(var.base_hostname)}${format("%02d", count.index + 1)}${var.sto_acc_suffix}01"
  location                 = data.azurerm_virtual_network.tf-vn.location
  resource_group_name      = data.azurerm_resource_group.tf-rg-external.name
  account_tier             = var.sto_acc_tier_std
  account_replication_type = var.sto_acc_rep_type_lrs
}

resource "azurerm_virtual_machine" "tf-vm" {
  count                 = var.vm_count
  name                  = "${var.base_hostname}${format("%02d", count.index + 1)}"
  location              = data.azurerm_virtual_network.tf-vn.location
  resource_group_name   = data.azurerm_resource_group.tf-rg-external.name
  network_interface_ids = [element(azurerm_network_interface.tf-ni.*.id, count.index)]
  vm_size               = var.vm_size

  delete_os_disk_on_termination = true

  delete_data_disks_on_termination = true

  storage_image_reference {
    publisher = var.vm_publisher
    offer     = var.vm_offer
    sku       = var.vm_sku
    version   = var.vm_img_version
  }

  storage_os_disk {
    name              = "${var.base_hostname}${format("%02d", count.index + 1)}-wosdsk01"
    caching           = var.caching_option
    create_option     = var.create_option
    managed_disk_type = var.managed_disk_std_lrs
  }

  os_profile {
    computer_name  = "${var.base_hostname}${format("%02d", count.index + 1)}"
    admin_username = var.username
    admin_password = var.password
  }


  os_profile_windows_config {
    enable_automatic_upgrades = false
    provision_vm_agent        = "true"
  }
}

variables.tf находится ниже:

# Declare env variable
variable "rg_name" {
  type = string
}

variable "vnet_name" {
  type = string
}

variable "subnet_name" {
  type = string
}

variable "app_nsg" {
  type = string
}

variable "vm_count" {
  type = number
}

variable "base_hostname" {
  type = string
}

variable "sto_acc_suffix" {
  type = string
}

variable "sto_acc_tier_std" {
  type    = string
  default = "Standard"
}

variable "sto_acc_rep_type_lrs" {
  type    = string
  default = "LRS"
}

variable "vm_size" {
  type = string
}

variable "vm_publisher" {
  type = string
}

variable "vm_offer" {
  type = string
}

variable "vm_sku" {
  type = string
}

variable "vm_img_version" {
  type = string
}

variable "username" {
  type = string
}

variable "password" {
  type = string
}

variable "caching_option" {
  type    = string
  default = "ReadWrite"
}

variable "create_option" {
  type    = string
  default = "FromImage"
}

variable "managed_disk_std_lrs" {
  type    = string
  default = "Standard_LRS"
}

variable "managed_disk_prem_lrs" {
  type    = string
  default = "Premium_LRS"
}

variable "allowed_source_ips" {
  description = "List of ips from which inbound connection to VMs is allowed"
  type        = list(string)
}

Я запускаю команду ниже для обновления конфигурации terraform до 0,12 и выше.

terraform 0.12upgrade

Ошибка:

Error: Syntax error in configuration file

  on main.tf line 22, in data "azurerm_resource_group" "tf-rg-external":
  22:   name = var.rg_name

Error while parsing: At 22:10: Unknown token: 22:10 IDENT var.rg_name


Error: Syntax error in configuration file

  on variable.tf line 3, in variable "rg_name":
   3:   type = string

Error while parsing: At 3:10: Unknown token: 3:10 IDENT string

Есть идеи, в чем проблема? это сработает, если я не запустил команду terrafom 0.12upgrade. Меня интригует, почему это не работает. Я выполнил ту же команду обновления в другой конфигурации terraform и получил аналогичную ошибку.

Одно наблюдение. Эта ошибка IDENT возникает для первой переменной в файлах main.tf и variable.tf. Невозможно сопоставить эту ошибку.


person learner    schedule 26.11.2019    source источник
comment
Я только что прошел через ту же борьбу, что и в terraform 0.12.15 появились предупреждения об интерполяции строк. Удалить всю интерполяцию можно с помощью команды 0.12upgrade. Однако обновление не выполняется в тех же строках, где VS code linter показывает предупреждения. Я не нашел простого выхода и просто вручную обновил интерполяцию строк.   -  person pijemcolu    schedule 26.11.2019
comment
Однако мне интересно, почему вы обновляетесь до 0.12, если вы, очевидно, уже используете 0.12, как мы можем видеть в синтаксисе?   -  person pijemcolu    schedule 26.11.2019
comment
Мы используем это как это "${var.CLUSTER}"   -  person libik    schedule 26.11.2019
comment
Я не понимаю, почему ты бежишь terraform 0.12upgrade. Каков результат terraform --version в вашем проекте?   -  person pijemcolu    schedule 26.11.2019
comment
На самом деле проблема связана с командой 0.12upgrade. Это приводило к ошибке в вопросе. Кроме того, VS Code выдает ошибку, но на самом деле план терраформирования и применение работают нормально.   -  person learner    schedule 27.11.2019
comment
Но важно отметить, что команда обновления сообщает об ошибке, поэтому код VS сообщает об ошибке, но план терраформирования и применение работает без каких-либо проблем.   -  person learner    schedule 27.11.2019


Ответы (1)


Вы уже используете синтаксис 0.12, команда 0.12upgrade ожидает найти синтаксис 0.11 и попытается автоматически обновить его.

например name = var.rg_name - обратите внимание на отсутствие ${}

См. https://www.terraform.io/docs/commands/0.12upgrade.html

Команда terraform 0.12upgrade применяет несколько правил автоматического обновления, чтобы помочь подготовить модуль , который был написан для Terraform v0.11 для использования с Terraform v0.12.

(Акцент мой)

person Adam Westbrook    schedule 26.11.2019
comment
Я уважаю ваш ответ, но технически он не отличается от ответа в вопросе. Проблема связана с командой 0.12upgrade. Даже если я запустил тысячу раз, он должен просто сообщить о правильной конфигурации, а не об ошибке. - person learner; 27.11.2019
comment
Я понимаю, о чем вы говорите, но в 0.12upgrade документации нет ничего, что предлагало бы вам безопасно запустить его с уже обновленным кодом. Фактически, в документации для параметра -force прямо говорится: Некоторые преобразования, сделанные этой командой, не идемпотентны, поэтому повторный запуск с тем же модулем может изменить значения некоторых выражений в модуле. - terraform.io/docs/commands/0.12upgrade.html#force - person Adam Westbrook; 02.12.2019