Работая с Azure в течение примерно года, ясно, почему Шаблоны рук популярны. Они предоставляют декларативную модель для создания целых среды на прикосновении кнопки.
Однако, если как я, вы когда -нибудь пытались создать файл шаблона рук, вы могли бы встретить с ними одну из моих самых больших проблем; Они полагаются на струны и подвержены человеческим ошибкам. Там нет компилятора, чтобы помочь мне, когда у меня есть опечатка в шаблоне (и их было много!).
Однако я использовал C# в качестве основного языка развития с 2012 года, с тех пор, его функциональный аналог, F# становится все более популярным. Как я недавно узнал, у него есть несколько полезных функций, которые могут помочь с моей дилеммой шаблона рук. Одна область, в частности, где F# Excels-это встроенный Тип-безопасность Анкет
В этом посте я продемонстрирую безопасность типа в F# в действии, используя Фермер Чтобы сгенерировать простой шаблон Azure WebApp Arm, а затем я пройду, как вы можете использовать его возможности развертывания через Octopus, чтобы напрямую развернуть различные веб -приложения для Azure.
В этом посте
- Что такое фермер?
- Зачем нужен фермер?
- Создать шаблон фермера
- Упаковать шаблон фермера
- Развернуть шаблон фермера
- Вывод
Что такое фермер?
Авторы фермера говорит :
Фермер — это открытый исходный код, бесплатно использовать .net Домен-специфический язык (DSL) для быстрого генерирования шаблонов некомплексных ресурсов Azure Manager (ARM).
Чтобы использовать фермера, вы создаете Фермерский шаблон Анкет Это .net Основные приложения, которые ссылаются на фермера через Nuget Package и они определяют ваши ресурсы Azure, которые вы хотите создать.
Зачем нужен фермер?
Вместо того, чтобы повторять то, что уже есть, я призываю вас прочитать О разделе о документации фермера для более подробной информации о мотивах создания DSL для шаблонов ARM.
Для меня основные моменты:
- Он предоставляет набор типов, которые вы можете использовать для создания ресурсов Azure, и устраняет шансы на создание неверного шаблона, поскольку они сильно используются.
- Он может генерировать простые шаблоны ARM очень кратко и, необязательно, развернуть их.
Создать шаблон фермера
Чтобы создать шаблон фермера, нам сначала нужно создать .net Основное приложение. Вы можете сделать это в своем выборе IDE, или если вы предпочитаете командную линию, вы можете использовать dotnet new
Команда, передавая шаблон типа приложения, который вам требуется.
Типично использовать приложение консоли для шаблона фермера, и вы можете создать его с Dotnet New Console
Команда:
dotnet new console -lang "F#" -f "netcoreapp3.1" -n "SimpleAzureWebApp"
Это создает новый f# .net Приложение Core 3.1 с именем SimpleazureWebapp В используя -n
параметр, который мы поставляли.
Далее нам нужно добавить фермера в проект, запустив Добавить пакет
Команда:
dotnet add package Farmer
Теперь у нас есть наши зависимости, мы можем пойти дальше и отредактировать Program.fs
Файл, который был сгенерирован для нас, когда мы создали новое приложение консоли.
TL; DR
Если вы хотите увидеть полную программу, пропустите прямо к конец или просмотреть исходный код Анкет Если вы хотите больше подробностей, читайте дальше!
Параметры шаблона
Чтобы сделать шаблон фермера гибким, мы добавим некоторые параметры в приложение. Это позволит нам обеспечить различные ценности, и фермер создаст наши ресурсы в Azure на основе этих ценностей.
Первые три, которые нам нужны, связаны с аутентификацией с Azure. Эти значения можно получить, создав Основная служба Azure Анкет
- Appid : Идентификатор приложения, используемый для принципала обслуживания.
- Секрет : Пароль, используемый для основной суммы службы.
- TenantId : ClientId, используемый для принципала службы.
Обеспечение учетных данных: Храните учетные данные, которые вы используете для входа в Azure в безопасном месте, например, менеджер паролей или экземпляр Deploy Octopus, используя, предпочтительно, Azure Account или Чувствительные переменные Анкет Вы также должны избегать их управления источником.
Чтобы запустить приложение, мы также предоставим:
- Имя группы ресурсов : В какую группу ресурсов добавить Azure WebApp.
- Имя веб -приложения : Имя, чтобы дать Azure WebApp.
- WebApp Sku : Какой тип План обслуживания приложений использовать для веб -приложения.
- Расположение WebApp : Расположение центра обработки данных, где вы хотели бы разместить Azure WebApp.
Чтобы добавить наши необходимые параметры, код выглядит следующим образом:
let azAppId = argv.[0] let azSecret = argv.[1] let azTenantId = argv.[2] let azResourceGroupName = argv.[3] let azWebAppName = argv.[4] let azWebAppSku = argv.[5] let azWebAppLocation = argv.[6]
Это присваивает параметры из сбора аргументов, предоставленных в программу, когда она работает, на основе их позиции из командной строки.
Проверка параметров: В этом примере я не показываю проверку параметров, но вы можете подумать о добавлении ее в шаблон вашего фермера, чтобы убедиться, что они имеют приемлемые значения.
Определите ресурсы Azure
После того, как у нас есть значения параметров, мы можем определить наш Azure WebApp в F#:
let webAppSku = WebApp.Sku.FromString(azWebAppSku) let webApp = webApp { name azWebAppName sku webAppSku }
Здесь мы назначаем webapp SKU переменной с именем WebAppsku
Анкет Это сделано вспомогательной функцией, чтобы вернуть сильно напечатанную Sku
Анкет Тогда мы создаем наш WebApp
переменная с использованием фермера Сборщик веб -приложений Анкет
Далее мы создаем нашу развертывание рук, используя фермера Развертывание ARM Builder , что в этом примере состоит из места для развертывания, и Azure WebApp, как определено ранее:
let deployLocation = Location.FromString(azWebAppLocation) let deployment = arm { location deployLocation add_resource webApp }
Встроенная безопасность типа
В обоих предыдущих примерах кода мощность системы F# типа вступает в свою собственную. Невозможно создать значение, которое является недействительным в соответствии с его типом.
Давайте посмотрим пример. Предположим, я хотел создать наш Azure WebApp с Sku
который имел значение Очень бесплатно
Анкет Если я попытаюсь создать это в нашем приложении, компилятор даст мне предупреждение, и это не построит:
Это потому, что компилятор знает строковое значение Очень бесплатно
неправильный тип, и вместо этого должен быть Sku
тип.
Здесь фермер действительно превосходит изготовление собственного шаблона рук вручную. Использование F# обеспечивает вам безопасность типа, чтобы убедиться, что у вас есть действительные шаблоны с самого начала.
Фермер и рука: Существует более подробное сравнение между шаблонами фермеров и рук Здесь Анкет
Генерировать шаблон руки
Когда ваши ресурсы Azure смоделированы, Фермер поддерживает разные способы генерировать шаблон руки Анкет Один из способов — написать его в файл напрямую:
deployment |> Writer.quickWrite "output"
Затем вы можете взять этот файл и развернуть в Azure, используя ваш предпочтительный метод.
Развертывание в Azure
В дополнение к генерации шаблона ARM, вы также можете, опционально попросить фермера выполнить развертывание в Azure, когда приложение запускается.
Azure CLI требуется Если вы используете функцию интегрированного развертывания в Azure, вам понадобится Azure CLI, установленная на машине, где вы запускаете приложение.
В нашем примере SimpleazureWebapp Приложение, мы воспользуемся этой функцией.
Прежде чем мы сможем выполнить развертывание, нам нужно аутентифицировать с помощью Azure. Фермер приходит с Развернуть. Аунтенсификация
Команда, и вы звоните в него, передавая учетные данные, которые вы предоставили заявке ранее, как это:
Deploy.authenticate azAppId azSecret azTenantId |> ignore
Когда вызов Authenticate заканчивается, он возвращает список подписок Azure, связанные с принципалом службы. В этом примере эти результаты передаются на игнорировать
функция
Если есть какие -либо ошибки, аутентифицирующиеся с Azure, будет вынесена ошибка. Если логин преуспевает, нам нужно заставить фермера выполнить наше развертывание, используя Deploy.execute
Команда:
deployment |> Deploy.execute azResourceGroupName Deploy.NoParameters |> ignore
Вы можете запросить результаты развертывания ARM, но, как и при вызове аутентификации, мы игнорируем их. Аналогичным образом, любые ошибки при развертывании будут вспять как исключение.
Полный шаблон фермера
И это все, что есть для нашего приложения. Вот законченное Program.fs
файл:
open Farmer open Farmer.Builders open SimpleAzureWebApp.SkuExtension [] let main argv = let azAppId = argv.[0] let azSecret = argv.[1] let azTenantId = argv.[2] let azResourceGroupName = argv.[3] let azWebAppName = argv.[4] let azWebAppSku = argv.[5] let azWebAppLocation = argv.[6] let webAppSku = WebApp.Sku.FromString(azWebAppSku) let webApp = webApp { name azWebAppName sku webAppSku } let deployLocation = Location.FromString(azWebAppLocation) let deployment = arm { location deployLocation add_resource webApp } printf "Authenticating with Azure\n" Deploy.authenticate azAppId azSecret azTenantId |> ignore printf "Deploying Azure WebApp %s (%s) into %s using Farmer\n" azWebAppName azResourceGroupName azWebAppLocation deployment |> Deploy.execute azResourceGroupName Deploy.NoParameters |> ignore printf "Deployment of Azure WebApp %s (%s) complete!\n" azWebAppName azResourceGroupName 0 // return an integer exit code
Упаковать шаблон фермера
Теперь у нас есть приложение, следующим шагом — упаковать его для использования с осьминогом. Для простоты я создаю и упаковываю приложение с помощью инструментов командной строки, но я рекомендовал автоматизировать это как часть полного трубопровода CI/CD.
Если вы новичок в строительстве .net Основные приложения, у нас есть ряд Руководства Это включает в себя пошаговые инструкции для настройки конвейера CI/CD с использованием различных инструментов.
Построить SimpleazureWebapp Приложение, мы запускаем Dotnet Publish
Команда в каталоге приложений:
dotnet publish -o output
Это создает и публикует приложение консоли и помещает двоичные файлы в вывод
Папка, как указано с использованием -o
параметр.
Далее нам нужно упаковать приложение, и на этот раз мы используем CLI Octopus пакет Команда:
octo pack --id SimpleAzureWebApp --format Zip --version 1.0.0.0 --basePath output
Это генерирует файл с именем SimpleazureWebapp.1.0.0.0.zip
который может быть загружен на осьминог Встроенный репозиторий или внешний Репозиторий пакета Анкет
Вы можете подтолкнуть к встроенному репозиторию осьминога, используя команду Octopus CLI, push :
octo push --package SimpleAzureWebApp.1.0.0.0.zip --server https://my.octopus.url --apiKey API-XXXXXXXXXXXXXXXX
После того, как пакет был загружен, мы можем настроить осьминог для запуска нашего приложения для развертывания в Azure.
Развернуть шаблон фермера
Одна из интересных вещей в Octopus заключается в том, что вы можете выбрать, как развернуть. С введением Операции Runbooks В прошлом году эта гибкость была расширена еще дальше на операционные задачи, например, управление вашей инфраструктурой.
Создайте runbook
Чтобы выполнить наш шаблон фермера, мы создадим книгу, которая развертывает его в Azure. Для этого:
- Создайте новый проект в осьминоге.
- Перейдите в процесс RunBook из раздела «Раньи книги».
- Нажмите Добавить runbook Анкет
- Из обзора нажмите Определите свой процесс runbook Анкет
- Нажмите Добавьте шаг Анкет
На выборе шага выберите Запустите скрипт шаг и дайте ему имя. Используя шаг сценария, мы можем использовать Справочный пакет Функция, чтобы включить наш пакет как часть выполнения скрипта.
Чтобы включить нашу пакет, в Ссылки на пакеты раздел, нажмите Добавить и добавьте пакет SimpleAzureWebApp, который мы загрузили ранее:
Держите все по умолчанию и щелкните ОК Анкет
Добавить сценарий runbook
Затем нам нужно добавить встроенный сценарий, который выполнит наш шаблон фермера. Начнем с добавления необходимых учетных данных Azure:
$appId = $OctopusParameters["Project.Azure.Account.Client"] $secret = $OctopusParameters["Project.Azure.Account.Password"] $tenantId = $OctopusParameters["Project.Azure.Account.TenantId"]
Сценарий ссылается на ряд расширенных Свойства переменной учетной записи Azure такие как Клиент
а также TenantId
Из переменной проекта с именем Проект. Лазур. Учетная запись
Анкет Это удобно, так как нам не нужно указывать отдельные переменные для каждого свойства.
После того, как у нас есть учетные данные, мы хотим указать параметры Azure WebApp, включая группу ресурсов и имя WebApp, которые будут переданы в нашу SimpleAzureWebapp .net .net Основное приложение:
$resourceGroupName = $OctopusParameters["Project.Azure.ResourceGroupName"] $webAppName = $OctopusParameters["Project.Azure.WebAppName"] $webAppSku = $OctopusParameters["Project.Azure.WebAppSku"] $webAppLocation = $OctopusParameters["Project.Azure.WebAppLocation"]
Наконец, мы получаем путь извлеченного шаблонного пакета фермера, используя переменная пакета называется Осьминог. Действие. Пакет [SimpleazureWebapp] .extractedPath
а затем установите рабочий каталог на этот путь и вызовите Dotnet Run
Команда проходит во всех наших параметрах:
$farmerPackagePath = $OctopusParameters["Octopus.Action.Package[SimpleAzureWebApp].ExtractedPath"] Set-Location $farmerPackagePath dotnet SimpleAzureWebApp.dll $appId $secret $tenantId $resourceGroupName $webAppName $webAppSku $webAppLocation
.СЕТЬ Основное время выполнения, предварительное значение Для выполнения этого шага сценария, он требует .NET Основная среда выполнения, которая будет установлена в целевой или работнике развертывания, где настраивается шаг для выполнения.
Добавьте переменные
Нам также необходимо добавить переменные, упомянутые в сценарии выше:
Проект. Лазур. Учетная запись
Переменная — это Переменная учетной записи Azure а остальные являются текстовыми переменными.
Запустите runbook
Если у вас есть так далеко, последняя часть состоит в том, чтобы объединить все это и запустить нашу runbook в осьминоге и развернуть шаблон фермера в Azure.
Вы можете увидеть пример Runbook, который работает для разработки, создавая Azure WebApp под названием Фермер-Вэбапп-дев
:
После того, как runbook заполнится до завершения, вы можете проверить, что ваше веб -приложение создано с использованием Портал лазурного . Вот соответствующий веб -приложение, которое было создано в Azure в результате запуска RunBook для разработки:
Вывод
Самое замечательное в этой технике использования фермеров для создания и развертывания ваших ресурсов в Azure заключается в том, что вы можете контролировать свои шаблоны. Код, который определяет вашу инфраструктуру, может жить вместе с кодом, который работает на нем. Кроме того, больше не хватает ручных редактирования файлов JSON, и кто этого не хочет!
До следующего раза, счастливого развертывания!
Учить больше
Этот пост был первоначально опубликован в octopus.com .
Оригинал: «https://dev.to/octopus/farmer-simpler-arm-deployments-with-octopus-deploy-2ea1»