Рубрики
Uncategorized

Создание Azure VM -изображений с помощью Packer и Puppet Bolt

Microsoft Azure Logo Hashicorp Packer — это бесплатный и с открытым исходным кодом инструмент для создания золотых изображений для … Помечено Puppetbolt, Puppet, DevOps, Lazure.

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