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-инженеров и системных администраторов.