Гид по технологиям

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

7 min read DevOps Обновлено 29 Dec 2025
cloud-init в Azure: автоматизация создания VM
cloud-init в Azure: автоматизация создания VM

инженер настраивает скрипты cloud-init на linux‑ПК

Что такое 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) для удобной отладки.

Мини‑методология тестирования:

  1. Запускаете минимальный cloud-init (создать пользователя + простая команда).
  2. Проверяете логи в /var/log/cloud-init.log и /var/log/cloud-init-output.log.
  3. Расширяете скрипт пошагово, повторяя тесты.

Шаг 2: Создание VM в Azure и где вставлять cloud-init

  1. Авторизуйтесь в Azure Portal (или используйте az cli).
  2. Нажмите Create a resource → Virtual Machine.
  3. Выберите образ Ubuntu (или другой поддерживаемый dистрибутив).
  4. На странице конфигурации укажите имя VM, регион, размер диска и группу ресурсов.
  5. На вкладке Authentication обычно можно выбрать Password или SSH public key. Если cloud-init создаёт пользователя и ключ, можно временно оставить Password и затем отключить.
  6. Перейдите на вкладку Advanced → Custom data и вставьте ваш cloud-init YAML.
  7. Нажмите Review + create и после валидации — Create.

страница инициализации vm в azure

Совет: при использовании 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

добавление cloud-init в azure vm

Отладка и типичные ошибки

  1. Неправильные отступы YAML → cloud-init игнорирует блоки или падает. Исправление: yaml‑валидатор.
  2. Ошибки прав доступа при write_files → указывайте owner/group/mode при записи файлов.
  3. Пакеты не устанавливаются → проверьте network access к репозиторию и прокси.
  4. 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
  • Динамическая конфигурация через облачные метаданные

Критерии приёмки

  1. VM доступна по SSH с ключом, указанных в cloud-init.
  2. Все файлы из write_files присутствуют и имеют правильные права.
  3. Заданные пакеты установлены и сервисы запущены.
  4. firewall отражает правила, заданные в runcmd.
  5. cloud-init выполнил все этапы без ошибок (cloud-init status –long).

Шаблон playbook / SOP для быстрого развёртывания

  1. Подготовить cloud-init.yaml (без секретов).
  2. Создать/обновить ARM/VM‑шаблон с полем customData.
  3. Прогнать тестовое развёртывание в тестовой группе ресурсов.
  4. Выполнить проверку приёмки (см. критерии выше).
  5. Перенести шаблон в 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 ключи, отключение паролей и логирование.”

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Извлечь текст из изображения в Google Docs
Инструкции

Извлечь текст из изображения в Google Docs

Screen Distance в iOS 17 — как включить и использовать
iOS Здоровье

Screen Distance в iOS 17 — как включить и использовать

Как использовать эмодзи в Windows 11
How-to

Как использовать эмодзи в Windows 11

Как использовать Google Drive для идей
Продуктивность

Как использовать Google Drive для идей

Установка Slack на Linux — Ubuntu, Fedora, Arch
Инструкции

Установка Slack на Linux — Ubuntu, Fedora, Arch

Что можно аутсорсить онлайн — руководство
Продуктивность

Что можно аутсорсить онлайн — руководство