cloud-init представляет собой де-факто отраслевой стандарт для автоматической инициализации виртуальных машин в облачных средах. Этот мощный инструмент конфигурации активируется при первом запуске инстанса и позволяет выполнять предопределенный набор задач без ручного вмешательства.
К его ключевым функциям относятся:
-
Автоматизация базовой настройки системы, включая назначение
hostname. -
Управление учетными записями: создание пользователей, назначение прав и настройка механизмов аутентификации.
-
Программное развертывание SSH-ключей для безопасного доступа.
-
Конфигурация сетевых интерфейсов в соответствии с заданными параметрами.
-
Операции с дисковыми пространствами, такие как монтирование и форматирование томов.
-
Исполнение пользовательских сценариев (скриптов) для пост-установочной настройки, что может включать в себя установку программного обеспечения, развертывание кода приложений и применение тонких настроек.
Хотя в первую очередь cloud-init предназначен для работы в публичных облаках (AWS, Google Cloud, Azure, Timeweb Cloud, Yandex Cloud), его также можно использовать на локальных виртуальных машинах и даже на физических серверах для стандартизации их первоначальной настройки.
В этой статье мы рассмотрим, как установить, настроить и использовать cloud-init на Ubuntu.
cloud
Установка
В большинстве образов Ubuntu cloud-init уже предустановлен.
В Timeweb Cloud все образы Ubuntu уже содержат в себе cloud-init.
Также компания Canonical (разработчик дистрибутива Ubuntu) выпускает образы под названием Ubuntu Cloud Images, специально подготовленные и оптимизированные для запуска в облачных средах.
Дополнительно проверить наличие cloud-init можно при помощи команды:
cloud-init --version

Если команда отразила версию, как на скриншоте выше, то cloud-init уже установлен в системе. Если же в ответ была возвращена фраза Command cloud-init not found, необходимо выполнить установку утилиты:
apt update && apt -y install cloud-init
После установки cloud-Init будет автоматически запускаться при каждой загрузке системы. Также стоит отметить что cloud-init запускается до подключения сервера к сети.
Структура конфигурационных файлов
Все конфигурационные файлы cloud-init находятся в директории /etc/cloud/:
-
/etc/cloud/clean.d/— каталог для скриптов очистки. Эти скрипты выполняются, когда запускается командаcloud-init clean. -
/etc/cloud/cloud.cfg— главный конфигурационный файл. Здесь задаются настройки по умолчанию для всех этапов инициализации. -
/etc/cloud/cloud.cfg.d/— директория для пользовательских конфигурационных файлов с расширением.cfg. Файлы обрабатываются в алфавитном порядке и переопределяют настройки из основного файла. Это предпочтительное место для ваших кастомных настроек. -
/etc/cloud/templates/— каталог содержит шаблоны, которые cloud-init использует для генерации системных файлов. -
/var/lib/cloud/— здесь хранятся кеш, данные и скрипты, сгенерированные во время выполнения cloud-init.
Модули
Модули в cloud-init — это отдельные исполняемые компоненты, которые выполняют конкретные задачи по настройке виртуальной машины при ее первом запуске. Каждый модуль отвечает за свою область: настройку сети, создание пользователей, установку пакетов и т.д.
Важной особенностью модулей является порядок их выполнения: они выполняются не в случайном порядке, а в строго определенной последовательности, которая состоит из этапов:
-
Init Stage (Этап инициализации): Происходит сразу после монтирования корневой файловой системы. Здесь выполняются модули, которые нужны для подготовки системы к основной конфигурации (например, монтирование дополнительных дисков).
-
Config Stage (Этап конфигурации): Основной этап, на котором выполняется большая часть модулей: настройка сети, установка пакетов, настройка SSH-ключей, создание пользователей.
-
Final Stage (Финальный этап): Здесь запускаются модули для выполнения задач, которые должны произойти в самом конце, например, отправка уведомления о готовности системы или запуск пользовательских скриптов.
Локальное использование cloud-init
Для начала протестируем cloud-init локально, то есть выполним его уже после запуска сервера. Мы создадим два сценария:
-
Первый сценарий создаст нового пользователя с именем
new-admin. Пользователю будет задан пароль и выданы права администратора. -
Второй сценарий установит пакеты
atop,tree,net-tools.
1) Так как для создаваемого пользователя мы будем использовать пароль, нам необходимо сгенерировать его хеш — по умолчанию все пароли (и любые другие секреты) указываются в явном виде. Для получения хеша установим пакет whois, который содержит в себе утилиту mkpasswd:
apt -y install whois
2) Запускаем утилиту, указав алгоритм хеширования sha-512:
mkpasswd -m sha-512 --stdin
Вводим пароль, который будет назначен пользователю, и нажимаем на клавишу Enter. На выходе утилита сгенерирует хеш нашего пароля:

