Определение простыми словами
Cloud-init — это пакет, который запускается один раз при первой загрузке виртуальной машины и автоматически настраивает её по инструкциям из метаданных. Инструкции передаёт облачная платформа через специальный HTTP-эндпоинт (обычно 169.254.169.254) или через подключённый ISO-образ с файлом user-data.
Без cloud-init каждый новый сервер пришлось бы настраивать вручную: вводить пароли, копировать ключи, прописывать hostname. С cloud-init вся эта работа выполняется автоматически ещё до того, как администратор впервые подключился по SSH. Поддерживается на Ubuntu, Debian, CentOS, AlmaLinux, Rocky Linux и большинстве других дистрибутивов.
Сравнение
| Инструмент | Когда запускается | Типичное применение |
|---|---|---|
| cloud-init | Первая загрузка ВМ | Базовая настройка ОС: ключи, пользователи, сеть |
| Ansible / Chef | В любой момент по расписанию или вручную | Управление конфигурацией на работающем парке серверов |
| Vagrant | При поднятии виртуальной машины | Локальная разработка, провизионирование dev-окружений |
Кейсы использования
- Автоматическая установка SSH-ключа для нового VPS без ввода пароля.
- Создание системного пользователя с sudo-правами и заблокированным root при деплое по шаблону.
- Настройка статического IP-адреса и DNS при старте ВМ в изолированной сети без DHCP.
- Запуск скрипта установки Docker и базовых пакетов сразу после первой загрузки.
- Генерация уникального hostname на основе UUID инстанса для кластерного деплоя.
Негативный пример: использовать cloud-init для регулярного обновления конфигурации на работающих серверах — инструмент запускается только при первой загрузке (если не сброшен вручную), поэтому повторные запуски не дадут нужного эффекта без специальных флагов или полного пересоздания машины.
Технические детали
Cloud-init проходит несколько фаз: detect → local → network → config → final. Логи хранятся в /var/log/cloud-init.log и /var/log/cloud-init-output.log.
Пример минимального user-data в формате cloud-config:
#cloud-config
hostname: web-01
users:
- name: deploy
groups: sudo
shell: /bin/bash
sudo: ALL=(ALL) NOPASSWD:ALL
ssh_authorized_keys:
- ssh-ed25519 AAAA... user@local
packages:
- nginx
- curl
runcmd:
- systemctl enable nginx
- systemctl start nginx
Проверить статус выполнения и пересоздать состояние:
cloud-init status --long
cloud-init collect-logs
sudo cloud-init clean --logs
sudo cloud-init init
Для тестирования без реального облака используют Multipass или образы QCOW2 с параметром --cloud-init user-data.yaml. Источники метаданных (datasource) задаются в /etc/cloud/cloud.cfg.d/.
🔥 Где это применяется
Частые вопросы
Можно ли запустить cloud-init повторно на уже работающем сервере?
Да, но только после сброса состояния командой sudo cloud-init clean --logs. После этого при следующей загрузке все модули выполнятся заново. На production-сервере делать это опасно — возможна перезапись ключей и пользователей.
Где хранится user-data после первой загрузки?
Cloud-init сохраняет полученные данные в /var/lib/cloud/instance/. Там же находятся результаты выполнения каждого модуля и кэш метаданных.
Поддерживает ли cloud-init Windows?
Нет. Для Windows существует аналог — cloudbase-init, который реализует схожую логику, но работает со службами Windows и форматами PowerShell-скриптов.