
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/
Добавить комментарий