Копируем хеш, который мы будем использовать далее.
3) Как мы отмечали ранее, пользовательские конфигурационные файлы хранятся в директории /etc/cloud/cloud.cfg.d. Создаем в ней новый файл 99-new-admin-config.cfg:
nano /etc/cloud/cloud.cfg.d/99-new-admin-config.cfg
Используем следующее содержимое:
#cloud-config
users:
- name: new-admin
passwd: $6$BSAzGG4SFvsn//vD$ds8oM53OIs6qXiCIhMTl10bwQfe9u5WxGKADzwyPsODniGhYAXCUOAoyUkJLs.H9z0PxqLr7BxEJ18hT2VEyR/
sudo: ALL=(ALL) ALL
shell: /bin/bash
groups: sudo
4) Проверим синтаксис на наличие ошибок:
cloud-init schema --config-file /etc/cloud/cloud.cfg.d/99-new-admin-config.cfg

Если ошибок нет, то команда вернет Valid schema.
5) Перед тем как запустить скрипт, очистим конфигурацию при помощи команды:
cloud-init clean
6) Запускаем конфигурацию:
cloud-init single --name users-groups --file /etc/cloud/cloud.cfg.d/99-new-admin-config.cfg
7) После того как новая конфигурация была применена, проверим наличие пользователя new-admin:
id new-admin

8) Далее установим пакеты. Создаем новый файл:
nano /etc/cloud/cloud.cfg.d/99-install-packages.cfg
Используем следующее содержимое:
#cloud-config
package_update: true
package_upgrade: true
packages:
- atop
- tree
- net-tools
8) Проверим синтаксис на наличие ошибок:
cloud-init schema --config-file /etc/cloud/cloud.cfg.d/99-install-packages.cfg

9) Очищаем конфигурацию:
cloud-init clean
10) Запускаем скрипт для установки пакетов при помощи команды:
cloud-init single --name package_update_upgrade_install --file /etc/cloud/cloud.cfg.d/99-install-packages.cfg
10) Проверяем наличие установленных пакетов:
dpkg -l | grep -E "atop|tree|net-tools"

Использование cloud-init в Timeweb Cloud
Облачные серверы Timeweb Cloud на ОС Linux поддерживают работу с cloud-init через панель управления. Настроить сценарии можно как в процессе заказа сервера, так и в дальнейшем при его использовании. Рассмотрим применение cloud-init на практике.
Мы создадим сценарий, который:
-
Создаст нового пользователя с именем
new-usr; -
Настроит аутентификацию по SSH ключам для пользователя
new-usr; -
Установит два пакета —
mc,ncdu; -
Поменяет имя хоста на
timeweb-cloud-server; -
Создаст файл
test-file.txtв директории/tmp.
Если на сервере уже запускались какие-либо скрипты cloud-init, то перед запуском приведенной ниже конфигурации необходимо выполнить команду
cloud-init clean.
Наш сценарий будет выполняться при создании виртуального сервера — его можно добавить на шаге 7:

1) Так как для нового пользователя будет использоваться аутентификация по SSH-ключам, необходимо заранее их сгенерировать. Для этого на другом устройстве (можно использовать домашний компьютер под управлением Windows, macOS, Linux) выполняем команду в терминале для создания ключей:
ssh-keygen

Сохраняем ключи в директорию по умолчанию (скрытая директория .ssh в домашнем каталоге текущего пользователя). Далее необходимо получить значение открытого ключа (файл с расширением .pub):
cat ~/.ssh/id_ed25519.pub
Здесь id_ed25519.pub — это имя файла с открытым ключом. Не забудьте заменить имя на свое.

3) Возвращаемся в панель управления и в блоке cloud-init прописываем следующий синтаксис:
#cloud-config
packages:
- mc
- ncdu
users:
- name: "new-usr"
groups: sudo
shell: /bin/bash
sudo: ['ALL=(ALL) NOPASSWD:ALL']
ssh_authorized_keys:
- ssh-rsa AAAAC3NzaC1lZDI1NTE5AAAAIFoUTI5BKDBDgKLIMpM71m/YI7dTtFKQiSIivRk9pUbs alex@DESKTOP-VTUJHJ9
lock_passwd: true
hostname: timeweb-cloud-server
preserve_hostname: false
runcmd:
- [touch, /tmp/test-file.txt]
В поле ssh_authorized_keys необходимо прописать значение вашего открытого ключа.

4) Для завершения заказа сервера нажимаем на кнопку «Заказать».
5) После того как сервер будет создан, подключаемся по SSH под новым созданным пользователем и проверяем, что все ранее указанные действия были выполнены.
Проверка пользователя:
id new-usr

Проверка установленных пакетов:
dpkg -l | grep -E "mc|ncdu"

Проверка имени хоста:
hostname

Проверка наличия созданного файла:
ls -lah /tmp/test-file.txt

Запустите свой Ubuntu-сервер в облаке
Заключение
cloud-init — это мощнейший инструмент для автоматизации начальной настройки серверов в Ubuntu. Благодаря его возможностям можно разворачивать сконфигурированные серверы за секунды, минимизировать человеческий фактор и легко масштабировать инфраструктуру.
Главная особенность cloud-init заключается в его способности превращать шаблон виртуальной машины в полностью настроенный, готовый к работе экземпляр сервера без какого-либо ручного вмешательства. Автоматизация настройки сети, обновлений безопасности, добавления пользователей и развертывания необходимого ПО — вот те преимущества, которые делают его незаменимым для DevOps-инженеров и системных администраторов.
