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

Если команда отразила версию, как на скриншоте выше, то cloud-init уже установлен в системе. Если же в ответ была возвращена фраза Command cloud-init not found, необходимо выполнить установку утилиты:
После установки 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:
2) Запускаем утилиту, указав алгоритм хеширования sha-512:
Вводим пароль, который будет назначен пользователю, и нажимаем на клавишу Enter. На выходе утилита сгенерирует хеш нашего пароля:

Копируем хеш, который мы будем использовать далее.
3) Как мы отмечали ранее, пользовательские конфигурационные файлы хранятся в директории /etc/cloud/cloud.cfg.d. Создаем в ней новый файл 99-new-admin-config.cfg:
Используем следующее содержимое:
4) Проверим синтаксис на наличие ошибок:

Если ошибок нет, то команда вернет Valid schema.
5) Перед тем как запустить скрипт, очистим конфигурацию при помощи команды:
6) Запускаем конфигурацию:
7) После того как новая конфигурация была применена, проверим наличие пользователя new-admin:

8) Далее установим пакеты. Создаем новый файл:
Используем следующее содержимое:
8) Проверим синтаксис на наличие ошибок:

9) Очищаем конфигурацию:
10) Запускаем скрипт для установки пакетов при помощи команды:
10) Проверяем наличие установленных пакетов:

Использование 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 в домашнем каталоге текущего пользователя). Далее необходимо получить значение открытого ключа (файл с расширением .pub):
Здесь id_ed25519.pub — это имя файла с открытым ключом. Не забудьте заменить имя на свое.

3) Возвращаемся в панель управления и в блоке cloud-init прописываем следующий синтаксис:
В поле ssh_authorized_keys необходимо прописать значение вашего открытого ключа.

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

Проверка установленных пакетов:

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

Проверка наличия созданного файла:

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