Рубрики
Uncategorized

Как проверить свой шаблон Azure Arm с помощью Tootkit Tootkit (ARM-TTK)

Когда мы говорим об инфраструктуре как коде, мы стремимся создать наши услуги, используя ту же техника … Tagged с DevOps, Azure, Arm, InfraScode.

Когда мы говорим об инфраструктуре как коде, мы стремимся создавать наши услуги, используя ту же технику и логику, используемую в разработке программного обеспечения. Программная разработка — это не только код, но и о том, как сотрудничать, чтобы найти ошибки на ранних стадиях и правильные ошибки перед тем, как выйти в производство.

Как мы можем сделать это с шаблоном рук? Там нет инструмента, такого как XUNIT или PESTER для шаблона ARM. Какой тест мы должны работать и как это сделать?

Начиная с De MS Ignite 2019, у нас есть новый инструмент для автоматизации тестирования шаблонов ARM, набор инструментов для шаблона ARM (ARM-TTK).

Набор инструментов шаблона ARM — модуль PowerShell. Его основным намерением является управление файлами шаблонов ARM до развертывания.

Он все еще находится в предварительном просмотре, и в настоящее время он не может быть установлен через галерею PowerShell. Вам придется установить его вручную, загрузив из GitHub и импортировать модуль.

Откройте консоль PS Core в каталоге модулей

import-module .\arm-ttk.psd1

Основным командным директором модуля является тестовый аздет. Единственный требуемый параметр — шаблон. Я создал простой шаблон для развертывания учетной записи хранилища в папке.

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
  },
  "variables": {
    "storageAccountName": "[concat('st', uniquestring(resourceGroup().id))]"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2016-05-01",
      "name": "[variables('storageAccountName')]",
      "location": "francecentral",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "Storage",
      "properties": {}
    }
  ],
  "outputs": {
    "storageAccountName": {
      "type": "string",
      "value": "[variables('storageAccountName')]"
    }
  }
}

и проверить его с помощью командлета

Test-AzTemplate -TemplatePath samples\storage.json

Результат

Проверка образцов \ storage.json развертывание [+] Adminusername не должно быть буквальным (122 мс)

[-] Апиверы должны быть недавними (47 мс) Версии API должны быть последними или младше 2 лет (730 дней)-версия API 2016-05-01 Microsoft. Хранение/StorageCcounts составляет 1382 дня действительные версии API: 2019-06-01 2019-04-01 2018-11-01 2018-07-01 2018-03-01-Preview [+] Параметр артефактов (36 MS) [+] Схема развертывания верна (30 мс) [+] Идентификаторы должны быть получены из ресурседов (56 мс) [+] Местоположение не должно быть жестко кодировать (54 мс) [+] ManagedIdentityExtension не должен использоваться (33 мс) [+] Min и максимальное значение — числа (71 мс) [+] Выходы не должны содержать секреты (60 мс) [+] Необходимо ссылаться на параметры (45 мс) [+] Свойство параметров должно существовать (30 мс) [+] поставщики Apiversions не допускаются (49 мс) [+] Ресурсеиды не должны содержать (40 мс) [+] Ресурсы должны иметь местоположение (47 мс) [+] Параметры безопасной строки не могут иметь по умолчанию (111 мс) [+] Шаблон не должен содержать пробелы (53 мс) [+] Должны быть направлены переменные (79 мс) [+] Виртуальные машины не должны быть предварительным просмотром (59 мс) [+] Изображения виртуальных машин должны использовать последнюю версию (70 мс) [+] Размер виртуальной машины должен быть параметром (42 мс)

Для тех, кто работает с PowerShell и Pester, это должно быть знакомо. Это просто список тестовых случаев. Pester используется по умолчанию для оценки шаблона по этим тестам. Он обеспечивает стандартный раскрашенный выход Pers.

Вы можете найти их в папке тестовых примеров в папке модуля. Тестовый пример, в ARM-TTK, представляет собой просто сценарий, например, пример для испытаний Apiversion (Apiversions-be-recent.test.ps1), проверьте, является ли возраст версии версии API. Если возраст превышает 730 дней, сценарий записывает ошибку PowerShell, поэтому Пестер может оценить тест как неудачный.

