Представьте, что вы запускаете 100 виртуальных машин (ВМ) в облаке. Если настраивать каждую вручную — устанавливать ПО, создавать пользователей, конфигурировать сети — процесс займёт дни. Cloud-init решает эту проблему, превращая развёртывание инфраструктуры в мгновенный и предсказуемый процесс. Эта статья объяснит, как он работает, зачем нужен и как его использовать на практике.
Cloud-init — это открытая кроссплатформенная система автоматизации, которая настраивает виртуальные машины сразу после первого запуска в облачных средах.
Ключевые характеристики:
Универсальность: Работает одинаково во всех популярных облаках (не зависит от провайдера).
Первоначальная инициализация: Выполняется только при первом старте ВМ, гарантируя идемпотентность (повторный запуск не сломает систему).
Источник данных: Использует два ключевых компонента: метаданные облака — получает информацию об инстансе (IP, зона размещения, SSH-ключи) и user-data — ваши инструкции, переданные при запуске ВМ.
Без cloud-init облачные инфраструктуры невозможно масштабировать. Он — «мозг» автоматизации, заложенный в основу таких инструментов, как Terraform, Ansible и Kubernetes.
Вы запускаете ВМ через консоль облака, CLI или API и передаёте user-data (ваши настройки).
При первом старте:
Cloud-init активируется до загрузки основной ОС.
Скачивает метаданные облака (например, публичный SSH-ключ).
Обрабатывает ваш user-data (скрипты или YAML-конфиг).
Применяет все изменения (создаёт пользователей, устанавливает ПО и т.д.).
Через 30–60 секунд ВМ готова к работе — без вашего участия.
В нашем облаке система cloud-init реализована с использованием источника данных nocloud, что имеет свои особенности и преимущества. В отличие от других облаков, где конфигурация может передаваться через сетевые запросы к метаданным, у нас вся необходимая информация поставляется в виде ISO-образа, подключенного к виртуальной машине как виртуальный CD-ROM. Это решение обеспечивает независимость от сетевой инфраструктуры на этапе первоначальной инициализации и делает процесс более предсказуемым.
В ISO-образе с конфигурацией для nocloud хранится четыре ключевых файла:
| Файл | Назначение | Кто управляет |
|---|---|---|
meta-data |
Содержит идентификатор экземпляра (instance-id), информацию об окружении и свойствах облака |
Мы |
network-config |
Конфигурация сетевых интерфейсов, IP-адреса, маршруты, DNS | Мы |
vendor-data |
Общая конфигурация по умолчанию и рекомендуемые настройки | Мы |
user-data |
Индивидуальные настройки: пользователи, пакеты, скрипты, файлы | Вы (клиент) |
Важная особенность нашей реализации — специальная логика обработки конфигурации. Мы выполняем поверхностное склеивание вашего user-data с нашим vendor-data. Это необходимо потому, что по умолчанию cloud-init отдает приоритет настройкам из user-data, что может привести к игнорированию важных директив от нашей компании.
Как это работает на практике?
Допустим, у нас есть следующий vendor-data (наши настройки):
#cloud-config
write_files:
- path: /opt/myapp/config.yaml
owner: alice:alice
permissions: '0640'
content: |
app:
listen: 8080
env: production
runcmd:
- [ mkdir, -p, /opt/myapp ]
И ваш user-data (ваши настройки):
#cloud-config
write_files:
- path: /etc/machine-id
content: |
{{ .machine_id }}
owner: 'root:root'
permissions: '0644'
runcmd:
- sh -c 'postconf myhostname={{ .fqdn }} ; exit 0'
При обычной обработке cloud-init ваш user-data полностью перезаписал бы наши настройки. Но в нашем облаке применяется особый алгоритм склеивания, результат которого выглядит так:
#cloud-config
write_files:
- path: /etc/machine-id
content: |
{{ .machine_id }}
owner: 'root:root'
permissions: '0644'
- path: /opt/myapp/config.yaml
owner: alice:alice
permissions: '0640'
content: |
app:
listen: 8080
env: production
runcmd:
- sh -c 'postconf myhostname={{ .fqdn }} ; exit 0'
- mkdir -p /opt/myapp
Обратите внимание, как настройки из обоих файлов объединились:
Все разделы write_files из vendor-data и user-data объединились в один список
Команды из runcmd также были объединены
При этом ваши настройки идут первыми, что позволяет переопределять отдельные параметры, если это необходимо
При этом в vendor-data мы сознательно не размещаем директивы для установки пакетов или создания пользователей — эти задачи остаются в вашей зоне ответственности через user-data. Таким образом достигается баланс между обеспечением базовой функциональности и предоставлением вам полной свободы кастомизации.
При работе с cloud-init в нашем облаке необходимо учитывать следующие особенности:
Формат файлов: Все конфигурационные файлы должны использовать кодировку UTF-8 без BOM.
Проверка конфигурации: Перед отправкой на сервер протестируйте ваш user-data локально с помощью утилиты cloud-init devel schema --config-file ваш_файл.yaml.
Диагностика: В случае проблем с применением конфигурации проверьте логи cloud-init по пути /var/log/cloud-init.log и /var/log/cloud-init-output.log.
Совместимость: При переносе конфигураций из других облаков убедитесь, что вы не используете datasource-специфичные директивы (например, phone_home для AWS).
Сетевые настройки: Если ВДС создается из любого образа, представленного нашей компанией, то за настройку сети отвечает гостевой агент. Он использует формат настроек cloud-init. Клиенту ничего делать не нужно. Если же ОС на VDS устанавливается из загруженного клиентом ISO образа и в этом образе/дистрибутиве есть cloud-init, то сеть он настроит сам, согласно тому, как это принято делать в этом дистрибутиве.
Cloud-init в нашей инфраструктуре остается мощным инструментом автоматизации, предоставляя пользователям гибкость в настройке виртуальных машин при сохранении стабильности и безопасности базовой инфраструктуры. Понимание особенностей его работы в нашем облаке поможет вам максимально эффективно использовать возможности автоматизации при развертывании облачных ресурсов.
| Категория задач | Примеры использования |
|---|---|
| Безопасность | Создание пользователей, добавление SSH-ключей |
| Установка ПО | Автообновление ОС, установка Nginx, Docker, Python |
| Конфигурация | Настройка сети, hostname, часового пояса |
| Файловая система | Создание файлов, монтирование дисков, запись логов |
| Интеграция | Запуск скриптов для регистрации ВМ в мониторинге (Zabbix, Prometheus) |
#cloud-config#cloud-config
users:
- name: admin
sudo: "ALL=(ALL) NOPASSWD:ALL"
ssh_authorized_keys:
- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAA... ваш_публичный_ключ
Как это работает:
Создаёт пользователя admin с правами sudo.
Добавляет ваш публичный ключ — вы сможете зайти по SSH без пароля.
Важно! Никогда не используйте пароли в user-data — только SSH-ключи.
#cloud-config
packages:
- nginx
- certbot
write_files:
- path: /var/www/html/index.html
content: |
<h1>Виртуальная машина настроена через cloud-init!</h1>
permissions: '0644'
runcmd:
- [ systemctl, enable, nginx ]
- [ systemctl, start, nginx ]
Этапы:
Устанавливает Nginx и Certbot.
Создаёт стартовую страницу.
Запускает веб-сервер.
Результат: Откройте публичный IP ВМ в браузере — увидите ваш HTML.
#cloud-config
runcmd:
- curl -s https://packagecloud.io/install/repositories/zabbix/stable/script.rpm.sh | bash
- yum install -y zabbix-agent
- sed -i 's/Server=127.0.0.1/Server=monitoring.yourcompany.ru/' /etc/zabbix/zabbix_agentd.conf
- systemctl enable --now zabbix-agent
Как применять:
Замените monitoring.yourcompany.ru на адрес вашего сервера Zabbix.
Все новые ВМ автоматически появятся в мониторинге через 2 минуты после старта.
Вместо этого:
users:
- name: user
passwd: "$6$salt$хеш" # Используйте mkpasswd --method=SHA-512
Вместо curl http://сомнительный_сайт/setup.sh — храните скрипты в приватном S3-бакете с IAM-ролями.
Для сервисных аккаунтов не давайте sudo: ALL, только необходимые команды.
Cloud-init — фундамент облачной автоматизации. Он превращает рутину в 5-секундный процесс и делает возможным:
Мгновенное развёртывание инфраструктуры «под ключ».
Полное соответствие принципам Infrastructure as Code (IaC).
Портабельность решений между облаками (AWS или Yandex Cloud -> NetAngels без переделки).
Полезный совет для начинающих: Начните с простого — автоматизируйте создание пользователей и установку базового ПО. Уже это сэкономит часы ручной работы. Позже интегрируйте cloud-init с Terraform или Ansible для enterprise-сценариев.