Рубрики
Uncategorized

Автогенерирование Terraform State Storation в Azure

В моем последнем посте Azure/Terraform я коснулся того, как я решил «курицу и яйцо … помеченные лазурными, терраформи, Devops, Azurevops.

В моем последнем сообщении Azure/Terraform я затронул, как я решил проблему «курицы и яйца» с Terraform: как вам нужны облачные ресурсы для хранения штата Terraform, но вы не можете использовать Terraform для создания этих облачных ресурсов. Этот пост подробно описывает решение этой проблемы.

Проблема «курица и яйца» с Terraform, для меня, может быть кратко определена с четырьмя точками:

  1. Я хочу написать Terraform для создания ресурсов в облачном провайдере.
  2. Я не хочу управлять терраформ на местном уровне.
  3. Я хочу хранить свое государство Terraform в том же облачном провайдере.
  4. Как я могу создать ресурсы облачного поставщика, которые хранят мое государство Terraform?

Вместо того, чтобы полагаться на Terraform для создания ресурсов облачного поставщика, которые будут хранить ваше состояние Terraform, вы вместо этого используете нативные инструменты облачного поставщика для создания и управления этими ресурсами. Поскольку я сейчас работаю в Azure, я буду использовать Azure’s AZ CLI инструмент . Этот тип решения также имеет отношение к AWS AWS Кли и GCP gcloud CLI , если вы хотите использовать их вместо этого.

Сценарий

В каждом из моих репозиториев, в которых размещаются определения терраформы (которые являются каждому репозиторию в конце дня), у меня есть дополнительный сценарий: Create storage.sh Анкет

Это сценарий BASH, потому что я разрабатываю .NET .NET Core, и мои машины сборки/развертывания основаны на Linux в Azure DevOps. Это так же легко может быть сценарием PowerShell, если его нужно выполнить в среде Windows.

Берегись!: Если вы хотите самую последнюю версию сценария, пожалуйста, иди сюда Вместо того, чтобы доверять этому статическому веб -сайту.

#!/bin/sh

# Heads up! You need to define the following environment variables:
# RESOURCE_GROUP_NAME for the resource group that will contain the Azure Storage Account that will house your Terraform state files
# STORAGE_ACCOUNT_NAME for the name of the Azure Storage Account
# KEYVAULT_NAME to store the Storage Account's access key, so you don't have to manually keep track of it
# LOCATION for the location of the Azure resources
# KEYVAULT_SECRET_NAME for the name of the secret in Key VAult of the Storage Account's access key
# CONTAINER_NAME for the Azure Blob Storage's container that will hold the Terraform state file(s)

RESOURCE_GROUP_NAME=mm-terraform-rg
STORAGE_ACCOUNT_NAME=mmterraform
KEYVAULT_NAME=mm-terraform-kv

# Create resource group
az group create --name ${RESOURCE_GROUP_NAME} --location ${LOCATION}

# Create storage account
az storage account create --resource-group ${RESOURCE_GROUP_NAME} --name ${STORAGE_ACCOUNT_NAME} --sku Standard_LRS --encryption-services blob

# Get storage account key
ACCOUNT_KEY=$(az storage account keys list --resource-group ${RESOURCE_GROUP_NAME} --account-name ${STORAGE_ACCOUNT_NAME} --query [0].value -o tsv)

# Create Key Vault
az keyvault create --name ${KEYVAULT_NAME} --resource-group ${RESOURCE_GROUP_NAME} --location ${LOCATION}

# Store account key in secret
az keyvault secret set --name ${KEYVAULT_SECRET_NAME} --vault-name ${KEYVAULT_NAME} --value $ACCOUNT_KEY

# Create blob container
az storage container create --name ${CONTAINER_NAME} --account-name ${STORAGE_ACCOUNT_NAME} --account-key $ACCOUNT_KEY

Переменные среды

Есть несколько переменных среды, которые требуются при приведенном выше сценарии.

Название ресурсной группы, в которой будут размещены все ресурсы, полученные для хранилища Terraform State Resource_group_name
Расположение ресурсной группы (и последующие ресурсы, расположенные в группе ресурсов) МЕСТО НАХОЖДЕНИЯ
Название учетной записи хранилища Azure, которую мы будем создавать хранилище BLOB Storage_account_name
Название контейнера для хранения Azure в хранилище Blob Blob. На самом деле это будет держать файлы состояния терраформ Container_name
Название Vault Key Vault для создания для хранения ключа учетной записи Hazure Storage. Это позволяет нам автоматизировать запуск файлов Terraform без необходимости хранить ключ Keyvault_name
Название секрета, в котором будет храниться ключ учетной записи Azure Storage Keyvault_secret_name

Определите особую заметку тому факту, что мы генерируем секрет Vault Key Vault и Vault Azure, чтобы управлять хранением ключа учетной записи Azure Storage. Хотя это технически не необходимо, и мы могли бы просто запросить саму учетную запись хранилища Azure для ключа в любое время, когда мы нуждаемся в нем (как видно в Получить ключ учетной записи хранения раздел сценария), у Azure DevOps плотные

Процесс

