Шаблоны управления ресурсами Azure (серия 5 деталей)
Шаблон ARM — отличный механизм для быстрого инфраструктуры в Azure. Но когда дело доходит до обеспечения виртуальной машины, это не конец. Если большинство услуг PAAS можно настроить почти полностью с помощью шаблонов ARM или Terraform. Для IAAS это другая история. Конфигурация и доставка приложений все еще необходимы.
Итак, применяется ли шаблон рук или терраформ, является ли конец истории для нас?
Инфраструктура как код дает нам некоторые значения. Это позволяет повторять, идентифицирующие и быстрые развертывания. Однако эти значения ценны только для вас, но не для ваших конечных пользователей.
Проще говоря, представьте себе эту ситуацию, у вас есть шаблон рук, готовый к развертыванию, VNET, NSG, VM и все, что необходимо для создания инфраструктуры. Развертывание верно и работает через 20 минут. Но если команда, отвечающая за настройку и установку приложения в виртуальной машине, занята, делая что -то меньшее, пожаром где -то еще или развертывание других сложных приложений, в конечном итоге разработчики или пользователей офиса в конечном итоге получают инфраструктуру. Ваши 20 минут развертывания не видны. Ваши конечные пользователи не заметят. Они видят только 10 дней задержек, чтобы получить свои услуги.
Потому что истинная ценность инфра как кода заключается не только для удовлетворения наших целей, но и для того, чтобы дать нашим конечным пользователям лучшую услугу. Это путь, который следует рассматривать как решатель проблем, а не как часть проблемы. Если серверы, сеть и другие вещи развернуты в течение дня, но вам нужно подождать 5 дней, чтобы кто -то настроил серверы и еще один для установки приложений, ваше время ожидания будет пятерки плюс один, шесть. Это означает больше недели.
Наличие двух команд, одна для инфра, инфраструктурные услуги, а другая для приложений сегодня распространено. Но в эпоху облачных вычислений, где услуги развернуты «à la carte», это больше не имеет смысла (имело ли это смысл день?).
Какое решение мы можем использовать?
К счастью, шаблон ARM позволяет выполнять некоторые задачи после обеспечения заданий. Это Microsoft. Вычислить/VirtualMachines/расширения. Этот ресурс позволяет вам выполнять сценарий и другие вещи после первого запуска недавно созданной виртуальной машины.
Это общий ресурс. С помощью этого вы можете установить антимологу, агент мониторинга или запустить сценарий.
Это выглядит как
{ "name": "Vmname/MyVmScript", "type": "Microsoft.Compute/virtualMachines/extensions", "apiVersion": "2019-03-01", "location": "[parameters('location')]", "dependsOn": [ "[variables('vmName')]" ], "properties": { "publisher": "Microsoft.Compute", "type": "CustomScriptExtension", "typeHandlerVersion": "1.8", "autoUpgradeMinorVersion": true, "settings": { }, "protectedSettings": {} } }
Где:
Тип, тип расширения, например, CustomScripPtextension или DSC TypeHandlerVersion, версия обработчика, инструменты, стоящие за расширением Autoupgrademinorversion, Boolean, указывают, следует ли обновить обработчик для более новой версии, если доступные настройки, настройки расширения защищены. Безопасная строка, данные в защитных установках не могут быть извлечены в журналы.
Расширение виртуальной машины — это дочерний ресурс. Его нельзя развернуть без родительского ресурса, виртуальной машины. Вы не можете настроить что -то в виртуальной машине, если виртуальная машина Это не онлайн.
Как дочерний ресурс, виртуальные махины/разгибания могут находиться внутри параметров ресурсов виртуальной машины.
{ "apiVersion": "2018-04-01", "type": "Microsoft.Compute/virtualMachines", "name": "[variables('vmName')]", "location": "[parameters('location')]", "properties": { //**** }, "resources": [ { "type": "extensions", "name": "MyVmScript", "apiVersion": "2019-03-01", "location": "[parameters('location')]", "dependsOn": [ "[variables('vmName')]" ], "properties": { "publisher": "Microsoft.Compute", "type": "CustomScriptExtension", "typeHandlerVersion": "1.8", "autoUpgradeMinorVersion": true, "settings": { // *** } } } ] }
Он может быть построен за пределами родительской виртуальной машины, но в этом случае имя ресурса расширения должно включать имя родительского ресурса, черту (/) и имя расширения.
{ "name": "Vmname/MyVmScript", "type": "Microsoft.Compute/virtualMachines/extensions", "apiVersion": "2019-03-01", "location": "[parameters('location')]", "dependsOn": [ "[variables('vmName')]" ], "properties": { "publisher": "Microsoft.Compute", "type": "CustomScriptExtension", "typeHandlerVersion": "1.10", "autoUpgradeMinorVersion": true, "settings": { // **** }, "protectedSettings": {} } }
Мы можем использовать этот ресурс расширения для настройки и развертывания приложений внутри сервера.
Давайте попробуем создать веб -сервер. Это простая задача, но она проиллюстрирует, как включить конфигурацию ОС IAAS с шаблоном ARM. Подумав об автоматизации установки IIS на сервере Windows, я думаю о PowerShell. Это простая команда
Install-WindowsFeature -name Web-Server
Давайте поместим его в скрипт с именем install-iis.ps1
Чтобы иметь возможность запустить его из шаблонов рук, он должен быть глобально доступен. Это может быть на GitHub или внутри контейнера Blob в учетной записи. Первый шаг. Поместите сценарий названного install-iis.ps1 в контейнер Blob с именем config.
$AzStorageContext = New-AzStorageContext -StorageAccountName myaccountname -StorageAccountKey $SasKey Set-AzStorageBlobContent -File "install-iis.ps1" -Container "config" -Blob "install-iis.ps1" -Context $AzStorageContext -Force
Теперь мы можем создать наш сервер, используя шаблон ARM.
{ "type": "Microsoft.Compute/virtualMachines/extensions", "name": "webserver01/installScriptIIS", "apiVersion": "2019-03-01", "location": "[resourceGroup().location]", "dependsOn": [ "[concat('Microsoft.Compute/virtualMachines/', 'webserver01')]" ], "properties": { "publisher": "Microsoft.Compute", "type": "CustomScriptExtension", "typeHandlerVersion": "1.10", "autoUpgradeMinorVersion": true, "settings": { "fileUris": [ "[variables('configVmScriptFile')]" ], "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File ', variables('scriptName'))]" }, "protectedSettings": { "storageAccountName": "[variables('storageAccountName')]", "storageAccountKey": "[variables('storageAccountKey')]" } } }
Переменная configvmscriptfile содержит URI для скрипта в контейнере Blob. Чтобы добраться до этого URI, необходимо имя учетной записи хранилища и ключ. Чтобы защитить эти два значения, вы можете передать их свойствами защищенных сборов.
"protectedSettings": { "storageAccountName": "[variables('storageAccountName')]", "storageAccountKey": "[variables('storageAccountKey')]" }
Как вы видите, Fileuris — это массив. Вы можете отправить один или несколько файлов в виртуальную машину. Эти файлы не должны быть скриптом PowerShell. Но вам понадобится хотя бы один, чтобы выполнить.
Файл загружается в виртуальную машину в C: \ Packages \ Plugins \ Microsoft. Вычислять. CustomScripTextension
Выполнение контролируется параметром команды. Расширение будет работать в последнем месте.
Вам нужно будет построить свою команду. Просто напомните вам, что вы находитесь в новой виртуальной машине без конфигурации, и с PowerShell это означает, что вам нужно настроить политику выполнения. Вы можете отслеживать выполнение скрипта, как и любое другое развертывание ресурсов.
Если в ваших сценариях возникает ошибка, развертывание ARM потерпит неудачу. Обязательно включите контроль ошибок в свои сценарии. Любое исключение закончится как неудачное развертывание, но только для развертывания расширения.
Внутри виртуальной машины вы можете проверить выполнение сценариев. Просто перейдите к X: \ Packages \ Plugins \ Microsoft. Вычислять. CustomScripTextension {version} \ runTimeSettings и читайте файлы x.settings, где x представляет экземпляры выполнения.
У вас будет настройка выполнения с параметром. Защищенные параметры зашифрованы.
Вы также можете проверить x: \ packages \ plugins \ microsoft. Вычислять. CustomScripTextension {версия} \ статус И прочитайте X.Status, это файл JSON с выводом и кодом ошибки из выполнения скрипта.
Вы не ограничены одним расширением сценария. Вы можете выполнить более одного расширения таможни, и больше вы можете цепорить их, используя Deventon.
Но есть что -то важное при использовании расширения сценария. Шаблоны ARM, по определению, идентифицируют (он выполняет действия только в случае необходимости) и декларативным (оно сообщает системе, как должно быть государство без каких -либо инструкций). Сценарий, большую часть времени, не идентифицирован. Это просто набор инструкций, в которых говорится, как что -то построить. Сценарий, который мы использовали, install-iis.ps1, не идентифицирован (он не будет проверять, установлена ли служба или нет) или декларатив (это просто сценарий установки). Это парадокс, чтобы запустить его в контексте развертывания рук.
Можем ли мы сделать лучше?
Использование сценария — не единственный способ установить IIS на сервере Windows. Существует декларативная и идентификационная опция, желаемое состояние конфигурации или DSC. И, к счастью, есть расширение руки для DSC.
DSC, желаемое состояние конфигурации, является платформой управления конфигурацией на основе PowerShell. Это идентификационно и декларативно, как в шаблонах рук. При развертывании службы IIS на сервере Windows тест DSC, если служба уже установлена или нет, и установите ее, если это необходимо, в других случаях она ничего не сделает.
DSC основан на сценарии конфигурации, где вы описываете состояние, которое вы хотите для своего сервера. Файл конфигурации использует ресурсы DSC для описания и включения только что описываемой вами конфигурации. Наконец, файлы конфигурации составлены в документы MOF.
Конфигурация DSC выглядит так.
Configuration IISConfig { Import-DscResource -ModuleName 'PSDesiredStateConfiguration' Node "localhost" { WindowsFeature WebServer { Ensure = 'Present' Name = 'Web-Server' } } }
Эта конфигурация устанавливает IIS на сервер.
Точно так же, как файлы конфигурации расширения сценария должны быть доступны во всем мире. Но с конфигурацией DSC у нас есть больше проблем для решения. У вас может быть более одного файла конфигурации и/или более одной конфигурации в файле. Как сказать Azure, какую конфигурацию вы хотите запустить для этого развертывания.
Расширение DSC имеет свойство, чтобы указать, какой файл конфигурации и какую конфигурацию вам необходимо использовать в этом развертывании.
Другая задача касается ресурсов DSC. Новая виртуальная машина может не иметь всех ресурсов, необходимых для включения конфигурации. Ресурс DSC является модулем PowerShell. Вы можете скачать их с помощью галереи PowerShell или частного репо. Но как вы можете получить эти модули внутри недавно созданной виртуальной машины?
Чтобы получить эти модули, решение в расширении DSC заключается в том, чтобы отправить их так же, как вы отправляете файлы конфигурации.
В других терминах нам необходимо создать пакет, zip -файл, с модулями ресурсов и файлами конфигурации DSC. Чтобы создать этот пакет, вы можете использовать это
save-module -Name ResourceModuleName -Path $BuildPath -Repository PSGallery copy-item -Path iisconfig.dsc.ps1 -Destination $BuildPath
Нам нужно создать пакет как файл zip
Compress-Archive -Path "$($BuildPath)\*" -DestinationPath configPackage.zip
$AzStorageContext = New-AzStorageContext -StorageAccountName myaccountname -StorageAccountKey $SasKey Set-AzStorageBlobContent -File configPackage.zip -Container "config" -Blob configPackage.zip -Context $AzStorageContext -Force
В отличие от расширения скрипта, расширение DSC требует ключа SAS для доступа к хранилищу. Вы не можете просто использовать имя учетной записи хранилища и ключ хранения. Вам необходимо сгенерировать клавишу SAS и добавить его в URI файла пакета конфигурации.
$AzStorageSASKey= New-AzStorageContainerSASToken -Name config -Context $AzStorageContext -Permission r -StartTime (get-date).AddHours(-1) -ExpiryTime (get-date).AddMonths(1)
Мы можем построить URI
"configFile": "configPackage.zip", "configVmScriptFile": "[concat('https://omcextarmscr01.blob.core.windows.net/','config/', variables('configFile'), variables('SasKey'))]",
Теперь мы можем построить наше расширение в шаблоне рук.
{ "type": "Microsoft.Compute/virtualMachines/extensions", "name": "webserver01/DSCManageIIS", "apiVersion": "2019-03-01", "location": "[resourceGroup().location]", "dependsOn": [ "[concat('Microsoft.Compute/virtualMachines/', 'webserver01')]" ], "properties": { "publisher": "Microsoft.Powershell", "type": "DSC", "typeHandlerVersion": "2.19", "autoUpgradeMinorVersion": true, "settings": { "ModulesUrl": "[variables('configVmScriptFile')]", "ConfigurationFunction": "iisconfig.dsc.ps1\\IISConfig", "Properties": {} }, "protectedSettings": { } } }
Конфигурация очень похожа на то, что мы видели в расширении скрипта, но вместо того, чтобы иметь настройку FileUris, у нас есть модуль. Эта настройка представляет собой строку, а не массив, как в пользовательском расширении скрипта. Вы не можете иметь более одного, обязательно поместите все свои файлы конфигурации и все модули в пакет.
Важной настройкой является конфигурационная функция. Это свойство рассказывает, как управлять пакетом и каким файлом и конфигурацией использовать в виртуальной машине. Конфигурации могут потребоваться параметры. Параметры могут быть переданы в конфигурацию с помощью свойств.
"Properties": { "testParam": "myTest" }
Конфигурация DSC может потребоваться учетные данные для выполнения некоторой операции. Думает о присоединении онлайн -домена. Вы можете защитить этот учетный данных с помощью свойства ProtectedSettings. Данные не будут отображаться в журнале.
Существует два шага, чтобы получить данные от защищенного установки в конфигурацию. Во -первых, вам нужно создать элемент в защите.
"protectedSettings": { "Items": { "AdminPassword": "[parameters('demoCredentiel')]" } }
Во -вторых, вы можете создать ссылку на данные с помощью PrivateSettingSref.
"Properties": { "testParam": "myTest", "Credential": { "Username": "test-dsc\\labadmin", "password": "PrivateSettingsRef:AdminPassword" }
После развертывания и первого начала виртуальной машины.
Пакет загружен в C: \ Packages \ Plugins \ Microsoft. PowerShell. Dsc
Включение конфигурации во время обеспечения виртуальной машины — это то, что думает. Это здорово, потому что он позволяет нам одновременно доставлять виртуальную машину и ее конфигурацию, но что, если мы хотим изменить эту конфигурацию?
В Azure вы можете использовать эту сложность, используя конфигурацию состояния автоматизации Azure. Этот сервис действует как сервер DSC Pull и конфигурацию обработки, управление модулями и компиляцию DSC. В качестве сервера тяги виртуальной машины может быть настроена для отчетности, если существует какая -либо дрейф в настоящей конфигурации и желаемом состоянии, и если есть новая конфигурация для реализации. Чтобы выполнить это, нам нужна учетная запись Azure Automation. Поскольку мы работаем с IIS, нам понадобится модуль ресурсов Xwebadministration. Последняя версия в галерее PowerShell-3.2.0-Preview
New-AzAutomationModule -AutomationAccountName MyAutomationAccount -ResourceGroupName MyRg -Name xWebAdministration -ContentLinkUri "https://www.powershellgallery.com/api/v2/package/xWebAdministration/3.2.0-preview0001"
Теперь мы можем создать нашу конфигурацию.
Configuration IISConfig { Import-DscResource -ModuleName 'PSDesiredStateConfiguration' Import-DscResource -ModuleName @{ModuleName = 'xWebAdministration';ModuleVersion = '3.2.0'} WindowsFeature WebServer { Ensure = 'Present' Name = 'Web-Server' } xWebSite DefaultSite { Ensure = 'Present' Name = 'Default Web Site' State = 'Stopped' ServerAutoStart = $false PhysicalPath = 'C:\inetpub\wwwroot' DependsOn = '[WindowsFeature]WebServer' } }
Имя модуля завершено с помощью версии модуля, чтобы убедиться, что будет работать с правильной версией в репозитории учетной записи автоматизации.
После добавления и составления конфигурации мы можем использовать ее в развертывании шаблона.
{ "type": "Microsoft.Compute/virtualMachines/extensions", "name": "webserverAsDSC/DSCManageIIS", "apiVersion": "2019-03-01", "location": "[resourceGroup().location]", "dependsOn": [ "[concat('Microsoft.Compute/virtualMachines/', 'webserverAsDSC')]" ], "properties": { "publisher": "Microsoft.Powershell", "type": "DSC", "typeHandlerVersion": "2.80", "autoUpgradeMinorVersion": true, "settings": { "Properties": [ { "Name": "RegistrationKey", "Value": { "UserName": "PLACEHOLDER_DONOTUSE", "Password": "PrivateSettingsRef:azureAutomationPrivateKey" }, "TypeName": "System.Management.Automation.PSCredential" }, { "Name": "RegistrationUrl", "Value": "[variables('azureAutomationURI')]", "TypeName": "System.String" }, { "Name": "NodeConfigurationName", "Value": "IISConfig.localhost", "TypeName": "System.String" }, { "Name": "ConfigurationMode", "Value": "ApplyandAutoCorrect", "TypeName": "System.String" }, { "Name": "RebootNodeIfNeeded", "Value": true, "TypeName": "System.Boolean" }, { "Name": "ActionAfterReboot", "Value": "ContinueConfiguration", "TypeName": "System.String" } ] }, "protectedSettings": { "Items": { "azureAutomationPrivateKey": "[variables('azureAutomationKey')]" } } } }
В разделе свойств нам необходимо определить те же свойства, которые мы находим в GUI Azure DSC, когда мы добавляем узел. Режим конфигурации DSC (Applyandmonitor, Applyonly и ApplyandAutoCorrect), действие после перезагрузки и перезагрузки при необходимости. Нам нужно предоставить URL Azure Automation с RegistrationUrl. Этот URI находится в свойстве ключа в настройках учетной записи Azure Automation.
Нам нужно аутентифицировать в веб -сервисах Azure Automation. Нам необходимо предоставить ключ, чтобы виртуальная машина присоединилась к Сервису, используя собственность RegistrationKey. Он содержит 3 значения. Имя пользователя, не используемое службами, вы можете установить что угодно, но оно должно присутствовать в шаблоне. Пароль, это ключ автоматизации Azure. Тип -имя, тип данных, если конечное значение, которое является постоянным, система. Управление. Автоматизация. Pscredential.
Чтобы обеспечить ключ автоматизации Azure, мы можем использовать защищенные настройки. Вам нужно добавить значение ключа/пары в часть элементов.
"protectedSettings": { "Items": { "azureAutomationPrivateKey": "[variables('azureAutomationKey')]" } }
В идеале значение должно храниться в ключевом хранилище, как пароль администратора виртуальной машины. Теперь мы можем ссылаться на это в регистрации.
"Value": { "UserName": "PLACEHOLDER_DONOTUSE", "Password": "PrivateSettingsRef:azureAutomationPrivateKey" }
После развертывания виртуальная машина зарегистрируется в службе автоматизации Azure. Конфигурация применяется для автоматизации виртуальной машины и Azure, выступая в качестве сервера тяги будет следить за любым дрейфом в конфигурации. Вы найдете журнал, как в первом случае, который мы используем.
С шаблоном рук мы можем выйти за рамки подготовки виртуальной машины. Мы можем использовать расширение для доставки того, что требует конечных пользователей, настроить виртуальную машину и заставить службу работать. В этом посте я использовал автоматизацию PowerShell, DSC и Azure. Но вы также можете использовать другие расширения, такие как Azure Pipeline, с Azure DevOps, Chef, Octopus Deploy и Puppet. Вы также можете объединить различные расширения в одном и том же шаблоне (но вы не можете добавить одинаковое расширение). Есть много возможностей, чтобы сократить разрыв между командами. В эпоху облака не нужно иметь 2 бункера, один для инфраструктуры, а другой — для приложения. Они должны работать вместе.
Шаблоны управления ресурсами Azure (серия 5 деталей)
Оригинал: «https://dev.to/omiossec/vm-provisioning-and-config-management-in-azure-with-arm-templates-36mh»