Почему я получаю сообщение «Обязательное поле не установлено», следуя руководству: Создание кластера виртуальных машин Azure с Terraform и HCL? - PullRequest
0 голосов
/ 06 мая 2020

Пробовал настроить azure vms с использованием terraform впервые -

https://docs.microsoft.com/en-us/azure/developer/terraform/create-vm-cluster-with-infrastructure

 resource "azurerm_resource_group" "test" {  name     = "acctestrg" 
 location = "West US 2" }

 resource "azurerm_virtual_network" "test" {  name                =
 "acctvn"  address_space       = ["10.0.0.0/16"]  location            =
 azurerm_resource_group.test.location  resource_group_name =
 azurerm_resource_group.test.name }

 resource "azurerm_subnet" "test" {  name                 = "acctsub" 
 resource_group_name  = azurerm_resource_group.test.name 
 virtual_network_name = azurerm_virtual_network.test.name 
 address_prefix       = "10.0.2.0/24" }

 resource "azurerm_public_ip" "test" {  name                         =
 "publicIPForLB"  location                     =
 azurerm_resource_group.test.location  resource_group_name          =
 azurerm_resource_group.test.name  allocation_method            =
 "Static" }

 resource "azurerm_lb" "test" {  name                = "loadBalancer" 
 location            = azurerm_resource_group.test.location 
 resource_group_name = azurerm_resource_group.test.name

  frontend_ip_configuration {    name                 =
 "publicIPAddress"    public_ip_address_id = azurerm_public_ip.test.id 
 } }

 resource "azurerm_lb_backend_address_pool" "test" { 
 resource_group_name = azurerm_resource_group.test.name 
 loadbalancer_id     = azurerm_lb.test.id  name                =
 "BackEndAddressPool" }

 resource "azurerm_network_interface" "test" {  count               = 2
 name                = "acctni${count.index}"  location            =
 azurerm_resource_group.test.location  resource_group_name =
 azurerm_resource_group.test.name

  ip_configuration {    name                          =
 "testConfiguration"    subnet_id                     =
 azurerm_subnet.test.id    private_ip_address_allocation = "dynamic"  }
 }

 resource "azurerm_managed_disk" "test" {  count                = 2 
 name                 = "datadisk_existing_${count.index}"  location   
 = azurerm_resource_group.test.location  resource_group_name  = azurerm_resource_group.test.name  storage_account_type =
 "Standard_LRS"  create_option        = "Empty"  disk_size_gb         =
 "1023" }

 resource "azurerm_availability_set" "avset" {  name                   
 = "avset"  location                     = azurerm_resource_group.test.location  resource_group_name          =
 azurerm_resource_group.test.name  platform_fault_domain_count  = 2 
 platform_update_domain_count = 2  managed                      = true
 }

 resource "azurerm_virtual_machine" "test" {  count                 = 2
 name                  = "acctvm${count.index}"  location             
 = azurerm_resource_group.test.location  availability_set_id   = azurerm_availability_set.avset.id  resource_group_name   =
 azurerm_resource_group.test.name  network_interface_ids =
 [element(azurerm_network_interface.test.*.id, count.index)]  vm_size  
 = "Standard_DS1_v2"

  # Uncomment this line to delete the OS disk automatically when
 deleting the VM  # delete_os_disk_on_termination = true

  # Uncomment this line to delete the data disks automatically when
 deleting the VM  # delete_data_disks_on_termination = true

  storage_image_reference {    publisher = "Canonical"    offer     =
 "UbuntuServer"    sku       = "16.04-LTS"    version   = "latest"  }

  storage_os_disk {    name              = "myosdisk${count.index}"   
 caching           = "ReadWrite"    create_option     = "FromImage"   
 managed_disk_type = "Standard_LRS"  }

  # Optional data disks  storage_data_disk {    name              =
 "datadisk_new_${count.index}"    managed_disk_type = "Standard_LRS"   
 create_option     = "Empty"    lun               = 0    disk_size_gb  
 = "1023"  }

  storage_data_disk {    name            =
 element(azurerm_managed_disk.test.*.name, count.index)   
 managed_disk_id = element(azurerm_managed_disk.test.*.id, count.index)
 create_option   = "Attach"    lun             = 1    disk_size_gb    =
 element(azurerm_managed_disk.test.*.disk_size_gb, count.index)  }

  os_profile {    computer_name  = "hostname"    admin_username =
 "testadmin"    admin_password = "Password1234!"  }

  os_profile_linux_config {    disable_password_authentication = false 
 }

  tags = {    environment = "staging"  } }

Все еще не удалось настроить.

Выполнение плана terraform всегда выдает следующую ошибку - Abhisheks-MBP: first abhisheksingh $ terraform plan

Ошибка: "features": обязательное поле не установлено

Согласно количеству stackoverflow questions, я попытался добавить блок поставщиков с пустым разделом функций. Я также пытался привязать версию к 2.0.0. Однако каждый раз, когда загружается версия 2.8.0, снова появляется та же ошибка. Кто-нибудь знает, что нужно делать? Это довольно неприятно для тех, кто пробует впервые. Что это за учебник, что он позволяет вам столько бороться с первого раза.

Abhisheks-MBP: first abhisheksingh $ terraform -v Terraform v0.12.24 + provider.azurerm v2.8.0

Я даже добавил в tf-файл следующий раздел -

Azure Provider / s provider "azurerm" {version = "= 2.0.0" features {}}

Но не помогает !!

Почему я получаю сообщение «Обязательное поле не установлено» при выполнении инструкций: Создание кластера Azure ВМ с Terraform и HCL?

Ответы [ 2 ]

