Мы столкнулись с проблемой при применении нашей инфраструктуры Terraform на компьютере M1 Mac, где мы использовали шаблон Terraform Provider Template.
При его применении мы получали следующую ошибку:
template v2.2.0 does not have a package available for your current platform, darwin_arm64
Поскольку провайдер архивирован, нам нужно найти альтернативу.
Что означает архивирование?
Согласно документации Terraform Archiving Providers.
- Репозиторий кода и вся история коммитов, выпусков и PR будет по-прежнему доступна.
- Существующие выпущенные двоичные файлы будут по-прежнему доступны на сайте релизов.
- Документация по провайдеру останется на сайте Terraform.
- Проблемы и запросы на исправление не будут отслеживаться, объединяться или добавляться.
- Новые релизы публиковаться не будут.
- Ночные приемочные тесты проводиться не будут.
Итак, какие альтернативы у нас есть вместо устаревшего провайдера?
Давайте рассмотрим пример.
Ресурс, использующий устаревший провайдер Template
Допустим, у нас есть следующий ресурс — grafana dashboard json, который мы храним в нашем коде Terraform.
data "template_file" "grafana_json" {
template = file("${path.module}/grafana_dashboard.json")
vars = {
title = var.monitoring_title
monitoring_datasource_name = var.monitoring_datasource_name
}
}
И ресурс grafana dashboard Terraform:
resource "grafana_dashboard" "metrics" {
config_json = data.template_file.grafana_json.rendered
folder = var.monitoring_folder
}
Когда вы попытаетесь применить этот кусок кода, он выдаст вышеупомянутую ошибку.
Обновление встроенной функции templatefile
Terraform
Мы можем воспользоваться встроенной функцией templatefile
Terraform, которая:
templatefile
считывает файл по заданному пути и отображает его содержимое в виде шаблона, используя предоставленный набор переменных шаблона.
Функция использует формат:
В нашем случае path
— это путь к файлу grafana json.
А vars
содержит все переменные, которые мы должны использовать для json-файла grafana dashboard.
Аргумент «vars» должен быть картой. В файле шаблона каждый из ключей в карте доступен как переменная для интерполяции. Шаблон также может использовать любую другую функцию, доступную в языке Terraform, за исключением того, что рекурсивные вызовы templatefile не разрешены. Имена переменных должны начинаться с буквы, за которой следует ноль или более букв, цифр или знаков подчеркивания.
И наш новый код выглядит следующим образом:
resource "grafana_dashboard" "metrics" {
config_json = templatefile("${path.module}/grafana_dashboard.json", {
title = var.monitoring_title
monitoring_datasource_name = var.monitoring_datasource_name
})
folder = var.monitoring_folder
}
Благодаря новой функции templatefile
мы можем избавиться от источника данных template_file
.
Это означает, что на данном этапе мы больше не полагаемся на поставщика hashicorp/template и можем применить наши инфраструктурные изменения.
В этот момент вы можете применить инфраструктурные изменения, но они все равно могут не сработать и выдать ошибку, и это потому, что если инфраструктура уже была инициализирована и применена ранее, у нас есть запись об устаревшем провайдере, хранящаяся в файле блокировки.
Шаблонный провайдер все еще находится в файле .terraform.lock.hcl
.
Если вы запустили terraform init
и все еще видите, что провайдер шаблонов устанавливается:
Initializing modules...
Initializing the backend...
Initializing provider plugins...
- Reusing previous version of grafana/grafana from the dependency lock file
...
- Reusing previous version of hashicorp/template from the dependency lock file
...
- Using previously-installed hashicorp/template v2.2.0
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
Затем проверьте файл блокировки зависимостей, файл terraform.hcl.lock
. Если вы все еще видите его там:
provider "registry.terraform.io/hashicorp/template" {
version = "2.2.0"
hashes = [
"h1:0wlehNaxBX7GJQnPfQwTNvvAf38Jm0Nv7ssKGMaG6Og=",
"zh:01702196f0a0492ec07917db7aaa595843d8f171dc195f4c988d2ffca2a06386",
"zh:09aae3da826ba3d7df69efeb25d146a1de0d03e951d35019a0f80e4f58c89b53",
"zh:09ba83c0625b6fe0a954da6fbd0c355ac0b7f07f86c91a2a97849140fea49603",
"zh:0e3a6c8e16f17f19010accd0844187d524580d9fdb0731f675ffcf4afba03d16",
"zh:45f2c594b6f2f34ea663704cc72048b212fe7d16fb4cfd959365fa997228a776",
"zh:77ea3e5a0446784d77114b5e851c970a3dde1e08fa6de38210b8385d7605d451",
"zh:8a154388f3708e3df5a69122a23bdfaf760a523788a5081976b3d5616f7d30ae",
"zh:992843002f2db5a11e626b3fc23dc0c87ad3729b3b3cff08e32ffb3df97edbde",
"zh:ad906f4cebd3ec5e43d5cd6dc8f4c5c9cc3b33d2243c89c5fc18f97f7277b51d",
"zh:c979425ddb256511137ecd093e23283234da0154b7fa8b21c2687182d9aea8b2",
]
}
Проверьте, кому требуется провайдер (возможно, он все еще используется в коде в другом месте). Это можно сделать, выполнив команду terraform providers
, которая:
Команда terraform providers показывает информацию о требованиях к провайдерам конфигурации в текущем рабочем каталоге, помогая понять, откуда было обнаружено каждое требование.
Providers required by configuration:
.
├── provider[registry.terraform.io/grafana/grafana]
├── ...
├── ...
├── ...
├── module.grafana
│ └── provider[registry.terraform.io/grafana/grafana]
└── module.module
├── ...
Providers required by state:
provider[registry.terraform.io/hashicorp/template]
provider[registry.terraform.io/grafana/grafana]
В данном случае мы видим, что провайдер шаблонов требуется государству.
Чтобы избавиться от этой зависимости, убедитесь, что вы обновили Terraform до версии выше v.1.1.3. и это потому, что они исправили следующую проблему: https://github.com/hashicorp/terraform/pull/30192 в версии 1.1.3.
Чтобы обновить файл блокировки и удалить запись для устаревшего поставщика шаблонов, мы запускаем terraform init
.
Это связано с тем, что Terraform полагается на два источника для определения истины: саму конфигурацию и состояние. Если вы удалите зависимость от определенного провайдера как из конфигурации, так и из состояния, то запуск terraform init
удалит все существующие записи в файле блокировки для этого провайдера.
И давайте посмотрим на результат:
Initializing modules...
Initializing the backend...
Successfully configured the backend "azurerm"! Terraform will automatically
use this backend unless the backend configuration changes.
Initializing provider plugins...
- Reusing previous version of grafana/grafana from the dependency lock file
- Using previously-installed grafana/grafana v1.17.0
Terraform has made some changes to the provider dependency selections recorded
in the .terraform.lock.hcl file. Review those changes and commit them to your
version control system if they represent changes you intended to make.
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
И мы видим, что провайдера шаблонов больше нет.
Теперь вы можете смело фиксировать только что обновленный файл блокировки зависимостей.