Установка cloud-init Основные этапы работы и модули cloud-init Сценарии для cloud-init Локальный запуск cloud-init Пример использования локальных сценариев Примеры сценариев Использование cloud-init в облачных средах Отключение cloud-init
Окружение
Cloud-init — программное обеспечение, разработанное для автоматической настройки виртуальных машин пользователя при первичном запуске. Виртуальные машины с помощью cloud-init автоматически конфигурируются при первой загрузке сетевыми настройками, ключами SSH, пакетами, новыми пользователями и другими системными аспектами.
Cloud-init позволяет системным администраторам экономить время и усилия по сравнению с ручной настройкой каждой виртальной машины.
Предварительно пакет cloud-init должен быть установлен на виртуальной машине.
Для установки cloud-init выполните следующие действия:
1. Авторизуйтесь на виртуальной машине.
2. Установите пакет cloud-init на виртуальной машине, выполнив в терминале следующую команду с правами администратора:
sudo dnf install cloud-init
3. После установки службу cloud-init необходимо добавить в автозагрузку, чтобы она запускалась автоматически при старте системы. Таким образом, cloud-init начинает работать с момента запуска машины (до подключения сети), выполняя первоначальную конфигурацию.
Для запуска и добавления cloud-init и сопутствующих служб в гостевой системе в автозагрузку выполните команду:
sudo systemctl enable cloud-init cloud-config cloud-final --now
4. Для проверки текущего состояния служб используйте следующую команду:
sudo systemctl status cloud-init cloud-config cloud-final
При успешно выполненных настройках в статусе каждой службы должно отображаться active (exited).
При возникновении проблем можно просмотреть логи cloud-init, которые могут помочь в диагностике:
sudo tail -f /var/log/cloud-init.log
sudo tail -f /var/log/cloud-init-output.log
Работу cloud-init можно разделить на несколько ключевых этапов, каждый из которых выполняет определенные задачи для конфигурации системы. Эти этапы можно объединить в три основные фазы, каждая из которых активирует соответствующие службы cloud-init.
1. Обнаружение (Detect) и локализация (Local) — на этих этапах cloud-init определяет платформу виртуальной машины и находит локальные источники данных. Также на этом этапе применяется сетевая конфигурация, включая резервную, и очищаются устаревшие настройки. Активные службы:
cloud-init-local.service,
cloud-init.service.
2. Сетевой этап (Network) и этап конфигурации (Config) — на этих этапах обрабатываются пользовательские данные, выполняются модули disk_setup и mounts, а также запускаются модули конфигурации. Активная служба:
3. Финальный этап (Final) — данный этап завершает процесс загрузки системы, начинается выполнение пользовательских задач, такие как установка пакетов, выполнение плагинов систем управления конфигурациями и запуск пользовательских скриптов. Активные службы:
cloud-final.service,
cloud-init-hotplugd.service.
В cloud-init доступно множество дополнительных модулей, расширяющих возможности конфигурации системы. Дополнительную информацию по модулям можно получить на официальном сайте. Модули можно добавлять или удалять. Они выполняются последовательно на каждом из этапов. Модули разделены на три группы в зависимости от этапа, на котором они запускаются:
cloud_init_modules — модули, выполняемые на этапе инициализации, до подключения к сети;
cloud_config_modules — модули, активируемые после подключения к сети на этапе конфигурации;
При запуске системы cloud-init проверяет конфигурационные файлы, написанные в формате YAML, и выполняет указанные в них инструкции.
Основным конфигурационным файлом cloud-init является /etc/cloud/cloud.cfg.
Этот файл содержит ключевые настройки системы и представляет собой главный сценарий конфигурации, в котором прописываются директивы и их параметры. Каждая директива связана с конкретным модулем cloud-init, который выполняет определённую задачу. Конфигурационный файл можно редактировать, используя текстовый редактор.
Для локального запуска cloud-init и проверки его работы можно использовать несколько команд. Эти команды помогут инициализировать, запустить модули и проверить результат работы cloud-init.
1. Для запуска cloud-init в локальном режиме используйте следующую команду:
sudo cloud-init init --local
Эта команда выполняет только локальные модули и сценарии, которые предназначены для выполнения ДО подключения к сети.
2. Запуск модулей cloud-init. Можно запускать различные модули cloud-init в зависимости от стадии инициализации. Команда запускает конфигурационные модули, которые предназначены для конфигурации системы, используя доступные сетевые ресурсы:
sudo cloud-init modules --mode=config
Для запуска финальных модулей, которые запускаются после полной конфигурации системы, используйте команду:
sudo cloud-init modules --mode=final
3. Для проверки текущего состояния cloud-init и корректного выполнения модулей используйте команду:
cloud-init status
Вывод status: done означает, что cloud-init завершил свою работу без ошибок.
status: done
Подход позволяет автоматизировать задачи по конфигурации системы, задавая параметры на этапе запуска виртуальной машины. Сценарии могут включать установку пакетов, настройку пользователей, управление сервисами и многое другое.
Для настройки имени хоста при загрузке виртуальной машины выполните следующие действия:
1. Создайте новый файл конфигурации my-cloud-config.cfg в каталоге /etc/cloud/cloud.cfg.d/.
Все файлы с расширением *.cfg в этом каталоге будут прочитаны с помощью #cloud-init. Они читаются в лексическом порядке. Более поздние файлы перезаписывают значения в более ранних файлах.
#cloud-init
sudo nano /etc/cloud/cloud.cfg.d/my-cloud-config.cfg
2. Вставьте следующее содержимое сценария в файл:
#cloud-config hostname: my-server fqdn: my-server.ru manage_etc_hosts: true
где:
#cloud-config — указывает на то, что это инструкции для cloud-init передаются в формате YAML;
hostname — задает короткое имя хоста;
fqdn — задает полное имя хоста;
manage_etc_hosts — разрешает cloud-init управлять файлом /etc/host.
3. Сохраните и закройте файл, нажав Ctrl+O, затем Enter, чтобы сохранить, и Ctrl+X, чтобы выйти.
Ctrl+O
Enter
Ctrl+X
4. Проверьте конфигурацию. После создания или редактирования сценария можно проверить конфигурацию, запустив cloud-init в режиме проверки:
sudo cloud-init init --local sudo cloud-init modules --mode=config sudo cloud-init modules --mode=final
5. Примените изменения.
Для применения внесенных в конфигурацию изменений выполните:
sudo systemctl restart cloud-init
Для полной переинициализации cloud-init (Внимание! Это может привести к сбросу некоторых настроек!) выполните команды:
sudo cloud-init clean sudo cloud-init init
6. В некоторых случаях может потребоваться перезагрузка системы:
reboot
7. Проверьте, что изменения были применены.
Например, для проверки имени хоста выполните команду:
hostname
Пример 1. Настройка имени хоста.
Пример 2. Установка пакетов.
#cloud-config packages: - git - tox - htop
Пример 3. Настройка сети.
#cloud-config network: version: 2 ethernets: eth0: dhcp4: true
При запуске новой виртуальной машины или физического сервера, система автоматически настраивает сетевой интерфейс eth0 для использования DHCPv4. Это означает, что интерфейс будет отправлять запросы на роутер или сервер DHCP в сети, чтобы получить IP-адрес и другие параметры сети.
Проверить применение настроек файла конфигурации можно с помощью команды:
ip addr
Пример 4. Запуск скриптов.
#cloud-config runcmd: - echo "Hello, World!" > /home/user/hello.txt - systemctl start firebird.service
echo "Hello, World!" > /home/user/hello.txt — создает (или перезаписывает) файл /home/user/hello.txt с текстом "Hello, World!".
systemctl start firebird.service — запускает службу Firebird, если она установлена на виртуальной машине.
cat /home/user/hello.txt systemctl status firebird.service
Пример 5. Установка и настройка временной зоны.
#cloud-config timezone: US/Eastern
timezone — настройка временной зоны.
Для проверки timezone используйте команду:
timedatectl Local time: Пт 2024-09-20 06:34:40 EDT Universal time: Пт 2024-09-20 10:34:40 UTC RTC time: Пт 2024-09-20 10:34:40 Time zone: US/Eastern (EDT, -0400) System clock synchronized: yes NTP service: active RTC in local TZ: no
Пример 6. Запуск нескольких команд при первой загрузке.
Приведенный сценарий сохраняет содержимое веб-страницы в файл и запускает команду echo с аргументами.
#cloud-config runcmd: - [ wget, "https://ya.ru/", -O, /tmp/index.html ] - [ sh, -xc, "echo $(date) ': hello world!'" ]
runcmd — используется для указания списка команд, которые должны быть выполнены после завершения основной конфигурации cloud-init, но ДО первого входа в систему;
wget — используется для загрузки веб-страницы https://ya.ru/ и сохранения ее содержимого в файл /tmp/index.html;
sh -xc — запускает команду echo с аргументами $(date) ': hello world!'. Аргумент -x указывает, что команда должна быть выведена на экран перед выполнением, а -c указывает, что следующая строка — команда, которую нужно выполнить.
Проверьте содержимое файла /tmp/index.html. Если команда wget была выполнена успешно, то в этом файле должно быть сохранено содержимое веб-страницы. Можно просмотреть содержимое файла в терминале:
cat /tmp/index.html
Применение в облачных средах:
1. Развертывание масштабируемых приложений.
В облачных средах для быстрого развертывания большого количества виртуальных машин сloud-init позволяет сократить время на настройку и конфигурацию серверов.
2. Упрощение управления инфраструктурой.
Вместо ручной конфигурации каждой виртуальной машины, администраторы могут создавать шаблоны конфигураций с помощью cloud-init. Шаблоны могут автоматически применяться к новым экземплярам виртуальных машин при их создании.
3. Обеспечение единообразия окружения.
Используя cloud-init, можно гарантировать, что каждая виртуальная машина будет иметь одинаковую базовую конфигурацию, что снижает вероятность ошибок, связанных с ручной настройкой.
1. Создание конфигурационного файла. Сохраните файл конфигурации, например, /etc/cloud/cloud.cfg.d/my-cloud-config.cfg в формате YAML.
2. Использование cloud-init с образом ВМ. Убедитесь, что ваш облачный провайдер поддерживает cloud-init. При создании нового экземпляра виртуальной машины в облаке загрузите созданный YAML-файл в качестве пользовательских данных.
3. Запуск виртуальной машины. Запустите экземпляр ВМ. Cloud-init автоматически выполнит конфигурацию при первом запуске.
В каждом облаке существует сервис, передающий виртуальной машине информацию о её окружении. Эта информация поступает в несколько типов данных, которые cloud-init использует в определённой последовательности.
1. Пользовательские данные (user-data). Это настройки и директивы, указанные в конфигурационном файле /etc/cloud/cloud.cfg. В них могут быть прописаны файлы для выполнения, пакеты для установки, скрипты оболочки и другие инструкции. Пользовательские данные, как правило, служат для настройки конкретного экземпляра виртуальной машины. Данные используются для автоматизации различных сценариев, таких как установка необходимого ПО, настройка сервера или управление конфигурациями. Cloud-init считывает пользовательские данные и, если они заданы в поддерживаемом формате, выполняет действия, описанные в этих данных.
2. Метаданные (meta-data). Информация об окружении виртуальной машины, такая как имя сервера, внутренний и публичный IP-адрес, идентификатор экземпляра, публичный SSH-ключ и тип виртуальной машины. Метаданные используются для настройки после применения пользовательских данных.
3. Данные поставщиков (vendor-data). Информация, предоставляемая облачными провайдерами или разработчиками, которая помогает настроить образ виртуальной машины для корректной работы в облаке. Эти данные обычно задают конфигурации по умолчанию и применяются после метаданных.
В некоторых случаях, когда автоматическая настройка ВМ с использованием cloud-init не требуется, служба может быть отключена.
Для отключения cloud-init доступно несколько способов.
Способ 1. Файл отключения службы. Для отключения cloud-init необходимо создать пустой файл /etc/cloud/cloud-init.disabled:
sudo touch /etc/cloud/cloud-init.disabled
Во время загрузки система инициализации операционной системы проверит существование этого файла. Если он существует, cloud-init не будет запущен.
Способ 2. Отключение через конфигурацию загрузчика. Для отключения cloud-init необходимо добавить параметр cloud-init=disabled в конфигурацию загрузчика и применить настройки для загрузчика:
для систем с BIOS:
sudo bash -c 'echo "GRUB_CMDLINE_LINUX=\"cloud-init=disabled\"" >> /etc/default/grub' sudo grub2-mkconfig -o /boot/grub2/grub.cfg
для систем с UEFI:
sudo bash -c 'echo "GRUB_CMDLINE_LINUX=\"cloud-init=disabled\"" >> /etc/default/grub' sudo grub2-mkconfig -o /boot/efi/EFI/redos/grub.cfg
Способ 3. Указание переменной окружения. Для отключения cloud-init также можно передать переменную окружения KERNEL_CMDLINE=cloud-init=disabled для каждого из процессов cloud-init:
sudo bash -c 'echo "DefaultEnvironment=KERNEL_CMDLINE=cloud-init=disabled" >> /etc/systemd/system.conf'
Дата последнего изменения: 14.01.2025
Если вы нашли ошибку, пожалуйста, выделите текст и нажмите Ctrl+Enter.
Нажимая «Отправить запрос», вы соглашаетесь с условиями обработки персональных данных.
Вы будете получать только актуальную информацию по обновлению безопасности
Подписываясь на уведомления, вы соглашаетесь с условиями обработки персональных данных.
На ваш почтовый адрес отправлено письмо с подтверждением подписки.