Cloud-init: автоматическая настройка VM при первом запуске
Cloud-init: автоматическая настройка VM при первом запуске
Когда вы заказываете VPS у любого облачного провайдера и через минуту получаете готовый сервер с вашим SSH-ключом, правильным hostname и нужными пакетами — за этим стоит cloud-init. Это стандарт де-факто для начальной конфигурации облачных машин, поддерживаемый AWS, GCP, Azure, Hetzner, DigitalOcean и большинством других провайдеров. Разберём, как использовать его самостоятельно при работе с KVM, Proxmox или любым другим гипервизором.
Как работает cloud-init
При первом запуске VM cloud-init проходит несколько стадий:
- Detect — определяет источник данных (metadata service, NoCloud, ConfigDrive)
- Network — настраивает сетевые интерфейсы
- Config — применяет пользовательскую конфигурацию из
user-data - 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 инфраструктуры.
Очень полезная статья, особенно раздел про NoCloud ISO — большинство туториалов рассчитаны на AWS и совсем не объясняют как использовать cloud-init локально с KVM.