Частично удаленный сервер Terraform не может содержать интерполяции?

#terraform #terraform-provider-aws #terraform-enterprise

#terraform #terraform-provider-aws #terraform-enterprise

Вопрос:

Я пытаюсь настроить рабочее пространство Terraform enterprise в Jenkins «на лету». Для этого мне нужно иметь возможность задать имя рабочей области удаленного серверного сервера в моем main.tf динамически. Вот так:

 # Using a single workspace:
terraform {
  backend "remote" {
    hostname = "app.xxx.xxx.com"
    organization = "YYYY"


    # new workspace variable
    workspaces {
      name = "${var.workspace_name}"
    }
  }
}
  

Теперь, когда я запускаю:

     terraform init -backend-config="workspace_name=testtest"
  

Я получаю:

 Error loading backend config: 1 error(s) occurred:

* terraform.backend: configuration cannot contain interpolations

The backend configuration is loaded by Terraform extremely early, before
the core of Terraform can be initialized. This is necessary because the backend
dictates the behavior of that core. The core is what handles interpolation
processing. Because of this, interpolations cannot be used in backend
configuration.

If you'd like to parameterize backend configuration, we recommend using
partial configuration with the "-backend-config" flag to "terraform init".
  

Возможно ли то, что я хочу сделать с terraform?

Ответ №1:

Вы не можете помещать какие-либо переменные "${var.workspace_name}" или интерполяции в хранилище состояния удаленного сервера. Однако вы можете создать файл рядом со значениями вашего сервера, он может выглядеть следующим образом в main.tf файле:

 # Terraform backend State-Sotre
terraform {
  backend "s3" {}
}
  

и в dev.backend.tfvars , например:

 bucket         = "BUCKET_NAME"

encrypt        = true

key            = "BUCKET_KEY"

dynamodb_table = "DYNAMODB_NAME"

region         = "AWS_REGION"

role_arn       = "IAM_ROLE_ARN"
  

Вы также можете использовать частичную конфигурацию для серверной части s3.
Надеюсь, это поможет.

Комментарии:

1. Этот ответ предназначен для серверной части S3? Я пытаюсь создать удаленный сервер, подключенный к terraform enterprise.

2. С учетом этой детали backend "s3" {} да, это так. Я действительно не знаю Terraform Enterprise, но я предполагаю, что это работает так же, как версия с открытым исходным кодом. С поставщиком GCP это будет terraform { backend "gcs" {} } например

3. На самом деле мне нужно, чтобы серверная часть была удаленной terraform enterprise. Я чувствую, что должен быть способ создать рабочее пространство с динамическим именем в TFE с помощью этой настройки. Одним из вариантов было бы выполнение вызовов API, но эта настройка удаленного серверного сервера настолько проста для понимания. Кроме того, он не дублирует рабочие области и все такое. Хотелось бы иметь возможность сделать это таким образом.

4. Спасибо — это первое место, где я нашел правильный пример частичной конфигурации TF с использованием файла, а не переменных CLI.

Ответ №2:

Эй, я нашел правильный способ сделать это:

Хотя синтаксис немного сложный, удаленный сервер поддерживает частичную инициализацию серверной части. Это означает, что конфигурация может содержать внутренний блок, подобный этому:

 terraform {
  backend "remote" { }
}
  

И затем Terraform можно инициализировать с помощью динамически настраиваемой конфигурации серверной части, подобной этой (заменив ORG и WORKSPACE соответствующими значениями):

 terraform init -backend-config "organization=ORG" -backend-config 'workspaces=[{name="WORKSPACE"}]'