Рубрики
Uncategorized

Связанные шаблоны в шаблоне руки

В предыдущем посте в блоге я рассказал о необходимости развертывания целой группы ресурсов из Templat … Помечено с Azure, DevOps, Cloud, Infraascode.

В предыдущем посте в блоге я рассказал о необходимости развертывания целой группы ресурсов из шаблона. Использование только одного шаблона для всех ресурсов может быть простым, но в большинстве случаев ваши ресурсы являются сложными и включают большой набор ресурсов. Использование одного файла является неспектическим. Файл слишком большой, чтобы быть легко измененным и повторно использовать его в разных средах сложно. Например, группа ресурсов, состоящая из N VMS в наборе шкалы (в зависимости от окружающей среды), X других виртуальных машин, базы данных Azure SQL, Azure Cache для Redis, Service Bus и несколько учетных записей для хранения. Список вырастет с потребностями разработчика. Чтобы решить эту проблему и избежать создания шаблона 15000 рядов, есть методика; Шаблон связывания. В этом посте я покажу вам, как это работает и как вы можете использовать его. Вы узнаете, как модулировать свои шаблоны и сделать их легко рассмотреть. Первое, что вам нужно, при использовании ссылки на шаблон — главный шаблон. Этот шаблон будет запущен и Orchestrate все развертывания, определенные в файлах шаблонов ребенка. По соглашению, основной шаблон называется Azuredeploy.json. Детские шаблоны ссылаются на основной шаблон, используя ресурсы развертывания (Microsoft. Ресурсы/развертывание). Этот ресурс позволяет выполнять вложенное развертывание в том же или другом объеме. Это создает новое развертывание. Код для этих развертываний может быть встроен в главный шаблон, мы говорим о вложенных шаблонах здесь или в отдельных файлах, и это то, что мы называем, связанные шаблоны. Детские шаблоны должны быть доступны онлайн. Эти шаблоны не читаются на локальной машине, когда вы выполняете новую AZResourceGrupDeploblement. Вместо этого шаблоны загружаются компанией Azure Resource Manager и выполняются для вас менеджером ресурсов. В режиме связывания шаблона каждый ресурс развертывания должен содержать один параметр Templateuri для уточнения в мире доступных URI дочернего шаблона.

Как это работает?

Azure Resource Manager загружайте шаблон и создать новое развертывание в группе целевой ресурсной ресурсы с загруженным шаблоном и дополнительным файлами параметров (вы можете увидеть журнал развертывания в разделе развертывания вашей группы ресурсов)

Шаблон местоположение

Местоположение может быть простой веб-сайтом, репозиторию GitHUB или любой веб-сервис с публичным доступом. Вы можете использовать токен безопасности, если вам нужно, если токен присутствует в URI. В большинстве примеров вы увидите GitHub с таким же URL-адресом: https://raw.githubusercontent.com/omiossec/arm-tk-demo/master/armfiles/azuredeploy.json.json.json.json.

       {
            "apiVersion": "2020-06-01",
            "name": "demogithub",
            "type": "Microsoft.Resources/deployments",
            "properties": {
                "mode": "Incremental",
                "templateLink": {
                    "uri": "https://raw.githubusercontent.com/omiossec/arm-ttk-demo/master/armfiles/child.json",
                    "contentVersion": "1.0.0.0"
                }
            }
        }

Но большинство предприятий неохотно указывают свой код, даже если это единственный инфраструктурный код, на публичном веб-сайте без какого-либо механизма безопасности, и они предпочли использовать более безопасное решение с токеном. Одним из решений является использование контейнера BLOB в учетной записи Azure Storage. По умолчанию контейнеры BLOB не являются публичными, и вам нужен совместный токен подписи доступа (SAS) или подключение к Azure. Менеджер Azure Resource Manager должен получить доступ к URI, с учетной записью Azure Storage без публичного доступа вам понадобится предоставить ассоциированную токен SAS.

        {
            "apiVersion": "2020-06-01",
            "name": "demoAzureStorage",
            "type": "Microsoft.Resources/deployments",
            "properties": {
                "mode": "Incremental",
                "templateLink": {
                    "uri": "[concat(parameters('artifactLocation'),'azuredeploy.json',parameters('artifactSASKey'))]",
                    "contentVersion": "1.0.0.0"
                }
            }
        }

