Поделиться через


Реализация тестов интеграции для проектов Terraform в Azure

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

Тесты интеграции проверяют, что новое изменение кода не нарушает существующий код. В DevOps непрерывная интеграция (CI) означает процесс, который создает всю систему каждый раз, когда изменяется кодовая база, например, когда кто-то хочет объединить PR в репозиторий Git. В следующем списке приведены распространенные примеры тестов интеграции:

  • Средства анализа статического кода, такие как lint и средства форматирования.
  • Выполните проверку terraform , чтобы проверить синтаксис файла конфигурации.
  • Запустите terraform план , чтобы убедиться, что конфигурация будет работать должным образом.

В этой статье описано, как:

  • Ознакомьтесь с основами тестирования интеграции для проектов Terraform.
  • Используйте Azure DevOps для настройки конвейера непрерывной интеграции.
  • Запустите статический анализ кода в коде Terraform.
  • Запустите terraform validate, чтобы проверить файлы конфигурации Terraform на локальном компьютере.
  • Запустите terraform plan, чтобы проверить файлы конфигурации Terraform в контексте удаленных служб.
  • Используйте Azure Pipeline для автоматизации непрерывной интеграции.

1. Настройка среды

2. Проверка локальной конфигурации Terraform

Команда terraform validate выполняется из командной строки в каталоге, содержающем файлы Terraform. Эта команда является главной целью проверки синтаксиса.

  1. В каталоге примера перейдите к каталогу src.

  2. Запустите terraform init , чтобы инициализировать рабочий каталог.

    terraform init
    
  3. Выполните проверку terraform , чтобы проверить синтаксис файлов конфигурации.

    terraform validate
    

    Ключевые моменты:

    • Появится сообщение о том, что конфигурация Terraform действительна.
  4. Измените файл main.tf.

  5. В строке 5 вставьте опечатку, которая делает синтаксис недействительным. Например, замените var.location на var.loaction

  6. Сохраните файл.

  7. Снова запустите проверку.

    terraform validate
    

    Ключевые моменты:

    • Отображается сообщение об ошибке, указывающее строку кода в ошибке и описание ошибки.

Как видно, Terraform обнаружил проблему в синтаксисе кода конфигурации. Эта проблема предотвращает развертывание конфигурации.

Рекомендуется всегда запускать terraform validate для проверки ваших файлов Terraform, прежде чем отправлять их в систему управления версиями. Кроме того, этот уровень проверки должен быть частью конвейера непрерывной интеграции. Далее в этой статье мы рассмотрим, как настроить конвейер Azure для автоматической проверки.

3. Проверка конфигурации Terraform

В предыдущем разделе вы узнали, как проверить конфигурацию Terraform. Этот уровень тестирования зависит от синтаксиса. Этот тест не учитывал, что уже может быть развернуто в Azure.

Terraform — это декларативный язык означает, что вы объявляете то, что вы хотите в качестве конечного результата. Например, предположим, что у вас есть 10 виртуальных машин в группе ресурсов. Затем вы создадите файл Terraform, определяющий три виртуальные машины. Применение этого плана не увеличивает общее число до 13. Вместо этого Terraform удаляет семь виртуальных машин, так что у вас остаётся три. Выполнение terraform plan позволяет подтвердить потенциальные результаты применения плана выполнения, чтобы избежать сюрпризов.

Чтобы создать план выполнения Terraform, выполните команду terraform plan. Эта команда подключается к целевой подписке Azure, чтобы проверить, какая часть конфигурации уже развернута. Затем Terraform определяет необходимые изменения в соответствии с требованиями, указанными в файле Terraform. На этом этапе Terraform не развертывает ничего. Это говорит вам, что произойдет, если вы применяете план.

Если вы выполните действия, описанные в предыдущем разделе, выполните команду terraform plan:

terraform plan

После выполнения terraform planTerraform отображает потенциальный результат применения плана выполнения. Выходные данные указывают на ресурсы Azure, которые будут добавлены, изменены и уничтожены.

По умолчанию Terraform сохраняет состояние в том же локальном каталоге, что и файл Terraform. Этот шаблон хорошо работает в сценариях с одним пользователем. Однако при работе нескольких пользователей с одинаковыми ресурсами Azure локальные файлы состояний могут выйти из синхронизации. Чтобы устранить эту проблему, Terraform поддерживает запись файлов состояния в удаленное хранилище данных (например, в службу хранилища Azure). В этом сценарии может быть проблематично запускать terraform plan на локальном компьютере и обращаться к удалённому компьютеру. В результате может потребоваться автоматизировать этот шаг проверки в рамках конвейера непрерывной интеграции.

4. Выполнение анализа статического кода

Анализ статического кода можно выполнять непосредственно в коде конфигурации Terraform, не выполняя его. Этот анализ может быть полезен для обнаружения таких проблем, как проблемы безопасности и несоответствие соответствия требованиям.

Следующие средства предоставляют статический анализ для файлов Terraform:

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

