В этой статье мы сосредоточимся на том, как развернуть инфраструктуру как код из среды Azure DevOps с помощью Terraform Cloud/Enterprise (TFE).
Для достижения этой цели существует два варианта:
В обоих вариантах мы развернем простой модуль вывода в Terraform.
output "hello_world" {
value = "Hello, World! We used the VSC/CLI workflow for this POC :)"
}
Весь код можно найти в моем репозитории GitHub.
Вот некоторые предположения, которые вы должны иметь перед началом:
Этот подход заключается в связывании конкретной ветки репозитория ADO, содержащей вашу конфигурацию TF, с рабочей областью TF Cloud.
Это можно использовать для автоматизации:
Этот подход имитирует ручные шаги по запуску terraform login
и последующему введению токена TFE. Обычно при этом создается следующий файл конфигурации CLI (.terraformrc
или terraform.rc
):
credentials "app.terraform.io" {
token = "xxxxxx.yyyyyyy.zzzzzzzzzzzzz"
}
Чтобы автоматизировать этот шаг в вашем конвейере:
terraform {
backend "remote"{
organization = "YOUR-TFE-ORGANIZATION" #REPLACE_ME
workspaces {
name = "YOUR-TFE-WORKSPACE" #REPLACE_ME
}
}
}
Чтобы подключиться к TFE/Cloud, вам необходимо предоставить учетные данные токена API. Как поясняется в документации по TF, предоставленный токен должен быть либо токеном пользователя, либо токеном команды; токены организации нельзя использовать для действий CLI Terraform.
TF_CLI_CONFIG_FILE
. variables:
- group: terraform-env
steps:
- script: |
RC_FILE=".terraformrc"
cat > ${RC_FILE} << EOF
credentials "app.terraform.io" {
token = "$(terraform-api-token)"
}
EOF
mv .terraformrc ~/.terraformrc
export TF_CLI_CONFIG_FILE="~/.terraformrc"
name: terraform_cloud_credentials
displayName: 'Terraform Cloud Credentials'
Полный конвейер ADO должен выглядеть примерно так:
variables:
- group: terraform-env
steps:
- task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-installer.TerraformInstaller@0
displayName: 'Use Terraform latest'
- script: |
RC_FILE=".terraformrc"
cat > ${RC_FILE} << EOF
credentials "app.terraform.io" {
token = "$(terraform-api-token)"
}
EOF
mv .terraformrc ~/.terraformrc
export TF_CLI_CONFIG_FILE="~/.terraformrc"
name: terraform_cloud_credentials
displayName: 'Terraform Cloud Credentials'
- task: TerraformCLI@0
inputs:
command: 'init'
backendType: 'selfConfigured'
allowTelemetryCollection: true
- task: TerraformCLI@0
inputs:
command: 'plan'
allowTelemetryCollection: true
- task: TerraformCLI@0
inputs:
command: 'apply'
allowTelemetryCollection: true
- script: |
rm ~/.terraformrc
name: terraform_cloud_credentials_cleanup
displayName: 'Terraform Cloud Credentials Clean Up'
Что касается подхода VC, terraform plan запускает спекулятивный план в облачной рабочей области Terraform, а terraform apply запускает обычный план и применяет.
При запуске конвейера вы должны увидеть запуски «Запущено через CLI» в своей рабочей области:
Полный код можно найти в моем репозитории GitHub.