URI в свойстве TemplateLink является конконтрация контейнеров BLOB URI (например, https://demoomclinked001.blob.core.windows.net/template/ ), ваше имя файла шаблона и токен Shared Access Signature (SAS).

Чтобы создать контейнер и токен SAS с модулем Azure PowerShell.

$storageAccount = Get-AzStorageAccount -ResourceGroupName "01-test-arm" -StorageAccountName "demoomclinked001"

New-AzStorageContainer -Name "template" -Context $storageAccount.Context -Permission off 

New-AzStorageContainerSASToken -container "template" -Permission r -ExpiryTime (get-date).AddMonths(6) -Context $storageAccount.Context

Токен, созданный командой, действителен в течение 6 месяцев ((до получения) .addmonths (6)). Единственное разрешение требуется (-Промиссия R). Менеджер Azure Resource должен загружать только шаблоны.

Значение токена SAS может быть строковым параметром или безопасной строкой, если вы хотите хранить его в хранилище Key Azure (и это наилучшая практика, чтобы избежать извлечения токена в журналах).

        "artifactSASKey": {
            "type": "securestring",
            "metadata": {
                "description": "Blob container SAS key for linked template deployment"
            }
        }

Содержание версии

В предыдущем примере вы, вероятно, заметили параметр ContentVersion в объекте TemplateLink. Это свойство не требуется. Но он обеспечивает связанный шаблон Contentversion соответствует значению в основном шаблоне. Если версия не соответствует, она поднимет ошибку. Если вы хотите использовать его в своем развертывании, лучше поставить файл шаблона и ContentVersion в параметрах

        {
            "apiVersion": "2020-06-01",
            "name": "demoAzureStorageVersion",
            "type": "Microsoft.Resources/deployments",
            "properties": {
                "mode": "Incremental",
                "templateLink": {
                    "uri": "[concat(parameters('artifactLocation'),parameters('templateFile'),parameters('artifactSASKey'))]",
                    "contentVersion": "[parameters('templateVersion')]"
                }
            }
        }

Параметр

Шаблоны в основном работают с параметрами, там лишь несколько случаев, когда вам не нужен хотя бы один параметр. С объектом TemplateLink у вас есть два варианта применения параметров в ресурсе развертывания. Вы можете использовать встроенную форму, параметры находятся в основном шаблоне в ресурсе развертывания, или вы можете использовать внешнюю форму, где параметры во внешнем файле, как шаблон ребенка.

Чтобы использовать встроенную форму, вы должны добавить объект «Параметры» в объекте свойств ресурсов развертывания. Он содержит коллекцию пар клавиш/значение, соответствующую параметрам шаблона.

        {
            "apiVersion": "2020-06-01",
            "name": "demoAzureStorageVersion",
            "type": "Microsoft.Resources/deployments",
            "properties": {
                "mode": "Incremental",
                "templateLink": {
                    "uri": "[concat(parameters('artifactLocation'),parameters('templateFile'),parameters('artifactSASKey'))]",
                    "contentVersion": "[parameters('templateVersion')]"
                },
                "parameters": {
                    "serverSize": {
                        "value": "[parameters('vmSKU')]"
                    },
                    "adminUserName": {
                        "value": "[parameters('localAdminUserName')]"
                    },
                    "localAdminPassword": {
                        "value": "[parameters('localAdminPassword')]"
                    },
                    "location": {
                        "value": "[resourceGroup().location]"
                    }
                }
            }
        }

Использование внешнего шаблона похоже на объект TemplateLink. Вам необходимо поставить файл параметров в онлайн-местоположении, в глобальном масштабе доступен с или без токена доступа. Но в качестве параметров могут содержать более разумную информацию, чем сам шаблон, вы можете предпочесть в частном порядке файлы параметров размеров в учетной записи хранилища. Вам необходимо использовать объект ParamtersLink для использования внешнего файла.

       {
            "apiVersion": "2020-06-01",
            "name": "demoAzureStorageVersion",
            "type": "Microsoft.Resources/deployments",
            "properties": {
                "mode": "Incremental",
                "templateLink": {
                    "uri": "[concat(parameters('artifactLocation'),parameters('templateFile'),parameters('artifactSASKey'))]",
                    "contentVersion": "[parameters('templateVersion')]"
                },
               "parametersLink": {
                    "uri": "[concat(parameters('artifactLocation'),parameters('parametersFile'),parameters('artifactSASKey'))]",
                    "contentVersion": "[parameters('parametersFileVersion')]"
               }
            }
        }

Как вы видите, вы также можете использовать свойство ContentVersion для обеспечения совпадения файла параметров.

Я предпочитаю использовать встроенную форму. Он предлагает больше гибкости, поскольку вы можете легко изменить параметр, используя функции ARM. Основная проблема, которую у вас будет иметь количество параметров, которые могут сделать шаблон не переваривать. Для этого я предпочитаю использовать уникальный объект JSON вместо множества параметров.

Управление шаблонами и файлами параметров

Одна проблема возникает с монтажом шаблона. Каждый раз, когда вам нужно изменять один связанный шаблон или связанный файл параметра, вам нужно загрузить его на Azure. Вы можете сделать это вручную, но это пустая трата времени и без ошибок. Вам нужно решение для автоматизации процесса. Решение, использующее git для хранения шаблона и трубопровода, чтобы загрузить шаблон на учетную запись BLOB хранения Azure.

Для демонстрации, я буду использовать проект Azure DEVOPS для хранилища GIT и трубопровода.

В корне репозитория я создаю файл Azuredeploy.json, это основной шаблон и папка связанных шаблонов для хранения связанных шаблонов и файлов параметров.

Чтобы иметь возможность загрузки файлов в контейнер BLOB в учетной записи Azure Storage. Если вы помните команду, используемую для создания токена SAS для связи шаблона, мы можем использовать его здесь, чтобы создать токен для загрузки файлов с трубопровода.

New-AzStorageContainerSASToken -container "template" -Permission rwd -ExpiryTime (get-date).AddMonths(6) -Context $storageAccount.Context

Единственное отличие — это разрешение, RWD, для чтения, записи и удаления.

Следующим шагом является создание скрипта PowerShell для загрузки файлов в папке связанных шаблонов к контейнеру BLOB в Azure. Скрипт будет перечислять весь файл JSON в папке связанных шаблонов и нажать каждый файл в контейнере, используя токен SAS, созданный ранее.

Нам нужны несколько параметров, токен SAS, имя локальной папки, имя учетной записи хранилища и имя контейнера BLOB. Вместо использования параметров вы можете использовать переменные среды. Проще настроить в трубопроводе Azure DevOps.

try {
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    Install-Module -Name AZ.storage -Force  -Scope CurrentUser -AllowClobber

    $BuildDirectory = [Environment]::GetEnvironmentVariable('BUILD_SOURCESDIRECTORY')
    $StorageAccountName = [Environment]::GetEnvironmentVariable('STORAGEACCOUNTNAME')
    $LinkedTemplateFolder = [Environment]::GetEnvironmentVariable('TEMPLATEFOLDER')
    $BlobContainerName = [Environment]::GetEnvironmentVariable('CONTAINERNAME')
    $SasToken = [Environment]::GetEnvironmentVariable('SASKEY')
    $TemplateFolderPath = join-path -path $BuildDirectory -ChildPath $LinkedTemplateFolder

    if ($null -eq $BuildDirectory) {
        Throw "Error No Build directory found make sur to run this script in Azure DevOps build server"
        Exit 1
    }
    if (!(test-path -Path $TemplateFolderPath -ErrorAction SilentlyContinue)) {
        Throw "No Template folder"
        Exit 1
    }
    $AzureStorageContext = New-AzStorageContext $storageaccountname -SasToken $SasToken
    if ($null -eq $AzureStorageContext){
        Throw "No storage context"
        Exit 1
    }

    $TemplateFilesList =  get-childitem -Path $TemplateFolderPath -Attributes !Directory+!System+!Encrypted+!Temporary -Recurse -filter "*.json" -ErrorAction SilentlyContinue | select-object FullName,Name
    foreach ($jsonFile in $TemplateFilesList) {
        Set-AzStorageBlobContent -File $jsonFile.FullName -Container $BlobContainerName -Context $AzureStorageContext -Blob $jsonFile.Name -Force 
    }
}
catch {
    Write-Error -Message " Exception Type: $($_.Exception.GetType().FullName) $($_.Exception.Message)"
}

Когда вы видите, что CDDlet контекста хранения Azure использовал токен SAS для создания контекста, используемого для загрузки файлов для Azure без использования ни одного подключения к Azure.

После скрипта необходимо добавить файл azurepipeline yaml для настройки трубопровода. Этот файл описывает, как запустить скрипт PowerShell и подробности любые переменные, необходимые для запуска скрипта и триггера, который запускает скрипт.

trigger:
- master
resources:
- repo: self

variables:
  storageAccountName: 'demoomclinked001'
  containerName: 'template'
  templateFolder: 'linked-templates'
  vmImageName: 'windows-latest'

stages:
- stage: UploadTemplateToAzure
  displayName: Upload template to Azure Storage
  jobs:  
  - job: PowerShellScript
    displayName: PowerShell Script to upload file
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: PowerShell@2
      displayName: push linked templates to Azure
      env:
        SASKEY: $(SasKey)
      inputs:
        targetType: 'filePath'
        filePath: '$(System.DefaultWorkingDirectory)/pipeline.ps1'

Триггер запускает трубопровод на нажимных действиях, выполненных на ветви для ветки в репозитории Azure DEVOPS

trigger:
- master
resources:
- repo: self

Затем вам необходимо определить переменные, используемые в скрипте, учетную запись хранилища, контейнера BLOB и папку, в которой есть связанные шаблоны. Но что-то отсутствует. Нет переменных для токена SAS. Это по соображениям безопасности, вы не хотите поделиться этим секретом. С помощью этого токена любой пользователь может изменить или удалить ваши файлы. Итак, вам нужен другой способ пройти ценность к сценарию и держать его в секрете от кого-либо с доступом к репозитории. Azure DEVOPS позволит вам создать секретные переменные. Вам нужно перейти на конвейер и выбирать ваш трубопровод и введите режим редактирования. У вас будет кнопка «Переменные» на верхней правой части страницы. Вы можете добавить секретную переменную, проверив флажок «Держите это значение Secret». В отличие от нормальных переменных, секретные переменные не добавляются как переменные среды по умолчанию. Вам нужно отобразить переменную в ваших задачах, используя

    - task: PowerShell@2
      env:
        SASKEY: $(SasKey)

Теперь каждая модификация в репозитории загрузит любые файлы JSON в папке связанных шаблонов в контейнере BLOB в Azure без необходимости вручную.

Это упрощенная версия трубопровода, чтобы показать вам, как вы можете обрабатывать связанные шаблоны и автоматически отправлять их на Azure без вмешательства человека. Но вы можете пойти дальше и интегрировать тестирующий раствор (ARM-TTK, -WHATIF …) и развертывание из трубопровода. Ресурс ARM развертывания может использовать условия, декондон и копию (цикл). Он делает связанные шаблоны, способные развертывать сложные решения и позволяют определить целую группу ресурсов из одного основного шаблона. Это помогает членам команды сосредоточиться на небольшой части большого проекта.

Мой последний совет при использовании связанных шаблонов — сделать каждое развертывание независимо от того, если это возможно. Было бы проще проверить и изменять.

Оригинал: «https://dev.to/omiossec/linked-templates-in-arm-templates-4ha9»