Cloud-init — автонастройка VPS при первой загрузке | Глоссарий FREEHOSTING

Cloud-init

Cloud Init
Cloud-init — Cloud-init — стандартный инструмент первоначальной настройки облачных виртуальных машин. Выполняется при первой загрузке: задаёт hostname, SSH-ключи, пользователей, сеть и запускает пользовательские скрипты.

Определение простыми словами

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 проходит несколько фаз: detectlocalnetworkconfigfinal. Логи хранятся в /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-скриптов.