Когда мы говорим об инфраструктуре как коде, мы стремимся создавать наши услуги, используя ту же технику и логику, используемую в разработке программного обеспечения. Программная разработка — это не только код, но и о том, как сотрудничать, чтобы найти ошибки на ранних стадиях и правильные ошибки перед тем, как выйти в производство.
Как мы можем сделать это с шаблоном рук? Там нет инструмента, такого как 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»