Terraform постоянно пытается использовать провайдер hashicorp/proxmox.

Вопрос или проблема

Я пытаюсь использовать общий файл 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. Удачи!

Оцените материал
Добавить комментарий

Капча загружается...