Логотип Microsoft Azure
Hashicorp Packer это бесплатный и инструмент с открытым исходным кодом для создания золотых изображений для нескольких платформ из конфигурации одного источника. Packer позволяет легко кодифицировать изображения виртуальных машин для Microsoft Azure.
В этом сообщении мы рассмотрим, как использовать Hashicorp Packer и Puppet Bolt, чтобы определить наши шаблоны VM в коде.
Плагин Puppet Bolt Packer
Hashicorp Packer не является назначенной интеграцией с куколкой. Плагин Packer был создан для упрощения этой интеграции. Чтобы начать использование плагина, последнее пакет выпуска для вашей операционной системы должен быть загружен с https://github.com/martezr/packer-provisioner-puppet-bolt/releases/latest Репозиторий GitHub и распакован.
После того, как бинарная бинарного пакета Packer-Provisioner-Puppet-Bolt будет распаковано, его следует перемещать на путь в системе, где Packer может найти его, как это покрыто по ссылке ниже.
https://www.packer.io/docs/extending/plugins#installing-plugins
План кукольного болта
Убедитесь, что последняя версия Puppet Bolt установлена перед началом работы.
В этом посте мы будем использовать Puppet Bolt для установки Nginx в качестве простого примера интеграции между Packer и Bolt. План Bolt YAML ниже устанавливает репозиторий Epel-релиза, Nginx и позволяет службе запускаться на загрузке.
parameters: targets: type: TargetSpec steps: - command: yum -y install epel-release targets: $targets description: "Install epel-release" - command: yum -y install nginx targets: $targets description: "Install nginx" - command: systemctl enable nginx targets: $targets description: "Start nginx on boot"
Шаблон упаковки
Теперь нам нужно создать наш шаблон упаковки, который определяет настройки для нашего виртуального изображения, таких как операционная система и конфигурация аппаратного обеспечения. Прежде чем мы создадим наш шаблон, мы генерируем наши учетные данные Azure, если у нас еще нет учетных данных и создавать специальную группу ресурсов для виртуального изображения, сгенерированного Packer.
Создайте новую группу ресурсов Azure для изображения виртуальной машины или используя существующую группу ресурсов. Позже мы указам группу ресурсов в нашем шаблоне Packer.
az group create -n packerbolt -l centralus
Нам нужно генерировать учетные данные Azure для Packer для использования при создании изображения виртуальной машины. Следующая команда генерирует необходимые учетные данные, предполагая, что вы вошли в Azure.
az ad sp create-for-rbac --query "{ client_id: appId, client_secret: password, tenant_id: tenant }"
Учетные данные Azure должны отображаться на экране, аналогично отображаемым ниже.
Собственная защита сгенерированных учетных данных, они не должны быть разделены.
{ "client_id": "b27e2468-e9ad-5ea8-c043-196fc8d2q1mw", "client_secret": "91f28cwg-49e3-1qr2-825a-42fne279fd01", "tenant_id": "tg4b7md3-630k-8664-2t45-d1w923dww21w" }
Мы можем передать учетные данные в командной строке, включить их в файл переменных или добавить их в качестве переменных среды, как показано ниже.
export ARM_CLIENT_ID="b27e2468-e9ad-5ea8-c043-196fc8d2q1mw" export ARM_CLIENT_SECRET="91f28cwg-49e3-1qr2-825a-42fne279fd01" export ARM_TENANT_ID="tg4b7md3-630k-8664-2t45-d1w923dww21w"
С набором учетных данных Azure мы теперь можем создать наш файл шаблона Packer, чтобы определить наше изображение виртуальной машины. Managed_image_resource_group_name Поле установлено в группе ресурсов Azure, которую мы создали ранее.
{ "variables": { "client_id": "{{env `ARM_CLIENT_ID`}}", "client_secret": "{{env `ARM_CLIENT_SECRET`}}", "subscription_id": "{{env `ARM_SUBSCRIPTION_ID`}}", "tenant_id": "{{env `ARM_TENANT_ID`}}", "ssh_user": "centos", "ssh_pass": "{{env `ARM_SSH_PASS`}}" }, "builders": [{ "type": "azure-arm", "client_id": "{{user `client_id`}}", "client_secret": "{{user `client_secret`}}", "subscription_id": "{{user `subscription_id`}}", "tenant_id": "{{user `tenant_id`}}", "managed_image_resource_group_name": "packerbolt", "managed_image_name": "MyCentOSImage", "ssh_username": "{{user `ssh_user`}}", "ssh_password": "{{user `ssh_pass`}}", "os_type": "Linux", "image_publisher": "OpenLogic", "image_offer": "CentOS", "image_sku": "8_2", "image_version": "latest", "ssh_pty": "true", "location": "Central US", "vm_size": "Standard_B1MS" }], "provisioners": [ { "type": "puppet-bolt", "user": "centos", "run_as": "root", "bolt_module_path": "/Users/martez.reed/Documents/GitHub/puppet-on-azure/Bolt", "bolt_plan": "azure::web", "bolt_params": {} }, { "execute_command": "echo '{{user `ssh_pass`}}' | {{ .Vars }} sudo -S -E sh '{{ .Path }}'", "inline": [ "yum update -y", "/usr/sbin/waagent -force -deprovision+user && export HISTSIZE=0 && sync" ], "inline_shebang": "/bin/sh -x", "type": "shell", "skip_clean": true } ] }
В разделе «Puppet Bolt» из приведенного выше шаблона показано, что мы указали несколько настройки для нашего Puppet Bolt Provisioner. Мы указали план болта, путь для поиска наших модулей и аутентификации, а также информации о эскалации привилегий.
{ "type": "puppet-bolt", "user": "centos", "run_as": "root", "bolt_module_path": "./puppet-on-azure/Bolt", "bolt_plan": "azure::web", "bolt_params": {} }
С созданным шаблоном упаковки мы теперь можем построить наше изображение Azure, выполнив команду сборки Packer и предоставить имя файла шаблона.
packer build centos8.json
Сборка займет несколько минут и должна отображать выход, аналогичный показанному ниже:
azure-arm: output will be in this color. ==> azure-arm: Running builder ... ==> azure-arm: Getting tokens using client secret ==> azure-arm: Getting tokens using client secret azure-arm: Creating Azure Resource Manager (ARM) client ... ==> azure-arm: WARNING: Zone resiliency may not be supported in Central US, checkout the docs at [https://docs.microsoft.com/en-us/azure/availability-zones/](https://docs.microsoft.com/en-us/azure/availability-zones/) ==> azure-arm: Creating resource group ... ==> azure-arm: -> ResourceGroupName : 'pkr-Resource-Group-rivksir0po' ==> azure-arm: -> Location : 'Central US' ==> azure-arm: -> Tags : ==> azure-arm: Validating deployment template ... ==> azure-arm: -> ResourceGroupName : 'pkr-Resource-Group-rivksir0po' ==> azure-arm: -> DeploymentName : 'pkrdprivksir0po' ==> azure-arm: Deploying deployment template ... ==> azure-arm: -> ResourceGroupName : 'pkr-Resource-Group-rivksir0po' ==> azure-arm: -> DeploymentName : 'pkrdprivksir0po' ==> azure-arm: Getting the VM's IP address ... ==> azure-arm: -> ResourceGroupName : 'pkr-Resource-Group-rivksir0po' ==> azure-arm: -> PublicIPAddressName : 'pkriprivksir0po' ==> azure-arm: -> NicName : 'pkrnirivksir0po' ==> azure-arm: -> Network Connection : 'PublicEndpoint' ==> azure-arm: -> IP Address : '23.101.127.134' ==> azure-arm: Waiting for SSH to become available... ==> azure-arm: Connected to SSH! ==> azure-arm: Provisioning with Puppet Bolt... ==> azure-arm: Executing Bolt: bolt plan run azure::web --params {} --modulepath /Users/martez.reed/Documents/GitHub/puppet-on-azure/Bolt --targets ssh://127.0.0.1:65059 --user centos --no-host-key-check --private-key /var/folders/ly/bwpnd5gn5tv7549rgn80x4jw0000z_/T/packer-provisioner-bolt.164237326.key --run-as root azure-arm: Starting: plan azure::web azure-arm: Starting: Install epel-release on ssh://127.0.0.1:65059 azure-arm: Finished: Install epel-release with 0 failures in 11.75 sec azure-arm: Starting: Install nginx on ssh://127.0.0.1:65059 azure-arm: Finished: Install nginx with 0 failures in 17.38 sec azure-arm: Finished: plan azure::web in 29.15 sec azure-arm: Plan completed successfully with no result ==> azure-arm: Provisioning with shell script: /var/folders/ly/bwpnd5gn5tv7549rgn80x4jw0000z_/T/packer-shell758099055 ==> azure-arm: Querying the machine's properties ... ==> azure-arm: -> ResourceGroupName : 'pkr-Resource-Group-rivksir0po' ==> azure-arm: -> ComputeName : 'pkrvmrivksir0po' ==> azure-arm: -> Managed OS Disk : '/subscriptions/2a646183-6919-4320-a1f3-c6985fc5d87e/resourceGroups/PKR-RESOURCE-GROUP-RIVKSIR0PO/providers/Microsoft.Compute/disks/pkrosrivksir0po' ==> azure-arm: Querying the machine's additional disks properties ... ==> azure-arm: -> ResourceGroupName : 'pkr-Resource-Group-rivksir0po' ==> azure-arm: -> ComputeName : 'pkrvmrivksir0po' ==> azure-arm: Powering off machine ... ==> azure-arm: -> ResourceGroupName : 'pkr-Resource-Group-rivksir0po' ==> azure-arm: -> ComputeName : 'pkrvmrivksir0po' ==> azure-arm: Capturing image ... ==> azure-arm: -> Compute ResourceGroupName : 'pkr-Resource-Group-rivksir0po' ==> azure-arm: -> Compute Name : 'pkrvmrivksir0po' ==> azure-arm: -> Compute Location : 'Central US' ==> azure-arm: -> Image ResourceGroupName : 'packerbolt' ==> azure-arm: -> Image Name : 'MyCentOSImage' ==> azure-arm: -> Image Location : 'Central US' ==> azure-arm: Deleting resource group ... ==> azure-arm: -> ResourceGroupName : 'pkr-Resource-Group-rivksir0po' ==> azure-arm: ==> azure-arm: The resource group was created by Packer, deleting ... ==> azure-arm: Deleting the temporary OS disk ... ==> azure-arm: -> OS Disk : skipping, managed disk was used... ==> azure-arm: Deleting the temporary Additional disk ... ==> azure-arm: -> Additional Disk : skipping, managed disk was used... ==> azure-arm: Removing the created Deployment object: 'pkrdprivksir0po' ==> azure-arm: ERROR: -> ResourceGroupNotFound : Resource group 'pkr-Resource-Group-rivksir0po' could not be found. ==> azure-arm: Build 'azure-arm' finished. ==> Builds finished. The artifacts of successful builds are: --> azure-arm: Azure.ResourceManagement.VMImage: OSType: Linux ManagedImageResourceGroupName: packerbolt ManagedImageName: MyCentOSImage ManagedImageId: /subscriptions/2a646183-6919-4320-a1f3-c6985fc5d87e/resourceGroups/packerbolt/providers/Microsoft.Compute/images/MyCentOSImage ManagedImageLocation: Central US
План кукольного болта может быть гораздо сложнее, но цель этого поста состояла в том, чтобы продемонстрировать, как легко интегрировать их вместе.
Оригинал: «https://dev.to/puppet/creating-azure-vm-images-with-packer-and-puppet-bolt-a7p»