Логотип 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»