Частичный удаленный бэкэнд Terraform не может содержать интерполяции? - PullRequest
2 голосов
/ 03 апреля 2019

Я пытаюсь настроить рабочее пространство 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?

Ответы [ 2 ]

2 голосов
/ 03 апреля 2019

Вы не можете поместить переменные "${var.workspace_name}" или интерполяции в Backend Remote State Store. Тем не менее, вы можете создать файл рядом со своими значениями Backend, он может выглядеть следующим образом в 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 Backend . Надеюсь, это поможет.

0 голосов
/ 04 апреля 2019

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

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

terraform {
  backend "remote" { }
}

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

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