Пожинать то, что вы посеешь Iiac, Terraform, & Azure Devops сейчас с YAML
В этом посте я возьму вас через развертывание вашей инфраструктуры с использованием террафора и Azure DevOps. Вместо того, чтобы использовать Classi Classi Classe Pirecress Azure DEVOPS, так как я делал в моем предыдущем посте, Пожинать Что ты Sow Теперь я буду использовать YAML.
Зачем использовать YAML?
Для одного мы должны относиться к Все как код Отказ Ну, по крайней мере, все, что мы можем. Лечение вещей, поскольку код позволяет нам применить современные методы разработки программного обеспечения для них, таких как исходный контроль и процесс проверки. Двое, я люблю изучать новые вещи. Три, я был оспаривается сделать это Так что я требуется по закону, чтобы сделать это.
Страх и ненависть в DevOps …
До принятия этой проблемы у меня не было абсолютно нет опыта с YAML. Я посмотрел на некоторые трубопроводы, написанные в Ямле в один момент, и я был честно запуган. Насколько я в ужасе? День, когда я принял вызов, я посещал День Дни indy И я явно рассказал несколько людей о том, как я избегал писать свои трубопроводы в Ямле. Мало ли я знаю, что у меня будет первый трубопровод, написанный на ямле и бегал позже в тот вечер.
Что такое ямл?
ЯМЛ не Markup Language (YAML) — это язык сериализации данных, который обычно используется для файлов конфигурации. Вы можете узнать больше о YAML и его истории здесь Отказ
Давайте начнем
Для того, чтобы следовать по этому посту, вам нужно будет посмотреть на мой предыдущий пост Отказ При минимальном заполните шаги до «Вернуться к DEVOPS AZURE. » Однако, однако, настоятельно рекомендую вам полностью завершить его полностью, так как вы сможете нажать кнопку «Просмотр yaml», если вы застряли.
### Включить многоступенчатые трубопроводы
После того, как вы выполнили вышеупомянутые шаги, убедитесь, что у вас включена новая многоступенчатая функция трубопровода. Нажмите на свой профиль в правом верхнем углу, затем выберите «Предварительный просмотр». Убедитесь, что функция многоступенчатых трубопроводов включена.
### Создание вашего первого трубопровода YAML
Далее нажмите трубопроводы в левом меню. После этого щелкните новый конвейер в правом верхнем углу раздела трубопроводов. Затем выберите свой репозиторий. Если вы следовали в этом блоге, выберите Azure Repos Git.
Следующий Выберите стартовый трубопровод.
Это создаст базовый трубопровод YAML, добавьте его в наш репозиторий и объединить его в главную ветку.
Вышеуказанный ямл довольно проходит вперед. Это вызвано главной ветви (линии 6 и 7). Строка 9 и 10 рассказывает о том, какой тип агента использовать. Хотя линия 12 начинает описывать шаги в трубопроводе. Этот трубопровод проходит два встроенных скрипта.
Вы можете узнать больше о лазурных трубопроводах YAML Schema здесь Отказ
Далее мы собираемся обновлять YAML с нашими задачами сборки. Открыть VS код или ваш редактор выбора. Если вы используете VS-код, скачайте этот Лазурные трубопроводы расширение. Далее, Git тянуть на мастер. Теперь вы должны увидеть новый файл, Azure-Pipelines.yml.
Для целей этого поста я работал непосредственно на мастере. Не делай этого в реальном мире! В моем первом обновлении трубопровода я удалил два существующих шага. Затем я сделал следующие изменения.
Для начала измените VMImage для ‘VS2017-Win2016’.
Затем добавьте задачу copyfile @ 2. Tradefolder — это единственный требуемый вход. Установите его на ‘$ (Build.artifactGegyDirectore)/Terraform’.
Мы также устанавливаем содержимое на ‘* * «Это указывает, что мы хотим скопировать все файлы в корневой каталоге и все файлы в подпапках.
Справочная документация для задачи CopyFile @ 2 доступна здесь Отказ
Далее добавьте публикациюBuildartifacts @ 1 задача. Установите PathTopublish на ‘$ (build.artifactstagingdirectory)/Terraform’, артефактировать «падение».
Я не уверен, почему блок «Код» в WordPress добавляет пространство к первой строке каждого фрагмента кода YAML.
# Starter pipeline # Start with a minimal pipeline that you can customize to build and deploy your code. # Add steps that build, run tests, deploy, and more: # https://aka.ms/yaml trigger: - master pool: vmImage: 'vs2017-win2016' steps: - task: CopyFiles@2 displayName: 'Copy Files' inputs: TargetFolder: '$(build.artifactstagingdirectory)/Terraform' Contents: '**' - task: PublishBuildArtifacts@1 inputs: PathtoPublish: $(build.artifactstagingdirectory)/Terraform ArtifactName: drop
Теперь Git Commit Commit и протолкните ваш код для мастера.
Поздравляем, у вас есть рабочий сборнический трубопровод Отказ
### Время рефакторизации
Получение рабочей силы сборки была хорошей и все, что мы действительно хочем, это полный конвейер CI/CD.
Первый шаг в этом процессе — реформировать наш существующий конвейер на этапы. Этапы — это логические границы в вашем трубопроводе, такие как сборки, развертывание для разработки, прогона тесты, развертывание для подтылок и т. Д. Вы можете узнать больше о этапах здесь Отказ
Заполненный трубопровод выглядит так
trigger: - master stages: - stage: Build jobs: - job: Build pool: vmImage: 'vs2017-win2016' steps: - task: CopyFiles@2 displayName: 'Copy Files' inputs: TargetFolder: '$(build.artifactstagingdirectory)/Terraform' Contents: '**' - task: PublishBuildArtifacts@1 inputs: PathtoPublish: $(build.artifactstagingdirectory)/Terraform ArtifactName: drop
Я добавил блок этапов, а затем добавил этап сборки. В этом этапе сборки мы добавляем блок рабочих мест с одним заданием по сборке. Оттуда остальная часть нашего кода выглядит точно так же.
Добавление функциональности развертывания
Поскольку цель состоит в том, чтобы преобразовать весь трубопровод на YAML, его время добавить функциональность развертывания.
- stage: Deploy jobs: - deployment: DeployInfrastructure pool: vmImage: 'vs2017-win2016' variables: functions_appinsights: puzzleplatesfunctionsappinsights functions_appservice: puzzleplatesfunctionsappservice functions_storage: puzzleplatesstorage location: centralus puzzleplates_functions: puzzleplatesfunctions resource_group: PuzzlePlates-ResourceGroup terraformstorageaccount: pzzlepltstfrmstrgaccnt terraformstoragerg: PuzzlePlatesStorage environment: 'Puzzel Plates Development Infrastructure' strategy: runOnce: deploy:
Во-первых, добавьте новый этап с именем развертывания. Затем добавьте блок заданий, а затем добавьте работу развертывания. Вы можете узнать больше о рабочих местах развертывания здесь Отказ
Установите vmimage для ‘vs2017-win2016’.
Затем установите ваши переменные в работе. Переменные могут быть установлены на уровне задания, либо уровень корня.
Оттуда установите ваше имя окружающей среды. Затем заявляйте стратегию развертывания. На данный момент доступно только Runonce.
Далее определите шаги развертывания.
deploy: steps: - download: current artifact: drop
Продолжая от развертывания, первый шаг к определению загружает артефакт сборки. » -Всадка «Краткая рука для загрузки трубопроводной задачи. Вы можете прочитать больше об этом здесь Отказ Все, что мы делаем, рассказывает это, чтобы загрузить самый актуальный артефакт имени «Drop».
- task: AzureCLI@1 displayName: 'Azure CLI - Create Terraform State Storage' inputs: azureSubscription: 'Terraform_Azure_RM' scriptLocation: inlineScript inlineScript: | call az group create --location centralus --name $(terraformstoragerg) call az storage account create --name $(terraformstorageaccount) --resource-group $(terraformstoragerg) --location centralus --sku Standard_LRS call az storage container create --name terraform --account-name $(terraformstorageaccount) - task: AzurePowerShell@3 inputs: name: 'Azure PowerShell - Get Key' azureSubscription: 'Terraform_Azure_RM' azurePowerShellVersion: LatestVersion scriptType: InlineScript Inline: | $key=(Get-AzureRmStorageAccountKey -ResourceGroupName $(terraformstoragerg) -AccountName $(terraformstorageaccount)).Value[0] Write-Host "##vso[task.setvariable variable=storagekey]$key"
Далее добавьте задачу Azurecli. Установите DisplayName, затем установите входы. Первый вход, AzuSubScription настроен на руководитель обслуживания, который может создавать ресурсы в Azure. Развернутая инфраструктура в Azure от Azure DevOps требует подключения службы сервисного менеджера Azure. Следуйте этим Инструкции создать один. После установки подписки установите ScriptLocation в Inlinescript. Затем установите InlinesCrpt в код, показанный выше. Этот код создает хранилище BLOB Azure для хранения штата Terraform. Символ трубы означает, что любой текст с отступом, который следует, следует рассматривать как многострочное скалярное значение. Вы можете прочитать больше об этом на Stackoverflow Отказ
Движение дальше, AzurepowerShell @ 3 задания. Не добавляйте задачу версии 4, так как есть конфликт с встроенным скриптом. Установите имя. Затем установите AZURSUBSCRICE на принципиальную службу, которую мы использовали в предыдущей задаче. После этого установите AzurePowerShellversion к AzureVersion и ScriptType в Inlinescript. Затем скопируйте вышеуказанный код. Этот код сохраняет ключ хранения в выпускной трубопровод.
Далее мы будем добавлять задачу ReperaceTokens. Эта задача — это расширение рынка, поэтому вам нужно будет установить его в ваш аккаунт Azure DEVOPS. Эта задача заменит все значения с префиксом «__» и суффиксом с переменными из выпускного трубопровода. Нажмите здесь получить расширение.
#Marketplace Extension - task: replacetokens@3 displayName: 'Replace Tokens' inputs: rootDirectory: '$(Pipeline.Workspace)/drop' targetFiles: '**/*.tf' tokenPrefix: '__' tokenSuffix: '__'
У меня было немного неприятностей выяснить, какие фактические входные аргументы были названы, поскольку они немного отличаются, что то, что представлено в классическом редакторе. Я закончил погрузиться в базу кода расширения на Github Отказ Установите RootDirectory в каталог Drop в трубопроводном пространстве. Затем установите TargetFiles для сканирования всех файлов .tf в текущем каталоге, включая все подгруппы.
Далее добавьте задачи террафора. Задача Terraform — это еще одно расширение, и вам нужно будет установить его в свой аккаунт Azure DEVOPS. Расширение можно найти здесь Отказ
#Terraform - task: Terraform@2 displayName: 'Terraform Init' inputs: TemplatePath: '$(Pipeline.Workspace)/drop' Arguments: init InstallTerraform: true UseAzureSub: true ConnectedServiceNameARM: 'Terraform_Azure_RM' - task: Terraform@2 displayName: 'Terraform Plan' inputs: TemplatePath: '$(Pipeline.Workspace)/drop' Arguments: plan InstallTerraform: true UseAzureSub: true ConnectedServiceNameARM: 'Terraform_Azure_RM' - task: Terraform@2 displayName: 'Terraform Apply' inputs: TemplatePath: '$(Pipeline.Workspace)/drop' Arguments: apply -auto-approve InstallTerraform: true UseAzureSub: true ConnectedServiceNameARM: 'Terraform_Azure_RM'
ИНВИНИЯ TERRAFORM Инициализирует рабочий каталог, содержащий файлы конфигурации террафора на агенте. Установите шаблон путь к месту артефакта, $ (трубопровод. Рабочая область)/падение. Далее установите аргументы в init. Затем установите INSTORTERRAFORFORM в True. После этого установите USEAZUSUSUB в True и установите подключенную ссылку на ранее использованную учетную запись службы.
План Terraform сравнивает существующую инфраструктуру к тому, что находится в коде, которую вы развертываете и определяете, необходимо ли создавать, обновлять или уничтожать ресурсы. Настройки точно такие же, за исключением, что вы устанавливаете аргументы для плана.
Террафом применяет план на инфраструктуру. Настройки точно такие же, как два предыдущих задача Terraporm, за исключением того, что вы устанавливаете аргументы, чтобы применить -Auto-Approv. Эта последняя задача создаст, обновит или уничтожит вашу инфраструктуру в Azure.
Поздравляю, у вас сейчас есть работающий многоступенчатый лазурный трубопровод, написанный на YAML !!!
Весь трубопровод YAML
trigger: - master stages: - stage: Build jobs: - job: Build pool: vmImage: 'vs2017-win2016' steps: - task: CopyFiles@2 displayName: 'Copy Files' inputs: TargetFolder: '$(build.artifactstagingdirectory)/Terraform' Contents: '**' - task: PublishBuildArtifacts@1 inputs: PathtoPublish: $(build.artifactstagingdirectory)/Terraform ArtifactName: drop - stage: Deploy jobs: - deployment: DeployInfrastructure pool: vmImage: 'vs2017-win2016' variables: functions_appinsights: puzzleplatesfunctionsappinsights functions_appservice: puzzleplatesfunctionsappservice functions_storage: puzzleplatesstorage location: centralus puzzleplates_functions: puzzleplatesfunctions resource_group: PuzzlePlates-ResourceGroup terraformstorageaccount: pzzlepltstfrmstrgaccnt terraformstoragerg: PuzzlePlatesStorage environment: 'Puzzel Plates Development Infrastructure' strategy: runOnce: deploy: steps: - download: current artifact: drop - task: AzureCLI@1 displayName: 'Azure CLI - Create Terraform State Storage' inputs: azureSubscription: 'Terraform_Azure_RM' scriptLocation: inlineScript inlineScript: | call az group create --location centralus --name $(terraformstoragerg) call az storage account create --name $(terraformstorageaccount) --resource-group $(terraformstoragerg) --location centralus --sku Standard_LRS call az storage container create --name terraform --account-name $(terraformstorageaccount) - task: AzurePowerShell@3 inputs: name: 'Azure PowerShell - Get Key' azureSubscription: 'Terraform_Azure_RM' azurePowerShellVersion: LatestVersion scriptType: InlineScript Inline: | $key=(Get-AzureRmStorageAccountKey -ResourceGroupName $(terraformstoragerg) -AccountName $(terraformstorageaccount)).Value[0] Write-Host "##vso[task.setvariable variable=storagekey]$key" #Marketplace Extension - task: replacetokens@3 displayName: 'Replace Tokens' inputs: rootDirectory: '$(Pipeline.Workspace)/drop' targetFiles: '**/*.tf' tokenPrefix: '__' tokenSuffix: '__' #Terraform - task: Terraform@2 displayName: 'Terraform Init' inputs: TemplatePath: '$(Pipeline.Workspace)/drop' Arguments: init InstallTerraform: true UseAzureSub: true ConnectedServiceNameARM: 'Terraform_Azure_RM' - task: Terraform@2 displayName: 'Terraform Plan' inputs: TemplatePath: '$(Pipeline.Workspace)/drop' Arguments: plan InstallTerraform: true UseAzureSub: true ConnectedServiceNameARM: 'Terraform_Azure_RM' - task: Terraform@2 displayName: 'Terraform Apply' inputs: TemplatePath: '$(Pipeline.Workspace)/drop' Arguments: apply -auto-approve InstallTerraform: true UseAzureSub: true ConnectedServiceNameARM: 'Terraform_Azure_RM'
Заключение
Хотя сначала я был запуган, я смог получить свой первый трубопровод и работать в течение нескольких часов.
Я столкнулся с некоторыми проблемами с расстоянием между расстояниями и вдавливанием, что заняло меня дольше, чем я забочусь о признании. Я также столкнулся с проблемой, используя предварительный просмотр версии 4 задания AzurePowerShell и понижена до версии 3.
Мой первоначальный страх был совершенно необоснован (за исключением кошмаров отступа/расстояния, те, которые полностью оправданы). Как только у меня был начальный трубопровод, построенный, я был зацеплен. Я полностью наслаждался писать трубопровод и с нетерпением жду нового, который он предложит.
Оригинал: «https://dev.to/ikethedev/reap-what-you-sow-ii-1eh4»