Собирали ли вы образы виртуальных машин (VM images)?

«Собирали ли вы образы виртуальных машин (VM images)?» — вопрос из категории Виртуализация, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, я активно использовал HashiCorp Packer для создания immutable-образов виртуальных машин. Это позволяло нам иметь предварительно настроенные, проверенные и согласованные образы для быстрого развертывания инфраструктуры через Terraform.

Например, я создавал образ AWS AMI с предустановленным Docker, системными пакетами для мониторинга (Prometheus node_exporter) и настройками безопасности (SSH, firewall).

Пример шаблона Packer для Ubuntu 22.04 в AWS:

# packer.pkr.hcl
source "amazon-ebs" "base-ubuntu" {
  ami_name        = "company-base-ubuntu-22.04-{{timestamp}}"
  instance_type   = "t3.small"
  region          = "eu-west-1"
  source_ami_filter {
    filters = {
      name                = "ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*"
      root-device-type    = "ebs"
      virtualization-type = "hvm"
    }
    owners      = ["099720109477"] # Canonical
    most_recent = true
  }
  ssh_username = "ubuntu"
  tags = {
    Environment = "BaseImage"
    ManagedBy   = "Packer"
  }
}

build {
  sources = ["source.amazon-ebs.base-ubuntu"]

  # Провиженинг: установка базовых пакетов
  provisioner "shell" {
    inline = [
      "sudo apt-get update",
      "sudo apt-get install -y docker.io awscli jq",
      "sudo systemctl enable docker"
    ]
  }

  # Загрузка конфигураций для мониторинга
  provisioner "file" {
    source      = "files/node_exporter.service"
    destination = "/tmp/"
  }
  provisioner "shell" {
    script = "scripts/setup-monitoring.sh"
  }
}

После сборки такой образ использовался в Terraform как source_ami для Auto Scaling Groups, что гарантировало идентичность всех инстансов и ускоряло их запуск.