#terraform
Вопрос:
Я использую модули terraform для применения принципов DRY в Azure Devops. Мы используем пользовательских поставщиков вместе с официальным поставщиком Azure Devops. Созданные нами модули используются таким образом, чтобы файлы tf, используемые разработчиками, служили только для объявления переменных, поскольку настройка ресурсов выполняется командой разработчиков.
Модуль состоит из файла TF и файла переменных, размещенных в /modules/build_ci
build_ci.tf:
resource "build_definition_resource" "Build_CI" {
trigger_ci = true
solution_name = var.solution_name
repository = var.repository
pool = var.pool
branch = var.branch
branches_ci = var.branches_ci
dynamic "build_template" {
for_each = var.templates
iterator = task
content {
name = task.value["name"]
input = task.value["inputs"]
}
}
}
variables.tf
variable "solution_name" {
type = string
}
variable "repository" {
type = string
}
variable "pool" {
type = string
default = "alm-aws-pool"
}
variable "branch" {
type = string
default = "master"
}
variable "branches_ci" {
type = list(string)
default = ["master", "release/*"]
}
variable "templates" {
type = list(object({
name = string
inputs = map(string)
}))
default = [
{
name = "templates/build/tg1_buildamp;nuget.yaml"
inputs = {
IsNugetPrerelaseVersion = "false"
BuildConfiguration = "Release"
BuildPlatform = "Any CPU"
SearchPatternToPack = "none"
}
},
{
name = "templates/build/TG2_Validations.yaml"
inputs = {
BuildConfiguration = "Release"
}
},
{
name = "templates/build/TG3_Publish.yaml"
inputs = null
}
]
}
компонент build_template вызывает шаблоны yaml, размещенные в другом репозитории.
использование этого модуля будет выглядеть следующим образом
module "app_Build_CI" {
source = "../modules/build_ci"
solution_name = "app"
repository = "app_repository"
}
and the terraform provider is:
provider "test_provider" {
uri = "#{custom_provider_uri}"
}
provider "azuredevops" {
org_service_url = "#{AZDO_ORG_SERVICE_URL}#"
personal_access_token = "#{AZDO_PERSONAL_ACCESS_TOKEN}#"
}
terraform {
required_version = ">= 0.12"
backend "s3" {
bucket = "#{BUCKET}#"
key = "#{KEY}#"
region = "#{REGION}#"
access_key = "#{access_key}#"
role_arn = "#{ARN_ROLE}#"
external_id = "#{EXTERNAL_ID}#"
}
required_providers {
test_provider = {
versions = ["0.2"]
source = "test/provider/test"
}
azuredevops = {
source = "microsoft/azuredevops"
version = ">=0.1.0"
}
repo = {
versions = ["0.2"]
source = "test/provider/test"
}
build = {
versions = ["0.2"]
source = "test/provider/test"
}
}
}
Проблема возникает при выполнении инициализации terraform, мы получаем сообщение об ошибке, в котором говорится, что он не может установить поставщик hashichorp/сборки, который мы не используем. Если я использую старую структуру без модулей, она работает, но при использовании модулей она выходит из строя.
Error: Failed to install provider
Error while installing hashicorp/build: provider registry
registry.terraform.io does not have a provider named
registry.terraform.io/hashicorp/build
Кто-нибудь знает, из-за чего произошла эта ошибка?
Большое спасибо
Ответ №1:
Ошибка заключалась в том, что папка modules должна содержать поставщика, в противном случае она использует официальных поставщиков hashicorp, а не сторонних. Это все, что для этого нужно