5. Автоматизация тестов интеграции с помощью Azure Pipeline

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

  1. С помощью выбранного редактора перейдите к локальному клону примера проекта Terraform на GitHub.

  2. Откройте файл samples/integration-testing/src/azure-pipeline.yaml.

  3. Прокрутите вниз до шага , где вы увидите стандартный набор шагов, используемых для выполнения различных процедур установки и проверки.

  4. Просмотрите строку, которая гласит Шаг 1: выполните анализ статического кода Checkov. На этом шаге проект Checkov, упомянутый ранее, выполняет статический анализ кода в примере конфигурации Terraform.

    - bash: $(terraformWorkingDirectory)/checkov.sh $(terraformWorkingDirectory)
      displayName: Checkov Static Code Analysis
    

    Ключевые моменты:

    • Этот скрипт отвечает за запуск Checkov в рабочей области Terraform, смонтированной внутри контейнера Docker. Агенты, управляемые корпорацией Майкрософт, включены в Docker. Запуск инструментов внутри контейнера Docker легче и исключает необходимость установки Checkov на агенте Azure Pipeline.
    • Переменная $(terraformWorkingDirectory) определена в файле azure-pipeline.yaml.
  5. Просмотрите строку, которая гласит: Шаг 2: установите Terraform на агенте Azure Pipelines. Расширение задачи сборки и выпуска Terraform , установленное ранее, содержит команду для установки Terraform на агенте под управлением Azure Pipeline. Эта задача выполняется на этом шаге.

    - task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-installer.TerraformInstaller@0
      displayName: 'Install Terraform'
      inputs:
        terraformVersion: $(terraformVersion)
    

    Ключевые моменты:

    • Версия Terraform для установки указывается с помощью переменной Azure Pipeline с именем terraformVersion и определена в файле azure-pipeline.yaml.
  6. Просмотрите строку, в которой говорится Шаг 3: запустите Terraform init, чтобы инициализировать рабочую область. Теперь, когда Terraform установлен на агенте, каталог Terraform можно инициализировать.

    - task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-cli.TerraformCLI@0
      displayName: 'Run terraform init'
      inputs:
        command: init
        workingDirectory: $(terraformWorkingDirectory)
    

    Ключевые моменты:

    • Входные данные command указывают, какая команда Terraform будет выполняться.
    • Входные данные workingDirectory указывают путь к каталогу Terraform.
    • Переменная $(terraformWorkingDirectory) определена в файле azure-pipeline.yaml.
  7. Просмотрите строку, которая гласит, Шаг 4: выполните команду Terraform validate для проверки синтаксиса HCL. После инициализации каталога проекта выполняется terraform validate для проверки конфигурации на сервере.

    - task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-cli.TerraformCLI@0
      displayName: 'Run terraform validate'
      inputs:
        command: validate
        workingDirectory: $(terraformWorkingDirectory)
    
  8. Просмотрите строку, в которой написано Шаг 5: выполните план Terraform для проверки синтаксиса HCL. Как описано ранее, создание плана выполнения выполняется для проверки допустимости конфигурации Terraform перед развертыванием.

    - task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-cli.TerraformCLI@0
      displayName: 'Run terraform plan'
      inputs:
        command: plan
        workingDirectory: $(terraformWorkingDirectory)
        environmentServiceName: $(serviceConnection)
        commandOptions: -var location=$(azureLocation)
    

    Ключевые моменты:

    • Входные environmentServiceName данные ссылаются на имя подключения службы Azure, созданного в разделе "Настройка среды". Подключение позволяет Terraform получить доступ к подписке Azure.
    • Входные данные commandOptions используются для передачи аргументов команде Terraform. В этом случае указывается расположение. Переменная $(azureLocation) определена ранее в ФАЙЛЕ YAML.

Импорт конвейера в Azure DevOps

  1. Откройте проект Azure DevOps и перейдите в раздел Azure Pipelines.

  2. Нажмите кнопку "Создать конвейер ".

  3. Для параметра "Где находится ваш код?" , выберите GitHub (YAML).

    Где находится ваш код?

  4. На этом этапе может потребоваться авторизовать Azure DevOps для доступа к вашей организации. Для получения дополнительной информации по этой теме см. статью Создание репозиториев GitHub.

  5. В списке репозиториев выберите форк репозитория, созданный в вашей организации на GitHub.

  6. На шаге "Настройка конвейера" выберите запуск из существующего конвейера YAML.

    Существующий конвейер YAML

  7. При отображении страницы выбора существующего конвейера YAML укажите ветвь master и введите путь к конвейеру YAML: samples/integration-testing/src/azure-pipeline.yaml

    Выбор существующего конвейера YAML

  8. Выберите "Продолжить", чтобы загрузить конвейер Azure YAML из GitHub.

  9. Когда отображается страница YAML конвейера, выберите "Выполнить", чтобы создать и запустить конвейер вручную в первый раз.

    Запуск Azure Pipeline

Проверка результатов

Конвейер можно запустить вручную из пользовательского интерфейса Azure DevOps. Однако суть статьи заключается в том, чтобы показать автоматическую непрерывную интеграцию. Протестируйте процесс, закоммитив изменение в папке samples/integration-testing/src форкнутого репозитория. Это изменение автоматически активирует новый конвейер в ветви, в которой выполняется отправка кода.

Пайплайн, запущенный из GitHub

После этого перейдите к сведениям в Azure DevOps, чтобы убедиться, что все работает правильно.

Зеленый конвейер Azure DevOps

Устранение неполадок Terraform в Azure

Устранение распространенных проблем при использовании Terraform в Azure

Дальнейшие действия