Всем привет! Это первая моя статья на Хабре, поэтому судите по всей строгости! Я рыскал по просторам интернетов и не нашел простой информации по созданию своими руками образа cloud-init, поэтому своими глазами изучал официальные маны и методом проб и ошибок теперь имею представление о том, как всё же запустить этот интересный инструмент!
Что такое cloud-init и с чем его едят?
cloud-init - это стандартный многоплатформенный пакет, который используется для инициализации облачных виртуальных машин при первом их запуске. Он позволяет автоматически настраивать ВМ, применяя конфигурацию, переданную ей через метаданные.
Основные задачи, которые решает cloud-init:
Настройка сети: Установка статических IP-адресов, DHCP, DNS, маршрутизации.
Установка hostname: Задание имени хоста для ВМ.
Настройка ключей SSH: Добавление открытых ключей SSH для безопасного удаленного доступа.
Установка пакетов: Установка необходимых программ и утилит.
Запуск скриптов: Выполнение произвольных пользовательских скриптов для настройки приложений и сервисов.
Создание пользователей: Добавление новых пользователей и групп.
Настройка часового пояса: Установка правильного часового пояса.
И многое другое: cloud-init обладает большим набором функций, позволяющих гибко настраивать ВМ.
Как cloud-init работает?
-
Метаданные: При запуске ВМ, cloud-init получает метаданные (конфигурационную информацию) из источника. Обычно это:
Meta-data service (API): В облачных средах (AWS, Azure, GCP) метаданные предоставляются через специальный HTTP API.
ISO образ: Для локальных ВМ, метаданные часто передаются через файл конфигурации, расположенный на виртуальном CD-ROM (ISO-образе).
Обработка метаданных: cloud-init анализирует полученные метаданные и выполняет соответствующие действия по настройке ВМ.
Логирование: cloud-init логирует все действия, что помогает при отладке.
Делаем шаблон виртуальной машины
Перед созданием образа, нам сначала необходимо сделать "шаблон" ВМ, с которого мы будем клепать и преднастраивать другие ВМ.
Первым делом — ставим пакет cloud-init, если таковой отсутствует.
После успешной установки пакета, необходимо добавить все службы в автозапуск:
systemctl enable cloud-init.service
systemctl enable cloud-init-local
systemctl enable cloud-config.service
systemctl enable cloud-final.service
Так же необходимо создать свой конфиг по пути /etc/cloud/cloud.cfg.d/, где добавим следующее содержимое:
datasource_list: [NoCloud]
disable_cloud_init_modules: []
Данный конфиг файл необходим, ибо по моему личному опыту было замечено, что зачастую при отработке cloud-init, он жалуется на datasource_list, а иногда обращается к нашему шлюзу в поисках meta-data.
После проделанных махинаций, мы выключаем нашу шаблон ВМ (а если были неудачные попытки, обязательно прописываем cloud-init clean) и переходим к следующему веселому занятию.
user-data и meta-data
Для того, чтобы cloud-init мог взаимодействовать с нашим iso образом, который будет подгружен через cd‑rom в виртуальную машину, необходимо чтобы присутствовали два файла — user‑data и meta‑data.
user‑data и meta‑data — это два типа данных, которые cloud‑init использует для настройки виртуальных машин при их первом запуске. Они служат для передачи различной конфигурационной информации, позволяя автоматизировать процесс развертывания и настройки.
user-data
• Определение: user-data — это конфигурационные данные, предоставляемые пользователем, которые определяют, как cloud-init должна настроить ВМ. Это, по сути, инструкции, которые вы даете cloud-init, чтобы ВМ была настроена нужным вам образом.
• Содержание: user-data может содержать:
Команды shell script: Вы можете задать последовательность команд, которые будут выполнены при первом запуске ВМ.
Cloud-config директивы: Вы можете использовать специальный формат YAML (cloud-config), который позволяет настраивать более широкий спектр параметров ВМ (установка пакетов, создание пользователей, настройка сети и т.д.).
Любые другие данные: Вы можете передавать любые текстовые данные, которые будут доступны внутри ВМ. • Формат: Наиболее распространенным форматом является YAML, но поддерживаются и другие форматы, например, текст или shell script. • Примеры использования user-data:
Установка конкретных пакетов.
Создание пользователей и групп.
Настройка сети (IP-адреса, DNS).
Запуск пользовательских скриптов.
Установка SSH ключей.
Задание имени хоста.
Конфигурация часового пояса.
meta-data
• Определение: meta-data — это информация о самой виртуальной машине, предоставляемая платформой (облачным провайдером или гипервизором). Это не данные, которые вы задаете напрямую, а скорее информация о среде, в которой запущена ВМ.
• Содержание: meta-data включает:
ID инстанса: Уникальный идентификатор ВМ.
Имя хоста: Имя, заданное платформой для ВМ.
IP-адреса: Локальные и публичные IP-адреса ВМ.
Тип инстанса: Размер ВМ, количество vCPU, объем RAM.
Регион и зона доступности: Местоположение ВМ.
Имена дисков: Список присоединенных дисков.
Другая специфическая информация платформы: Информация о сети, безопасности, etc. • Формат: meta-data обычно передается в формате JSON или аналогичном структурированном формате. • Примеры использования meta-data:
cloud-init использует meta-data для получения IP-адреса ВМ, чтобы правильно настроить сеть.
meta-data помогает cloud-init определить регион и зону, чтобы выбрать правильные настройки.
meta-data предоставляет информацию об имени хоста, которое можно использовать при настройке.
Написание конфигурации и создание iso образа
Сейчас будет просто пример конфигурации meta-data и user-data. Вот ссылка на официальный мануал, где описан синтаксис.
Содержимое файла meta-data
instance-id: iid-local01
local-hostname: my-server
instance-id - указывает id нашего образа (если по простому и без заморочек). Если вдруг вам лень каждый раз писать cloud-init clean - тогда просто меняйте iid.
local-hostname - hostname ВМ, который установиться после загрузки и отработки нашего образа (вместо localhost поставится my-server).
Содержимое файла user-data
#cloud-config
runcmd:
- echo "Hello, world!" > /var/tmp/hello.txt
- apt-get update
- apt-get install -y nginx
#cloud-config - обозначает, что данный файл относится к cloud-init.
runcmd - запускает консольные команды (что заметно по скрипту).
Вы можете даже на текущем этапе без просмотра мануала изменить содержимое user и meta data файлов под себя.
Если вы вдруг потеряли ссылку на мануал - она здесь.
Генерация образа
Для генерации образа мы вводим следующую команду. ВАЖНО ВЫПОЛНЯТЬ ЕЁ В КАТАЛОГЕ С user-data и meta-data.
genisoimage -output cidata.iso -volid cidata -joliet -rock -graft-points user-data=./user-data meta-data=./meta-data
Тут в -output указываем путь, где появится наш образ (либо оставляем так и он пояявится в каталоге, в котором вы находитесь).
Всё, поздравляю, теперь вы без проблем можете подгрузить ваш iso через cd-rom к готовому шаблону vm и проверить, работает или нет.
ВАЖНО - user-data СРАБОТАЕТ ЧЕРЕЗ ВРЕМЯ ПОСЛЕ ИНИЦИАЛИЗАЦИИ ВАШЕЙ ВМ, НЕ НАДО СРАЗУ ЕЁ РЕСТАРТИТЬ И СУДОРОЖНО ПИСАТЬ cloud-init clean, cloud-init init.
Всем спасибо за чтение статьи, надеюсь вам получится достичь вашего желаемого результата! Пишите в комментарии свои вопросы, я по мере времени буду дополнять статью.
13werwolf13
авоткстати... почти всегда cloud образа дистрибутивов имеют из коробки guest agent, и почти всегда для полноценного использования агента в вм пробрасывают сокет с хоста, почему бы не использовать этот сокет для cloud-init? это лучше чем надеяться на сеть которой из коробки в целом быть не обязано, и лучше чем iso образ который надо сгенерировать и который будучи использованным единожды навсегда останется висеть в вм блочным устройством которое в целом уже и не нужно..
кроме того через guest agent можно выполнять любые команды и передавать файлы на вм с хоста, что в целом позволяет заменить cloud-init целиком (но конечно команды будут отличаться в зависимости от дистрибутива а конфиг cloud-init нет).
..просто мысли в 3 часа ночи..
Leonc1o Автор
На моем рабочем месте необходимо использовать ISO, который мы внедряем и генерим при помощи самописного bash скрипта.
guest agent тема довольно интересная, которую стоит проверить, но это уже будет больше для личного интереса)