Я искал в Интернете, но не нашел ничего близкого к ответу. У меня есть следующий main.tf :
terraform {
cloud {
organization = "my-organization"
workspaces {
tags = ["app:myapplication"]
}
}
}
Я использую облако terraform и хочу использовать рабочее пространство для автоматизации. Для этого мне нужно сначала выполнить terraform init :
/my/path # terraform init
Initializing Terraform Cloud...
No workspaces found.
There are no workspaces with the configured tags (app:myapplication) in your Terraform Cloud organization. To finish initializing, Terraform needs at least one workspace available.
Terraform can create a properly tagged workspace for you now. Please enter a name to create a new Terraform Cloud workspace.
Enter a value:
Я хотел бы сделать что-то в этом роде:
terraform init -workspace=my-workspace
так что он создается, если он не существует. Но ничего не нахожу. Единственный способ создать первое рабочее пространство — вручную.
Как это сделать в автоматизации с помощью ci/cd?
[редактировать] команды рабочей области terraform недоступны до инициализации
/src/terraform # terraform workspace list
Error: Terraform Cloud initialization required: please run "terraform init"
Reason: Initial configuration of Terraform Cloud.
Changes to the Terraform Cloud configuration block require reinitialization, to discover any changes to the available workspaces.
To re-initialize, run: terraform init
Terraform has not yet made changes to your existing configuration or state.
Я не могу выполнить команду рабочей области terraform до инициализации terraform
Хорошо, что ты можешь сделать?
Yoann и @MarkoE CLI и облачные рабочие пространства — это не одно и то же. См. объяснение здесь: terraform.io/cli/workspaces#managing-workspaces.
Вам нужно будет использовать TF Cloud/TFE API. Вы используете TF Cloud, но можете изменить конечную точку, чтобы ваша установка использовала TFE.
Сначала вам нужно перечислить рабочие области TF Cloud:
curl \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/vnd.api+json" \
https://app.terraform.io/api/v2/organizations/my-organization/workspaces
где my-organization
— ваша организация TF Cloud. Это вернет рабочие области в формате JSON. Затем вам нужно будет проанализировать JSON и перебрать карты/хэши/словари существующих рабочих пространств TF Cloud. Для каждой итерации внутри data
, а затем ключа name
будет вложенное значение для имени рабочей области. Вы должны собрать имена рабочих пространств и сравнить их с именем рабочего пространства, которое вы хотите создать. Если нужной рабочей области нет в списке рабочих областей, то вы создать рабочее пространство TF Cloud:
curl \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/vnd.api+json" \
--request POST \
--data @payload.json \
https://app.terraform.io/api/v2/organizations/my-organization/workspaces
снова заменив вашу организацию и вашу конкретную полезную нагрузку. Затем вы можете terraform init
успешно указать бэкэнд рабочее пространство Tf Cloud.
Обратите внимание, что если вы выполняете это в автоматическом режиме, как указано в вопросе, то агенту сборки необходимо подключение к TF Cloud.
Вот это да! большое спасибо, я надеялся на что-то более... хм, менее сложное. Но я предполагаю, что это путь с Hashicorp Terraform. Большое спасибо!
@Yoann Проголосуйте за / примите ответ, так как он решил ваш вопрос, пожалуйста, и спасибо.
Как бы то ни было, это приглашение terraform init
ввести имя рабочей области приводит к тому, что Terraform CLI делает практически тот же запрос API, что и второй в этом ответе, поэтому между этими двумя не должно быть функциональной разницы. terraform init
действует как ориентированный на человека интерактивный пользовательский интерфейс для этого API, но если вы все равно собираетесь автоматизировать, то проще вообще исключить Terraform CLI из смеси и просто использовать API напрямую.
Другой вариант, если у вас есть какие-то систематические соглашения для ваших рабочих областей, — это управлять своими рабочими областями Terraform Cloud с помощью самого Terraform с поставщиком hashicorp/tfe
. Это еще одна оболочка вокруг того же API, и она может быть полезна, если вам нужно делать это на постоянной/повторяющейся основе, а не просто разово, как здесь предназначено terraform init
.
спасибо тебе @MartinAtkins. Жаль, что terraform cli не очень хорошо отражает детализацию своего API.
Ну, вы можете сделать
terraform workspace list
, grep для того, который вы хотите проверить, присутствует, а затемterraform workspace new <workspace-name>
. Это, конечно, произойдет до запуска шага инициализации.