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

c6422a28b524515d2351ff07e728a001.png

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

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

© Habrahabr.ru