Функциональность в самом файле довольно похожа. Сам файл не особенный, так как он в основном такой же, как и то, что Azure предоставляет в своих документах Анкет Интересными битами, которые являются особыми, являются экспорт ключа учетной записи хранения в ключевое хранилище для последующего использования в Azure Tipeline во время развертывания.

Трубопровод

Наличие этого файла существует полезно, но он не совсем связывает доставку ресурсов и «автоматическую генерирующую» часть в реальном сценарии. Чтобы сделать это, я использую Azure Tipvines в предложении Azure DevOps.

Строить трубопровод

По мере того, как Azure Tipelines могут использовать YAML для определения конвейеров сборки, у меня есть Azure-Pipelines.yml Файл в корне каждого репозитория. В этом файле YAML у меня есть следующий фрагмент:

variables:
  AZURE_SUBSCRIPTION: 'xxx'
  APPLICATION: 'xxx'
  CONTAINER_NAME: $(ENVIRONMENT_PREFIX)terraform
  KEYVAULT_NAME: $(APPLICATION)-terraform-kv
  KEYVAULT_SECRET_NAME: $(ENVIRONMENT_PREFIX)-storage-account-key
  LOCATION: 'eastus'
  RESOURCE_GROUP_NAME: $(APPLICATION)-terraform-rg
  STORAGE_ACCOUNT_NAME: $(APPLICATION)terraform
  TF_IN_AUTOMATION: 'true'

stages:
- stage: Setup
  jobs:
  - job: SetupDevelopmentStorage
    variables:
      ENVIRONMENT_PREFIX: 'd'
      ENVIRONMENT_NAME: 'development'
    displayName: 'Setup Development Storage'
    steps:
    - task: AzureCLI@1
      displayName: 'Run Setup Script'
      inputs:
        azureSubscription: $(AZURE_SUBSCRIPTION)
        scriptPath: './create-storage.sh'
  - job: SetupStagingStorage
    variables:
      ENVIRONMENT_PREFIX: 's'
      ENVIRONMENT_NAME: 'staging'
    displayName: 'Setup Staging Storage'
    steps:
    - task: AzureCLI@1
      displayName: 'Run Setup Script'
      inputs:
        azureSubscription: $(AZURE_SUBSCRIPTION)
        scriptPath: './create-storage.sh'

  - job: SetupProductionStorage
    variables:
      ENVIRONMENT_PREFIX: 'p'
      ENVIRONMENT_NAME: 'production'
    displayName: 'Setup Production Storage'
    steps:
    - task: AzureCLI@1
      displayName: 'Run Setup Script'
      inputs:
        azureSubscription: $(AZURE_SUBSCRIPTION)
        scriptPath: './create-storage.sh'

Ничего особенного в этом конвейере сборки, чтобы быть ясным. Это просто выполнение Create storage.sh Скрипт с различными специфичными для среды параметров передается. Вы можете видеть, что я использую специфические для среды параметры в определении других переменных среды (например, container_name в начале его определения). Это позволяет мне иметь отдельные контейнеры в той же учетной записи хранилища Azure, что и файлы состояния, специфичных для окружающей среды, терраформ. В качестве альтернативы я мог бы просто использовать файлы состояния терраформа с разными названиями, но мне нравится последовательность для самих имен файлов.

Развернуть трубопровод

Здесь происходит волшебство. На момент написания этой статьи я в настоящее время не использую Многоценные трубопроводы , так что все это сделано в веб -интерфейсе Classic Release Pipelines.

Первый шаг в конвейере выпуска — получить секрет Key Vault, который был сохранен в Create storage.sh скрипт через AzureKeyVault шаг. Затем это хранится в переменной Azure Pipelines, названной в честь самого секретного имени. Например, если секретное имя D-storage-account-key , переменная конвейера Azure также будет D-storage-account-key Анкет Мы увидим это в будущем.

Для специфичных для терраформ, я использую очень замечательное Terraform Build и

Первый шаг Terraform, который я использую, — это просто установка Terraform для агента, используя Terraforminstaller шаг. На момент написания этой статьи я использую Terraform v0.12.3, но я уверен, что это скоро изменится.

Второй шаг Terraform — запустить Terraform Init с помощью Terraformcli шаг. Я передаю следующие параметры команды: -backend-config = "access_key = $ (d-storage-account-key)" Анкет

Как я упоминал ранее, вы увидите, что я использую $ (D-storage-account-key) Azure Pipeline переменная для извлечения ключа доступа. Прямо, но что -то нужно иметь в виду, если вы его создаете.

Последний шаг Terraform — запустить терраформ применить с помощью Terraformcli шаг снова. Единственные варианты команды, в которых я прохожу,-это специфические для среды переменные терраформы: -var-file = "./Environments/$ (Environment_name)/Terraform.tfvars" Анкет Использование этих переменных можно увидеть в Предыдущий пост Azure/Terraform Анкет

Используйте инструменты CLI CLI нативного облака для генерации и хранения клавиш доступа для использования позже в сборке и развертывании трубопроводов. Довольно просто, да?

Оригинал: «https://dev.to/tonytalkstech/auto-generating-terraform-state-storage-in-azure-eh5»