Я прохожу курс Введение в Terraform на Azure и на главе 4 я могу легко Создать группу ресурсов в Terraform с помощью этого кода:
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "3.51.0"
}
}
}
provider "azurerm" {
features{}
}
resource "azurerm_resource_group" "main"{
name = "learn-tf-rg-switzerlandnorth"
location = "switzerlandnorth"
}
Потом я иду спать.
На следующий день смотрю видео Создание виртуальной сети и добавляю в свой код несколько строчек:
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "3.51.0"
}
}
}
provider "azurerm" {
features{}
}
resource "azurerm_resource_group" "main"{
name = "learn-tf-rg-switzerlandnorth"
location = "switzerlandnorth"
}
# Create a virtual network
resource "azure_virtual_network" "main"{
name = "learn-tf-vnet-switzerlandnorth"
locatoin = azurerm_resource_group.main.location
resource_group_name = azurerm_resource_group.main.name
address_space = ["10.0.0.0/16"]
}
Теперь, если я попытаюсь запустить terraform plan
, я получу:
│ Error: Inconsistent dependency lock file
│
│ The following dependency selections recorded in the lock file are inconsistent with the current configuration:
│ - provider registry.terraform.io/hashicorp/azure: required by this configuration but no version is selected
│
│ To update the locked dependency selections to match a changed configuration, run:
│ terraform init -upgrade
Итак, я запускаю terraform init -upgrade
и получаю:
│ Error: Failed to query available provider packages
│
│ Could not retrieve the list of available versions for provider hashicorp/azure: provider registry registry.terraform.io does not have a provider named registry.terraform.io/hashicorp/azure
│
│ Did you intend to use terraform-providers/azure? If so, you must specify that source address in each module which requires that provider. To see which modules are currently depending on
│ hashicorp/azure, run the following command:
│ terraform providers
Итак, я запускаю terraform providers
и получаю:
Провайдеры, требуемые конфигурацией:
.
├── provider[registry.terraform.io/hashicorp/azurerm] 3.51.0
└── provider[registry.terraform.io/hashicorp/azure]
Providers required by state:
provider[registry.terraform.io/hashicorp/azurerm]
Я новичок в Терраформе.
В чем проблема?
Я проверил с проблемой:
Инициализированный код без каких-либо заблокированных ресурсов, что успешно. Добавлены строки кода, которые вы добавили для проверки .
resource "azure_virtual_network" "main"{ name = "learn-tf-vnet-switzerlandnorth" locatoin = data.azurerm_resource_group.main.location resource_group_name = data.azurerm_resource_group.main.name address_space = ["10.0.0.0/16"] }
Полученная ошибка:
Error: Failed to query available provider packages
│
│ Could not retrieve the list of available versions for provider hashicorp/azure: provider registry registry.terraform.io does not have a provider named
│ registry.terraform.io/hashicorp/azure
│
│ Did you intend to use terraform-providers/azure? If so, you must specify that source address in each module which requires that provider. To see which modules are
│ currently depending on hashicorp/azure, run the following command:
│ terraform providers
Это произошло из-за отсутствия блока ресурсов в реестре terraform в провайдере azurerem с resource "azure_virtual_network"
.
Правильный вариант resource "azurerm_virtual_network"
.
При исправлении это могло быть успешно инициализировано.
Успешно создан Vnet после terraform apply
:
На портале Azure: создается виртуальная сеть:
Ссылка: azurerm_virtual_network | Ресурсы | хашикорп/азурерм | Реестр Terraform
Я думаю, что
azure_virtual_network
должно бытьazurerm_virtual_network
- вы непреднамеренно создали зависимость от несуществующего провайдераazure
с помощьюazure_virtual_network
, и это конфликтует с файлом блокировки, который предназначен для защиты вас от непреднамеренных изменений провайдера (терраформ использует имя типа ресурса как руководство по тому, какой провайдер определяет его — см. developer.hashicorp.com/terraform/language/resources/syntax, в котором говорится: «По соглашению имена типов ресурсов начинаются с предпочтительного локального имени их провайдера»)