Серверное оборудование для бизнеса — надёжные решения для любых задач Подробнее →
Статья

Cloud-init: автоматическая настройка VM при первом запуске

Cloud-init: автоматическая настройка VM при первом запуске

Когда вы заказываете VPS у любого облачного провайдера и через минуту получаете готовый сервер с вашим SSH-ключом, правильным hostname и нужными пакетами — за этим стоит cloud-init. Это стандарт де-факто для начальной конфигурации облачных машин, поддерживаемый AWS, GCP, Azure, Hetzner, DigitalOcean и большинством других провайдеров. Разберём, как использовать его самостоятельно при работе с KVM, Proxmox или любым другим гипервизором.

Как работает cloud-init

При первом запуске VM cloud-init проходит несколько стадий:

  1. Detect — определяет источник данных (metadata service, NoCloud, ConfigDrive)
  2. Network — настраивает сетевые интерфейсы
  3. Config — применяет пользовательскую конфигурацию из user-data
  4. Final — запускает финальные скрипты и команды

Источники данных — это то, откуда cloud-init берёт конфиг. В облаках используется HTTP metadata service (169.254.169.254). При локальной работе с KVM используется NoCloud — ISO-образ или специальная директория.

Формат user-data

Основной конфиг — файл user-data в формате YAML, начинающийся с #cloud-config:

#cloud-config

# Имя хоста
hostname: web-server-01
fqdn: web-server-01.example.com

# Создание пользователя
users:
  - name: deploy
    groups: sudo
    shell: /bin/bash
    sudo: ALL=(ALL) NOPASSWD:ALL
    ssh_authorized_keys:
      - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... your_key_here

# Установка пакетов
packages:
  - nginx
  - git
  - curl
  - htop
package_update: true
package_upgrade: true

# Запись файлов
write_files:
  - path: /etc/nginx/sites-available/default
    content: |
      server {
          listen 80 default_server;
          root /var/www/html;
          index index.html;
      }
    owner: root:root
    permissions: '0644'

# Команды после установки пакетов
runcmd:
  - systemctl enable nginx
  - systemctl start nginx
  - echo "Cloud-init complete" > /var/log/cloud-init-done.txt

# Сообщение после завершения
final_message: "Система готова к работе за $UPTIME секунд"

Создание NoCloud ISO для KVM

Для использования с KVM создаём ISO-образ с конфигом:

# Создаём директорию
mkdir -p cloud-init-config
cd cloud-init-config

# Создаём user-data и meta-data
cat > user-data << 'EOF'
#cloud-config
hostname: my-vm
users:
  - name: admin
    sudo: ALL=(ALL) NOPASSWD:ALL
    ssh_authorized_keys:
      - ssh-ed25519 AAAAC3Nza... your_key
packages:
  - qemu-guest-agent
runcmd:
  - systemctl enable qemu-guest-agent
EOF

cat > meta-data << 'EOF'
instance-id: my-vm-001
local-hostname: my-vm
EOF

# Создаём ISO
sudo apt install -y genisoimage
genisoimage -output cloud-init.iso 
  -volid cidata 
  -joliet 
  -rock 
  user-data meta-data

# Запускаем VM с cloud-init ISO
virt-install 
  --name my-vm 
  --ram 2048 
  --vcpus 2 
  --disk path=/var/lib/libvirt/images/my-vm.qcow2 
  --disk path=./cloud-init.iso,device=cdrom 
  --import 
  --network network=default 
  --noautoconsole

Использование с Proxmox

В Proxmox cloud-init интегрирован в веб-интерфейс. Для работы через CLI:

# Создаём VM из cloud-образа
qm create 100 --name web-01 --memory 2048 --net0 virtio,bridge=vmbr0

# Импортируем диск
qm importdisk 100 ubuntu-22.04-cloudimg-amd64.img local-lvm

# Настраиваем
qm set 100 --scsihw virtio-scsi-pci --scsi0 local-lvm:vm-100-disk-0
qm set 100 --ide2 local-lvm:cloudinit
qm set 100 --boot c --bootdisk scsi0
qm set 100 --serial0 socket --vga serial0

# Задаём cloud-init параметры
qm set 100 --ciuser admin
qm set 100 --sshkeys ~/.ssh/id_ed25519.pub
qm set 100 --ipconfig0 ip=192.168.1.100/24,gw=192.168.1.1

# Запускаем
qm start 100

Отладка

Если что-то пошло не так, логи cloud-init находятся здесь:

# Основной лог
cat /var/log/cloud-init.log

# Вывод команд runcmd
cat /var/log/cloud-init-output.log

# Статус всех стадий
cloud-init status --long

# Принудительный перезапуск (для тестирования)
sudo cloud-init clean --logs
sudo cloud-init init

Итог

Cloud-init — необходимый инструмент для всех, кто работает с виртуальными машинами в сколько-нибудь серьёзном масштабе. Правильно написанный user-data позволяет получать полностью настроенный сервер без единого ручного действия, что критично как для облачных окружений, так и для on-premise инфраструктуры.

3 Ответа

  1. Очень полезная статья, особенно раздел про NoCloud ISO — большинство туториалов рассчитаны на AWS и совсем не объясняют как использовать cloud-init локально с KVM.

  1. В Proxmox cloud-init шаблоны вообще меняют подход к работе с VM — создаёшь один базовый шаблон раз в квартал после обновления образа и клонируешь из него всё что нужно за секунды.

  1. Советую держать user-data в git-репозитории вместе с остальной инфраструктурой — так всегда видно кто и когда менял конфигурацию начального запуска машин.