Есть несколько тестовых случаев.

  • AdminUsername-Bly-not be-a-a-literal
  • Apiversions-Be- Недавний
  • Артефакты-параметр
  • DeploymentTemplate-Schema-IS-Correct
  • IDS-BE-BE-FROM-RESORCEID
  • Местоположение-это не приукрашен
  • ManagedIdentityExtension-Must-not-используемый
  • Мин-и-макс-значение-номеры
  • Выходы-грубые-неконтролирующие
  • Параметры-мрака
  • Параметры-Пропертиза-Мэйст-Участник
  • Providers_apiversions-is-int-permited
  • Ресурсы-непревзойденные
  • Ресурсы имеют местоположение
  • Secure String-Parameters-Cannot-Have-Default
  • Шаблон-плеча не являются бланками
  • Переменные-мэг-привязанность
  • Виртуальные машины-нельзя просмотреть
  • VM-Images-Should-Use-Latest-Aversion
  • VM-Size-Be-A-A-A-Parameter

И можно добавить тест. Выберите тестовое имя, например, шаблон должен иметь правильный формат версии и создать имя файла, заменив пространство на-шаблон-тол-то-корректный-версию format.test.ps1. Наконец, добавьте свой тестовый скрипт в каталоге DeploymentTemplate.

Чтобы иметь возможность проверить шаблон с модулем, у вас должен быть хотя бы один параметр [psobject] $ templateObject

Сам сценарий выглядит как

<#
.Synopsis
    Ensures the contentVersion use the X.X.X.X format.
.Description
    Ensures the contentVersion use the X.X.X.X format.
#>
param(
[PSObject]$TemplateObject
)

$templateVersion = $TemplateObject.contentVersion

if (-not $templateVersion) {
    Write-Error 'DeploymentTemplate Missing contentVersion property' 
    return
}

if (!($templateVersion -match "^[0-9]+.[0-9]+.[0-9]+.[0-9]+$")) {
    Write-Error "DeploymentTemplate has an unexpected contentVersion. Format should be X.X.X.X"
    return
}

Теперь вы можете заново запустить предыдущий тест, и вы должны увидеть

[+] Шаблон должен иметь правильный формат версии (23 мс)

Мы также можем использовать только небольшое количество тестов. Если по какой -то причине я хочу убедиться, что версия API шаблона и ContentVersion верны, я могу использовать параметр тестирования со списком теста с там.

Test-AzTemplate -TemplatePath .\storage.json -Test DeploymentTemplate-Schema-Is-Correct, Template-should-have-a-correct-version-format

Теперь, когда мы видим, как использовать ARM-TTK для небольшого шаблона, нам нужно увидеть, как использовать его в более реальном мире.

В более реальном мире мы редко используем уникальный шаблон, вместо этого мы используем отдельные файлы JSON, связанные с AzuredEploy.json или файлом maintemplate.json. Эта техника называется связанными шаблонами, и она идеально подходит, когда вы работаете с несколькими людьми, чтобы создать развертывание комплексов.

В этом случае вам не нужно тестировать файлы JSON один за другим, просто предоставить путь папки, где расположены файлы JSON и основной шаблон.

Test-AzTemplate -TemplatePath .\  

CMDLT проверит весь шаблон в папке

Когда вы работаете над шаблонами ARM в команде, вам нужны инструменты выпуска версий и место, где вы можете выполнять тесты и развертывания. Azure Devops — один из инструментов, которые вы можете использовать, помимо Github и Gitlab.

Вы можете запустить тесты ARM-TTK в Azure DevOps, спасибо Сэм Коган . Вам просто нужно установить ARM-TTK-Extension из Рынок Анкет

После установки вы можете начать использовать его в конвейере непрерывной интеграции. Создать трубопровод Azure DevOps легко. Вам нужно создать файл azure-pipelines.yaml в корне репо.

name: ARM Deployment Pipeline

trigger:
- master

pool:
  vmImage: 'windows-latest'

stages:
  - stage: ARM_CI
    jobs:
    - job: ARM_Testing
      steps:
        - pwsh: ./InitializePipeline.ps1
          displayName: Prepare folders
          name: PsBuild


        - task: RunARMTTKTests@1
          displayName: Run ARM TTK tests 
          name: TTKtests
          inputs:
            templatelocation: '$(System.DefaultWorkingDirectory)\tpl'
            resultLocation: '$(System.DefaultWorkingDirectory)\results'

        - task: PublishTestResults@2
          displayName: Publish test restults
          name: PublishResults
          inputs:
            testResultsFormat: 'NUnit'
            testResultsFiles: '$(System.DefaultWorkingDirectory)\results\*-armttk.xml'
          condition: always()

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

Оригинал: «https://dev.to/omiossec/how-to-test-your-azure-arm-template-with-arm-template-toolkit-arm-ttk-2492»