Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.
Кратко о задаче
В большинстве образов Ubuntu cloud-init уже предустановлен.
В Simple-Server все образы Ubuntu уже содержат в себе cloud-init.
Также компания Canonical (разработчик дистрибутива Ubuntu) выпускает образы под названием Ubuntu Cloud Images, специально подготовленные и оптимизированные для запуска в облачных средах.
Дополнительно проверить наличие cloud-init можно при помощи команды:
Если команда отразила версию, как на скриншоте выше, то 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.
/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 (Финальный этап): Здесь запускаются модули для выполнения задач, которые должны произойти в самом конце, например, отправка уведомления о готовности системы или запуск пользовательских скриптов.
Init Stage (Этап инициализации): Происходит сразу после монтирования корневой файловой системы. Здесь выполняются модули, которые нужны для подготовки системы к основной конфигурации (например, монтирование дополнительных дисков).
Config Stage (Этап конфигурации): Основной этап, на котором выполняется большая часть модулей: настройка сети, установка пакетов, настройка SSH-ключей, создание пользователей.
Final Stage (Финальный этап): Здесь запускаются модули для выполнения задач, которые должны произойти в самом конце, например, отправка уведомления о готовности системы или запуск пользовательских скриптов.
Локальное использование cloud-init
Для начала протестируем cloud-init локально, то есть выполним его уже после запуска сервера. Мы создадим два сценария:
-
Первый сценарий создаст нового пользователя с именем
new-admin. Пользователю будет задан пароль и выданы права администратора. -
Второй сценарий установит пакеты
atop,tree,net-tools.
Первый сценарий создаст нового пользователя с именем new-admin. Пользователю будет задан пароль и выданы права администратора.
Второй сценарий установит пакеты atop, tree, net-tools.
-
Так как для создаваемого пользователя мы будем использовать пароль, нам необходимо сгенерировать его хеш — по умолчанию все пароли (и любые другие секреты) указываются в явном виде. Для получения хеша установим пакет
whois, который содержит в себе утилитуmkpasswd: -
Запускаем утилиту, указав алгоритм хеширования
sha-512:
mkpasswd -m sha-512 --stdinВводим пароль, который будет назначен пользователю, и нажимаем на клавишу Enter. На выходе утилита сгенерирует хеш нашего пароля:
Копируем хеш, который мы будем использовать далее.
- Как мы отмечали ранее, пользовательские конфигурационные файлы хранятся в директории
/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- Проверим синтаксис на наличие ошибок:
cloud-init schema --config-file /etc/cloud/cloud.cfg.d/99-new-admin-config.cfgЕсли ошибок нет, то команда вернет Valid schema.
-
Перед тем как запустить скрипт, очистим конфигурацию при помощи команды:
-
Запускаем конфигурацию:
cloud-init single --name users-groups --file /etc/cloud/cloud.cfg.d/99-new-admin-config.cfg-
После того как новая конфигурация была применена, проверим наличие пользователя
new-admin: -
Далее установим пакеты. Создаем новый файл:
nano /etc/cloud/cloud.cfg.d/99-install-packages.cfgИспользуем следующее содержимое:
#cloud-config
package_update: true
package_upgrade: true
packages:
- atop
- tree
- net-tools- Проверим синтаксис на наличие ошибок:
cloud-init schema --config-file /etc/cloud/cloud.cfg.d/99-install-packages.cfg- Запускаем скрипт для установки пакетов при помощи команды:
cloud-init single --name package_update_upgrade_install --file /etc/cloud/cloud.cfg.d/99-install-packages.cfg- Проверяем наличие установленных пакетов:
dpkg -l | grep -E "atop|tree|net-tools"Использование cloud-init в Simple-Server
Облачные серверы Simple-Server на ОС Linux поддерживают работу с cloud-init через панель управления. Настроить сценарии можно как в процессе заказа сервера, так и в дальнейшем при его использовании. Рассмотрим применение cloud-init на практике.
Мы создадим сценарий, который:
-
Создаст нового пользователя с именем
new-usr; -
Настроит аутентификацию по SSH ключам для пользователя
new-usr; -
Установит два пакета —
mc,ncdu; -
Поменяет имя хоста на
Simple-Server-cloud-server; -
Создаст файл
test-file.txtв директории/tmp.
Создаст нового пользователя с именем new-usr;
Настроит аутентификацию по SSH ключам для пользователя new-usr;
Установит два пакета — mc, ncdu;
Поменяет имя хоста на Simple-Server-cloud-server;
Создаст файл test-file.txt в директории /tmp.
Если на сервере уже запускались какие-либо скрипты cloud-init, то перед запуском приведенной ниже конфигурации необходимо выполнить команду cloud-init clean.
Наш сценарий будет выполняться при создании виртуального сервера — его можно добавить на шаге 7:
- Так как для нового пользователя будет использоваться аутентификация по SSH-ключам, необходимо заранее их сгенерировать. Для этого на другом устройстве (можно использовать домашний компьютер под управлением Windows, macOS, Linux) выполняем команду в терминале для создания ключей:
Сохраняем ключи в директорию по умолчанию (скрытая директория .ssh в домашнем каталоге текущего пользователя). Далее необходимо получить значение открытого ключа (файл с расширением .pub):
cat ~/.ssh/id_ed25519.pubЗдесь id_ed25519.pub — это имя файла с открытым ключом. Не забудьте заменить имя на свое.
- Возвращаемся в панель управления и в блоке 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: Simple-Server-cloud-server
preserve_hostname: false
runcmd:
- [touch, /tmp/test-file.txt]В поле ssh_authorized_keys необходимо прописать значение вашего открытого ключа.
-
Для завершения заказа сервера нажимаем на кнопку «Заказать».
-
После того как сервер будет создан, подключаемся по SSH под новым созданным пользователем и проверяем, что все ранее указанные действия были выполнены.
Проверка установленных пакетов:
dpkg -l | grep -E "mc|ncdu"Проверка наличия созданного файла:
ls -lah /tmp/test-file.txtНужен сервер для практики? Закажите VPS на Simple-Server — root-доступ, NVMe, DDoS-защита и поддержка 24/7.