Создание базового образа с 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
Напомню, что больше про инфраструктуру вы можете узнать в рамках практических онлайн-курсов от экспертов отрасли.