Автоматизация создания виртуальных машин в Azure с cloud-init

Что такое cloud-init и почему это важно
cloud-init — это инструмент и набор модулей для автоматической инициализации Linux‑образов при первом запуске. Он читает пользовательские данные (user data), обычно в формате YAML, и выполняет: создание пользователей, развёртывание SSH‑ключей, установку пакетов, запись конфигурационных файлов, запуск команд, настройку сетей и многое другое.
Определение в одну строку: cloud-init — это механизм «произвольной» автоматической настройки ОС при первом запуске виртуальной машины.
Преимущества ключевые:
- Масштабируемость: одинаковая конфигурация на сотнях VM.
- Идемпотентность на этапе инициализации: cloud-init выполняет набор модулей в фиксированном порядке.
- Совместимость: поддерживается большинством облачных провайдеров и основными дистрибутивами Linux.
Важно: cloud-init не заменяет систему управления конфигурацией (Ansible, Salt, Puppet), но отлично подходит для первичной настройки и «брошюровки» ОС.
Основные сценарии использования
- Быстрая подготовка образов для CI/CD и тестов.
- Автоматическое добавление ключей SSH и учетных записей.
- Предварительная установка агентского ПО (monitoring, logging).
- Конфигурация firewall и начальная безопасность.
Пример: полный cloud-init‑скрипт для Ubuntu в Azure
Ниже приведён пример реального cloud‑init YAML, который создаёт пользователя, записывает файлы, устанавливает пакеты и настраивает UFW. Перед использованием замените SSH‑ключ и при необходимости зашифруйте пароль.
# Add system users here
users:
- name: mwiza
groups: users, sudo
shell: /bin/bash
gecos: mwiza
plain_text_passwd: Live-laugh-love12345G123
lock_passwd: false
ssh_authorized_keys:
- ssh-ed25519 BSHSDSDS3NzaC1sdfSDGSDSDJ1KSDB:PWELJWEEWeKBrkXWbLJBs;ldfkagfafk===C6li71Ra6i+NKkajdfi userkey@email.com
# Install, update, and upgrade packages
package_upgrade: true
package_update: true
package_reboot_if_require: true
packages:
- traceroute
- net-tools
- fail2ban
# Set locales
locale: en_UK
timezone: Etc/UTC
keyboard:
layout: nb
write_files:
- path: /etc/salt/minion.d/master_ip_port.conf
content: |
master: salt
master_port: 4506
publish_port: 4505
- path: /home/mwiza/cloud-init.txt
content: |
created by cloud-init in azure
# Running Bash commands to configure software and services
runcmd:
- ufw enable
- ufw allow ssh
- ufw allow 80
- systemctl enable ufw
# Power off the VM after initialization is finalized
shutdown: poweroffПримечание по безопасности: в примере используется plain_text_passwd. Для продакшна используйте зашифрованные пароли (hashed_passwd) или ключи SSH и отключайте парольный вход.
Шаг 1: Подготовка и валидация cloud-init YAML
Рекомендации перед копированием скрипта в Azure:
- Проверяйте YAML на корректность отступов — cloud-init чувствителен к структуре.
- Тестируйте скрипт локально на образе в VirtualBox/VMware/KVM (см. раздел «Локальные тесты»).
- Для больших скриптов разделяйте на include файлы и используйте write_files для конфигураций.
- Логируйте шаги runcmd (например, перенаправление вывода в /var/log/my-init.log) для удобной отладки.
Мини‑методология тестирования:
- Запускаете минимальный cloud-init (создать пользователя + простая команда).
- Проверяете логи в /var/log/cloud-init.log и /var/log/cloud-init-output.log.
- Расширяете скрипт пошагово, повторяя тесты.
Шаг 2: Создание VM в Azure и где вставлять cloud-init
- Авторизуйтесь в Azure Portal (или используйте az cli).
- Нажмите Create a resource → Virtual Machine.
- Выберите образ Ubuntu (или другой поддерживаемый dистрибутив).
- На странице конфигурации укажите имя VM, регион, размер диска и группу ресурсов.
- На вкладке Authentication обычно можно выбрать Password или SSH public key. Если cloud-init создаёт пользователя и ключ, можно временно оставить Password и затем отключить.
- Перейдите на вкладку Advanced → Custom data и вставьте ваш cloud-init YAML.
- Нажмите Review + create и после валидации — Create.
Совет: при использовании Azure Resource Manager (ARM) шаблонов вы можете подставлять cloud-init как параметр customData в секции properties.storageProfile.osProfile.customData.
Шаг 3: Добавление cloud-init через Azure CLI и ARM
Через az cli можно передать файл с cloud-init прямо в команду создания VM:
- Пример с az vm create:
az vm create \
--resource-group myRg \
--name myVm \
--image UbuntuLTS \
--custom-data cloud-init.yaml \
--admin-username azureuser \
--generate-ssh-keys- В ARM шаблоне (фрагмент):
"osProfile": {
"computerName": "myVm",
"adminUsername": "azureuser",
"customData": ""
} Замечание: Azure ожидает customData в base64 в некоторых API‑вызовах. az cli автоматизирует это.
Шаг 4: Вход в систему и проверка результатов
После создания возьмите публичный IP из Overview и подключитесь по SSH:
ssh mwiza@Проверки после входа:
- Файлы: убедитесь, что /home/mwiza/cloud-init.txt и другие write_files появились.
- Пакеты: apt list –installed | grep fail2ban (или соответствующий менеджер пакетов).
- Firewall: sudo ufw status
- Логи cloud-init:
cat /var/log/cloud-init.log
cat /var/log/cloud-init-output.logОтладка и типичные ошибки
- Неправильные отступы YAML → cloud-init игнорирует блоки или падает. Исправление: yaml‑валидатор.
- Ошибки прав доступа при write_files → указывайте owner/group/mode при записи файлов.
- Пакеты не устанавливаются → проверьте network access к репозиторию и прокси.
- SSH‑ключ не принят → проверьте формат ключа и отсутствие лишних пробелов.
Полезные команды для диагностики:
- tail -f /var/log/cloud-init.log
- cloud-init status –long
- journalctl -u cloud-init
Безопасность и hardening рекомендаций
- Никогда не храните реальные пароли в plain_text_passwd в репозиториях. Используйте hashed_passwd или систему секретов (Azure Key Vault, HashiCorp Vault).
- Предпочитайте SSH public key вместо пароля.
- Отключайте парольную аутентификацию в /etc/ssh/sshd_config после развёртывания.
- Минимизируйте список открытых портов и используйте Network Security Groups (NSG) в Azure.
- Логи: отправляйте системные логи в централизованный хостинг для аудита.
Краткий чек‑лист безопасного развертывания:
- SSH ключ добавлен через cloud-init
- Парольный доступ отключён
- UFW/iptables настроен и включён
- Агенты мониторинга установлены
- Репозитории пакетов настроены через внутренний прокси/миракл
Ролевая разбивка: кто что делает
- DevOps инженер: пишет cloud-init, тестирует на локальной VM, формирует ARM/Helm шаблоны.
- Сисадмин: проверяет политики безопасности, NSG и бэкапы.
- Разработчик: использует готовые образы или user data для тестовых сред.
- Безопасность: проверяет ключи, хранилища секретов и аудит логов.
Альтернативы и когда cloud-init не подходит
Когда лучше не использовать cloud-init:
- Если требуется постоянная и сложная конфигурация на протяжении жизненного цикла VM — используйте Ansible/Salt/Puppet/Chef.
- Если инфраструктура immutable и вы создаёте заранее подготовленные образа (golden images), то лучше встраивать конфигурацию в образ.
- Для Windows‑машин cloud-init ограничен; используйте cloudbase‑init или нативные механизмы Windows.
Советы по масштабированию и поддержке
- Помещайте cloud-init скрипты в систему управления версиями (без секретов).
- Делайте конфигурацию модульной: base cloud-init + profile специфичные include.
- Контролируйте версии пакетов в cloud-init, чтобы избежать неожиданных обновлений.
- Автоматизируйте тесты развёртывания в CI: создавайте ephemeral VM, проверяйте критерии и удаляйте.
Примеры расширений: дополнить cloud-init
- Автоматическая регистрация в CMDB: runcmd curl –data …
- Установка агента мониторинга и регистрация в Load Balancer
- Динамическая конфигурация через облачные метаданные
Критерии приёмки
- VM доступна по SSH с ключом, указанных в cloud-init.
- Все файлы из write_files присутствуют и имеют правильные права.
- Заданные пакеты установлены и сервисы запущены.
- firewall отражает правила, заданные в runcmd.
- cloud-init выполнил все этапы без ошибок (cloud-init status –long).
Шаблон playbook / SOP для быстрого развёртывания
- Подготовить cloud-init.yaml (без секретов).
- Создать/обновить ARM/VM‑шаблон с полем customData.
- Прогнать тестовое развёртывание в тестовой группе ресурсов.
- Выполнить проверку приёмки (см. критерии выше).
- Перенести шаблон в production‑RG и запустить с нужным масштабом.
Совместимость и миграция
cloud-init поддерживается основными дистрибутивами (Ubuntu, Debian, RHEL, CentOS, SUSE и др.). Но:
- Синтаксис некоторых модулей может отличаться в версиях cloud-init. При миграции проверьте release notes.
- В Azure при использовании Marketplace‑образов проверьте, что cloud-init включён в образ.
Частые вопросы — быстрые ответы
- Можно ли обновлять cloud-init после первого запуска? Да: cloud-init сохраняет логи и не повторяет одноразовые операции, но вы можете запускать отдельные модули вручную.
- Как получить вывод runcmd? В /var/log/cloud-init-output.log.
Цитата эксперта: “cloud-init — это простой и надёжный способ стандартизировать первичную настройку VM; его сила в простоте и встраиваемости в пайплайны”.
Заключение
cloud-init даёт компактный, переносимый и мощный способ автоматизировать первичную настройку Linux‑виртуальных машин в Azure и других облаках. Для надежного применения:
- Тестируйте скрипты локально;
- Не храните секреты в открытом виде;
- Интегрируйте cloud-init с существующими CI/CD и системами управления конфигурацией;
- Ведите журнал и автоматизированные проверки приёмки.
Итог: начните с простых сценариев (пользователь + SSH + мониторинг), доведите процесс до повторяемого SOP и постепенно расширяйте шаблоны под требования продакшна.
Дополнительные ресурсы и команды‑шпаргалка
Команды для быстрой проверки:
- cloud-init status –long — статус всех стадий cloud-init
- tail -n 200 /var/log/cloud-init.log — последние сообщения cloud-init
- cat /var/log/cloud-init-output.log — вывод команд runcmd
- systemctl status cloud-init — статус сервиса
Мини‑глоссарий (1 строка):
- user data — пользовательские данные, передаваемые VM при создании (обычно YAML для cloud‑init).
- customData — поле в Azure/ARM, куда помещают cloud‑init.
Короткая сводка для публикации в соцсетях:
“Как автоматизировать развёртывание Ubuntu в Azure: вставьте cloud‑init YAML в Custom Data, протестируйте локально и следуйте чек‑листу безопасности — SSH ключи, отключение паролей и логирование.”
Похожие материалы
Извлечь текст из изображения в Google Docs
Screen Distance в iOS 17 — как включить и использовать
Как использовать эмодзи в Windows 11
Как использовать Google Drive для идей
Установка Slack на Linux — Ubuntu, Fedora, Arch