1 голос
/ 10 мая 2020

Я могу подтвердить, что это руководство работает, я также сопоставил версии вашего Terraform и Azure провайдера:

Terraform v0.12.24
+ provider.azurerm v2.8.0

Ошибка будет означать, что Terraform не нашел указанный блок provider и предоставленный вами код sample не устанавливает его, поэтому, предполагая, что вы предоставили весь файл main.tf, я бы предложил добавить следующий блок в начало вашего main.tf файла

provider "azurerm" {
  version = "2.8.0"
  features {}
}

Также убедитесь, что вы находитесь в каталог, в котором main.tf находится при запуске terraform init и terraform plan

Я добился успеха со следующими main.tf

provider "azurerm" {
  version = "2.8.0"
  features {}
}

resource "azurerm_resource_group" "test" {
  name     = "acctestrg"
  location = "West US 2"
}

resource "azurerm_virtual_network" "test" {
  name                = "acctvn"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.test.location
  resource_group_name = azurerm_resource_group.test.name
}

resource "azurerm_subnet" "test" {
  name                 = "acctsub"
  resource_group_name  = azurerm_resource_group.test.name
  virtual_network_name = azurerm_virtual_network.test.name
  address_prefix       = "10.0.2.0/24"
}

resource "azurerm_public_ip" "test" {
  name                = "publicIPForLB"
  location            = azurerm_resource_group.test.location
  resource_group_name = azurerm_resource_group.test.name
  allocation_method   = "Static"
}

resource "azurerm_lb" "test" {
  name                = "loadBalancer"
  location            = azurerm_resource_group.test.location
  resource_group_name = azurerm_resource_group.test.name
  frontend_ip_configuration {
    name                 = "publicIPAddress"
    public_ip_address_id = azurerm_public_ip.test.id
  }
}

resource "azurerm_lb_backend_address_pool" "test" {
  resource_group_name = azurerm_resource_group.test.name
  loadbalancer_id     = azurerm_lb.test.id
  name                = "BackEndAddressPool"
}


resource "azurerm_network_interface" "test" {
  count               = 2
  name                = "acctni${count.index}"
  location            = azurerm_resource_group.test.location
  resource_group_name = azurerm_resource_group.test.name
  ip_configuration {
    name                          = "testConfiguration"
    subnet_id                     = azurerm_subnet.test.id
    private_ip_address_allocation = "dynamic"
  }
}


resource "azurerm_managed_disk" "test" {
  count                = 2
  name                 = "datadisk_existing_${count.index}"
  location             = azurerm_resource_group.test.location
  resource_group_name  = azurerm_resource_group.test.name
  storage_account_type = "Standard_LRS"
  create_option        = "Empty"
  disk_size_gb         = "1023"
}

resource "azurerm_availability_set" "avset" {
  name                         = "avset"
  location                     = azurerm_resource_group.test.location
  resource_group_name          = azurerm_resource_group.test.name
  platform_fault_domain_count  = 2
  platform_update_domain_count = 2
  managed                      = true
}


resource "azurerm_virtual_machine" "test" {
  count                 = 2
  name                  = "acctvm${count.index}"
  location              = azurerm_resource_group.test.location
  availability_set_id   = azurerm_availability_set.avset.id
  resource_group_name   = azurerm_resource_group.test.name
  network_interface_ids = [element(azurerm_network_interface.test.*.id, count.index)]
  vm_size               = "Standard_DS1_v2"
  # Uncomment this line to delete the OS disk automatically when deleting the VM  
  delete_os_disk_on_termination = true
  # Uncomment this line to delete the data disks automatically when deleting the VM  
  delete_data_disks_on_termination = true
  storage_image_reference {
    publisher = "Canonical"
    offer     = "UbuntuServer"
    sku       = "16.04-LTS"
    version   = "latest"
  }
  storage_os_disk {
    name              = "myosdisk${count.index}"
    caching           = "ReadWrite"
    create_option     = "FromImage"
    managed_disk_type = "Standard_LRS"
  }
  # Optional data disks  
  storage_data_disk {
    name              = "datadisk_new_${count.index}"
    managed_disk_type = "Standard_LRS"
    create_option     = "Empty"
    lun               = 0
    disk_size_gb      = "1023"
  }
  storage_data_disk {
    name            = element(azurerm_managed_disk.test.*.name, count.index)
    managed_disk_id = element(azurerm_managed_disk.test.*.id, count.index)
    create_option   = "Attach"
    lun             = 1
    disk_size_gb    = element(azurerm_managed_disk.test.*.disk_size_gb, count.index)
  }
  os_profile {
    computer_name  = "hostname"
    admin_username = "testadmin"
    admin_password = "Password1234!"
  }
  os_profile_linux_config {
    disable_password_authentication = false
  }
  tags = { environment = "staging" }
}

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

Надеюсь, это поможет.

0 голосов
/ 06 мая 2020

Вы не одиноки, у меня такая же ошибка ...
если я просто скопирую и вставлю код из этого руководства, я получу:
Error: "features": required field is not set

Я вижу, что это не имеет блока провайдера, это должно быть что-то вроде:

provider "azurerm" { 
    # The "feature" block is required for AzureRM provider 2.x. 
    # If you are using version 1.x, the "features" block is not allowed.
    version = "~>2.0"
    features {}
}

Другие учебники охватывают это:

https://docs.microsoft.com/en-us/azure/developer/terraform/create-vm-cluster-module#set -up-authentication-with- azure

Обоснованное предположение, что никто на самом деле не просматривает эти руководства.
Все, что вы можете сделать, это оставить им комментарий, чтобы сообщить им ...

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