Вопрос или проблема
Я пытаюсь использовать общий файл providers.tf в своих различных модулях Terraform, но у меня возникает проблема, когда Terraform постоянно пытается использовать провайдер hashicorp/proxmox
, в то время как, насколько я могу судить, он должен использовать Telmate/proxmox
.
Я также уточню, что я вообще не использую hashicorp/proxmox
, приведенный ниже пример при тестировании содержит только LXC main.tf, LXC parameters.tfvar, globals providers.tf и globals variables.tf.
Пожалуйста, посмотрите на упрощенное представление моей текущей структуры Terraform, у меня сейчас около 10 узлов, и в будущем я планирую значительно увеличить их количество, поэтому есть желание глобализировать некоторые данные.
Я использую
Terraform v1.9.7
на windows_386
│ README.md
│ Setup.ps1
│ terraform-runner.ps1
│
├───globals
│ outputs.tf
│ providers.tf
│ variables.tf
│
├───nodes
│ │
│ ├───Node1
│ │ ├───Backup
│ │ │ │ main.tf
│ │ │ │ output.tf
│ │ │ │ parameters.tfvar
│ │ │ │ variables.tf
│ │ │ │
│ │ │ ├───.terraform
│ │ │ └───scripts
│ │ │ ├───Cron
│ │ │ ├───Shutdown
│ │ │ └───Startup
│ │ │ terraform-runner.ps1
│ │ │
│ │ ├───Cloud-Init
│ │ │ │ main.tf
│ │ │ │ output.tf
│ │ │ │ parameters.tfvar
│ │ │ │ variables.tf
│ │ │ │
│ │ │ ├───.terraform
│ │ │ └───scripts
│ │ │ ├───Cron
│ │ │ ├───Shutdown
│ │ │ └───Startup
│ │ │ terraform-runner.ps1
│ │ │
│ │ ├───Host
│ │ │ │ main.tf
│ │ │ │ output.tf
│ │ │ │ parameters.tfvar
│ │ │ │ variables.tf
│ │ │ │
│ │ │ ├───.terraform
│ │ │ └───scripts
│ │ │ ├───Cron
│ │ │ ├───Shutdown
│ │ │ └───Startup
│ │ │ terraform-runner.ps1
│ │ │
│ │ ├───LXC
│ │ │ │ main.tf
│ │ │ │ output.tf
│ │ │ │ parameters.tfvar
│ │ │ │ variables.tf
│ │ │ │
│ │ │ ├───.terraform
│ │ │ │ ├───modules
│ │ │ │ │ modules.json
│ │ │ │ │
│ │ │ │ └───providers
│ │ │ │ └───registry.terraform.io
│ │ │ │ └───telmate
│ │ │ │ └───proxmox
│ │ │ │ └───3.0.1-rc4
│ │ │ │ └───windows_386
│ │ │ │ LICENSE
│ │ │ │ README.md
│ │ │ │ terraform-provider-proxmox_v3.0.1-rc4.exe
│ │ │ │
│ │ │ └───scripts
│ │ │ ├───Cron
│ │ │ ├───Shutdown
│ │ │ └───Startup
│ │ │ terraform-runner.ps1
│ │ │
│ │ ├───Network
│ │ │ │ main.tf
│ │ │ │ output.tf
│ │ │ │ parameters.tfvar
│ │ │ │ variables.tf
│ │ │ │
│ │ │ ├───.terraform
│ │ │ └───scripts
│ │ │ ├───Cron
│ │ │ ├───Shutdown
│ │ │ └───Startup
│ │ │ terraform-runner.ps1
│ │ │
│ │ ├───Security
│ │ │ │ main.tf
│ │ │ │ output.tf
│ │ │ │ parameters.tfvar
│ │ │ │ variables.tf
│ │ │ │
│ │ │ ├───.terraform
│ │ │ └───scripts
│ │ │ ├───Cron
│ │ │ ├───Shutdown
│ │ │ └───Startup
│ │ │ terraform-runner.ps1
│ │ │
│ │ └───VM
│ │ │ main.tf
│ │ │ output.tf
│ │ │ parameters.tfvar
│ │ │ variables.tf
│ │ │
│ │ ├───.terraform
│ │ └───scripts
│ │ ├───Cron
│ │ ├───Shutdown
│ │ └───Startup
│ │ terraform-runner.ps1
│
└───terraform
terraform.exe
Вот пример моего файла globals/providers.tf
terraform {
required_providers {
proxmox = {
source = "Telmate/proxmox"
version = "3.0.1-rc4"
}
}
}
provider "proxmox" {
pm_tls_insecure = true
pm_api_url = "https://${var.pm_api_url}/api2/json"
pm_user = var.pm_user
pm_password = var.pm_pass
}
Вот пример модуля
module "globals" {
source = "../../../globals"
}
resource "proxmox_lxc" "NginxProxyManager" {
target_node = var.pm_node[0]
hostname = "NginxProxyManager"
ostemplate = "/var/lib/vz/template/cache/debian-11-standard_11.7-1_amd64.tar.zst"
password = "SecurePassword123!"
unprivileged = true
vmid = 100
cores = 2
rootfs {
storage = "local-lvm"
size = "8G"
}
network {
name = "eth0"
bridge = "vmbr0"
ip = "192.168.80.200/24"
gw = "192.168.0.1"
}
features {
nesting = true
}
}
.\nodes\Node1\LXC> ……\terraform\terraform.exe providers
Providers required by configuration:
.
├── provider[registry.terraform.io/hashicorp/proxmox]
└── module.globals
└── provider[registry.terraform.io/telmate/proxmox] 3.0.1-rc4
Я пытался использовать алиас для своих провайдеров и установить провайдер внутри тестового ресурса, но это все равно, похоже, ищет провайдер hashicorp.
Я понимаю, что могу напрямую импортировать это в файл модуля, но в зависимости от того, насколько детально мы хотим сделать это, это может стать очень громоздким, особенно при изменении версий и/или добавлении новых провайдеров в будущем.
Если кто-то может помочь с этим, не упустил ли я что-то очевидное?
Пример точного использования:
.\nodes\Node1\LXC> ……\terraform\terraform.exe init
Initializing the backend...
Initializing modules...
Initializing provider plugins...
- Finding latest version of hashicorp/proxmox...
- Finding telmate/proxmox versions matching "3.0.1-rc4"...
- Installing telmate/proxmox v3.0.1-rc4...
- Installed telmate/proxmox v3.0.1-rc4 (self-signed, key ID A9EBBE091B35AFCE)
Partner and community providers are signed by their developers.
If you'd like to know more about provider signing, you can read about it here:
https://www.terraform.io/docs/cli/plugins/signing.html
╷
│ Error: Failed to query available provider packages
│
│ Could not retrieve the list of available versions for provider hashicorp/proxmox: provider registry registry.terraform.io does not
│ have a provider named registry.terraform.io/hashicorp/proxmox
│
│ Did you intend to use telmate/proxmox? If so, you must specify that source address in each module which requires that provider. To
│ see which modules are currently depending on hashicorp/proxmox, run the following command:
│ terraform providers
Пожалуйста, дайте мне знать, если я упустил какую-либо полезную информацию.
Я пытался использовать алиас для своего провайдера и ссылаться на него в ресурсе. Однако это просто заставляет Terraform искать - Finding latest version of hashicorp/globals...
provider "proxmox" {
alias = "pm"
pm_tls_insecure = true
pm_api_url = "https://${var.pm_api_url}/api2/json"
pm_user = var.pm_user
pm_password = var.pm_pass
}
resource "proxmox_lxc" "NginxProxyManager" {
provider = globals.pm
target_node = var.pm_node[0]
hostname = "NginxProxyManager"
ostemplate = "/var/lib/vz/template/cache/debian-11-standard_11.7-1_amd64.tar.zst"
password = "SecurePassword123!"
...
Ответ или решение
Проблема, с которой вы столкнулись, связана с тем, как Terraform обрабатывает провайдеры в разных модулях рабочего пространства. Давайте подробно рассмотрим, как вы можете решить эту проблему и убедиться, что используется правильный провайдер, а именно Telmate/proxmox
, а не hashicorp/proxmox
.
1. Структура проекта и понимание проблемы
Согласно вашему описанию, вы используете общий файл providers.tf
, чтобы централизовать управление провайдерами для нескольких модулей. Однако Terraform пытается установить провайдер hashicorp/proxmox
, который не является частью вашего проекта. Вместо этого вы хотите использовать провайдер Telmate/proxmox
.
На выходе команды terraform providers
вы видите:
├── provider[registry.terraform.io/hashicorp/proxmox]
└── module.globals
└── provider[registry.terraform.io/telmate/proxmox] 3.0.1-rc4
Это показывает, что один из ваших модулей или конфигураций по умолчанию запрашивает hashicorp/proxmox
. Давайте попробуем выявить, где это может происходить.
2. Решение
Убедитесь, что в каждом модуле необходимо указать источник провайдера
Проблема, о которой вы говорите, указывает на то, что Terraform по умолчанию может использовать провайдеры от hashicorp
, если в модулях ваше определение провайдера у них не указано. Убедитесь, что каждый модуль, который вы используете в вашем проекте, ссылается на правильный источник провайдера.
Например, добавьте следующий код в main.tf
вашего модуля LXC, чтобы указать явный источник провайдера:
terraform {
required_providers {
proxmox = {
source = "Telmate/proxmox"
version = "3.0.1-rc4"
}
}
}
provider "proxmox" {
pm_tls_insecure = true
pm_api_url = "https://${var.pm_api_url}/api2/json"
pm_user = var.pm_user
pm_password = var.pm_pass
}
Это обеспечит, что модуль будет использовать правильный провайдер, когда он инициализируется.
Использование алиасов провайдеров
Если вы хотите использовать алиасы для провайдеров, убедитесь, что вы правильно ссылаетесь на них в ресурсах. Например:
provider "proxmox" {
alias = "pm"
pm_tls_insecure = true
pm_api_url = "https://${var.pm_api_url}/api2/json"
pm_user = var.pm_user
pm_password = var.pm_pass
}
resource "proxmox_lxc" "NginxProxyManager" {
provider = proxmox.pm
target_node = var.pm_node[0]
hostname = "NginxProxyManager"
ostemplate = "/var/lib/vz/template/cache/debian-11-standard_11.7-1_amd64.tar.zst"
password = "SecurePassword123!"
unprivileged = true
vmid = 100
cores = 2
rootfs {
storage = "local-lvm"
size = "8G"
}
network {
name = "eth0"
bridge = "vmbr0"
ip = "192.168.80.200/24"
gw = "192.168.0.1"
}
features {
nesting = true
}
}
Перезагрузка и обновление провайдеров
После того как вы внесли изменения, не забудьте выполнить:
terraform init -upgrade
Это обновит провайдеры и убедится, что Terraform использует ваши новые настройки.
3. Вывод
Если после всех этих корректировок вы по-прежнему видите запрос на hashicorp/proxmox
, возможно, необходимо провести дополнительную проверку на наличие зависимостей в других модулях. Используйте команду terraform providers
для диагностики мест, где может использоваться нежелательный провайдер.
Следуя вышеуказанным рекомендациям и проверкам, вы сможете решить вашу проблему с провайдером в Terraform. Удачи!