Создание базового образа с Packer

от автора

Packer – это инструмент для создания однородных образов виртуальных машин и контейнеров для использования на различных платформах от HashiCorp. C ним можно легко автоматизировать процесс сборки образов на основе одного исходного конф. файла, используя предопределённые шаблоны.

Рассмотрим создание базового образа с Packer.

Обзор синтаксиса JSON для Packer

Вbuilders определяется, для какой платформы будет создаваться образ, а также конкретные параметры этого процесса. Билдеры отвечают за создание машин и генерацию образов машин для различных платформ. Можно определить один или несколько билдеров в одном шаблоне, чтобы создавать образы для разных платформ параллельно.

Примеры конфигураций:

AWS E2:

{   "builders": [     {       "type": "amazon-ebs",       "access_key": "ВАШ_AWS_ACCESS_KEY",       "secret_key": "ВАШ_AWS_SECRET_KEY",       "region": "us-east-1",       "source_ami_filter": {         "filters": {           "virtualization-type": "hvm",           "name": "*ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*",           "root-device-type": "ebs"         },         "owners": ["099720109477"],         "most_recent": true       },       "instance_type": "t2.micro",       "ssh_username": "ubuntu",       "ami_name": "packer-example-{{timestamp}}"     }   ] }

Microsoft Azure:

{   "builders": [     {       "type": "azure-arm",       "client_id": "ВАШ_AZURE_CLIENT_ID",       "client_secret": "ВАШ_AZURE_CLIENT_SECRET",       "subscription_id": "ВАШ_AZURE_SUBSCRIPTION_ID",       "tenant_id": "ВАШ_AZURE_TENANT_ID",       "resource_group_name": "packer-rg",       "storage_account": "packerstorageaccount",       "image_publisher": "Canonical",       "image_offer": "UbuntuServer",       "image_sku": "18.04-LTS",       "location": "West Europe",       "vm_size": "Standard_DS2_v2",       "managed_image_name": "packer-example-{{timestamp}}"     }   ] }

GCP:

{   "builders": [     {       "type": "googlecompute",       "project_id": "ВАШ_GCP_PROJECT_ID",       "source_image": "projects/ubuntu-os-cloud/global/images/family/ubuntu-2004-lts",       "zone": "us-central1-a",       "instance_type": "e2-medium",       "ssh_username": "ubuntu",       "image_name": "packer-example-{{timestamp}}"     }   ] }

После того как builder успешно создал экземпляр машины, далее идутprovisioners, с помощью provisioners можно запускать shell скрипты, использовать инструменты управления конфигурацией, такие как Ansible, Chef, Puppet, или просто копировать файлы в создаваемый образ.

Пример использования shell provisioner для установки Apache на Ubuntu:

{   "provisioners": [     {       "type": "shell",       "inline": [         "sudo apt-get update",         "sudo apt-get install -y apache2"       ]     }   ] }

post-processors используются для выполнения действий с созданным образом после того, как все provisioners отработали.

Пример конфигурации post-processor, который загружает образ в Amazon S3:

{   "post-processors": [     {       "type": "amazon-s3",       "access_key": "YOUR_ACCESS_KEY",       "secret_key": "YOUR_SECRET_KEY",       "bucket": "your-bucket-name",       "region": "us-east-1",       "path": "path/to/your/image"     }   ] }

Пользовательские переменные

Пользовательские переменные определяют значения, которые можно повторно использовать в различных частях вашего конфигурационного файла Packer.

Переменные объявляются в секции variables JSON-файла:

{   "variables": {     "aws_access_key": "",     "aws_secret_key": ""   } }

Можно задать значения по умолчанию прямо в файле конфигурации, либо оставить их пустыми для последующего заполнения через командную строчку

Чтобы использовать объявленную переменную в конфиге, нужно обернуть её имя в двойные фигурные скобки с префиксом user. Например:

{   "builders": [     {       "type": "amazon-ebs",       "access_key": "{{user `aws_access_key`}}",       "secret_key": "{{user `aws_secret_key`}}"     }   ] }

Можно переопределять значения переменных при запуске Packer, используя опцию -var или -var-file для загрузки значений из файла:

packer build -var 'aws_access_key=ключ' -var 'aws_secret_key=ваш_секрет' template.json

Или с использованием файла переменных variables.json:

{   "aws_access_key": "ваш_ключ",   "aws_secret_key": "ваш_секрет" }

Запуск с -var-file:

packer build -var-file=variables.json template.json

Создание базового образа на примере Ubuntu

Для создания образа Ubuntu 20.04 мы воспользуемся builder’ом amazon-ebs для AWS. Этот builder создаёт EC2 инстанс, устанавливает все необходимые пакеты и настройки, а затем создаёт AMI из этого инстанса.

Создаем файл с именем ubuntu-ami.json (в целом без разницы на имя), который будет содержать конфигурацию для Packer:

{   "variables": {     "aws_access_key": "{{env `AWS_ACCESS_KEY_ID`}}",     "aws_secret_key": "{{env `AWS_SECRET_ACCESS_KEY`}}"   },   "builders": [{     "type": "amazon-ebs",     "access_key": "{{user `aws_access_key`}}",     "secret_key": "{{user `aws_secret_key`}}",     "region": "us-east-1",     "source_ami_filter": {       "filters": {         "virtualization-type": "hvm",         "name": "*ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*",         "root-device-type": "ebs"       },       "owners": ["099720109477"],       "most_recent": true     },     "instance_type": "t2.micro",     "ssh_username": "ubuntu",     "ami_name": "ubuntu-20.04-{{timestamp}}"   }],   "provisioners": [{     "type": "shell",     "inline": [       "sudo apt-get update",       "sudo apt-get upgrade -y",       "sudo apt-get install -y nginx",       "sudo systemctl enable nginx"     ]   }] }

Запуск:

packer build ubuntu-ami.json

Напомню, что больше про инфраструктуру вы можете узнать в рамках практических онлайн-курсов от экспертов отрасли.


ссылка на оригинал статьи https://habr.com/ru/articles/796141/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *