Подготовка образа диска ВМ для загрузки в Платформу
Подготовка образа диска ВМ для его загрузки в Платформу может выполняться разными способами. Далее описаны следующие варианты подготовки образа:
- Утилита OpenStack Builder в составе Packer (см. раздел OpenStack Builder).
- Ручная локальная подготовка образа через существующую ВМ в Платформе (см. раздел Ручная локальная подготовка образа).
- Утилита diskimage-builder (см. раздел Утилита diskimage-builder).
-
Настроенный доступ с машины, на которой запускается Packer-клиент, до точек:
-
http/https до OpenStack API.
-
SSH до сети инстансов.
-
-
Загруженный образ целевой ОС.
Также для запуска используется ряд скриптов, пример для выполнения в Ubuntu описан ниже (будет использоваться для выполнения основных шагов).
В приведенном примере устанавливается опциональный компонент Ansible. В скриптах можно указать любые инструкции в нужном порядке, задаваемом в файле конфигурации сборки *packer.json.
image-build-packer:scripts:ubuntu:common.shansible.shclean.sh
ubuntu-ansible-packer.json
Листинг упомянутых скриптов приведен далее.
#!/bin/bashset -euxsudo apt-get updatesudo apt-get install software-properties-common --yessudo apt-add-repository --yes --update ppa:ansible/ansiblesudo apt-get install python-apt --yessudo apt-get install ansible --yescat <<EOF >/etc/ansible/hostslocalhost ansible_connection=localEOFcat <<EOF >/etc/ansible/ansible.cfg[defaults]host_key_checking = FalseEOFexit 0
#!/bin/bashset -xecho "Cleaning Up..."sudo apt autoremove --yessudo apt-get --yes clean# Remove biased udev rulesrm /etc/udev/rules.d/*sed -i '/HWADDR/d' /etc/sysconfig/network-scripts/ifcfg-eth0rm -rf /tmp/*rm -rf /var/log/*# Clean up cloud-init artefactssudo rm -rf /var/lib/cloud/*# Clean up injected datasudo rm -rf /{root,home/*}/{.ssh,.bash_history} && history -c#Ensure changes are written to disksync
#!/bin/bashset -euxcat <<EOF >/etc/default/localeLANG=en_US.UTF-8EOFsudo apt-get update#sudo apt-get upgrade --yessudo systemctl disable apt-daily.servicesudo systemctl disable apt-daily.timersudo systemctl disable apt-daily-upgrade.servicesudo systemctl disable apt-daily-upgrade.timerexit 0
{"variables": {"build_flavor": "Basic-1-1-10","int_network": "114075d3-7e7e-421b-abca-52bb5f594576","ext_network": "4006730b-f45a-42e1-b95d-352e5724f729","source_image_name": "Ubuntu-22.04.1-test","ssh_username": "ubuntu"},"builders": [{"type": "openstack","flavor": "{{ user `build_flavor` }}","image_name": "Custom-image","source_image_name": "{{ user `source_image_name` }}","image_visibility": "shared","ssh_username": "{{ user `ssh_username` }}","networks": ["{{ user `int_network` }}"],"floating_ip_network": "{{ user `ext_network` }}","security_groups": ["default", "ssh+www"],"config_drive": true}],"provisioners": [{"type": "shell","script": "scripts/ubuntu/common.sh","execute_command": "sudo {{.Path}}"},{"type": "shell","script": "scripts/ubuntu/ansible.sh","execute_command": "sudo {{.Path}}"},{"type": "shell","script": "scripts/ubuntu/clean.sh","execute_command": "sudo {{.Path}}"}]}
Чтобы подготовить образ с помощью OpenStack Builder, выполните шаги:
-
Скачайте и установите Packer.
-
Создайте / скачайте openrc-файл с доступами к облаку (см. пример файла в разделе Конфигурационный файл для подключения).
-
Создайте директорию со скриптами из раздела Предусловия.
-
Заполните конфигурационный файл
ubuntu-ansible-packer.json:-
build_flavor— наименование или идентификатор шаблона ВМ (можно узнать с помощью командыopenstack flavor list). -
int_network— ID внутренней сети, которая поддерживает плавающие IP-адреса. -
ext_network— ID внешней сети (по умолчаниюexternal, можно узнать с помощью командыopenstack network list --long | grep External). -
image_name— название создаваемого образа. -
source_image_name— наименование образа, на основе которого будет создан новый образ. -
image_visibility— доступность создаваемого образа:public— публичный.private— приватный.shared— доступный некоторым проектам.
-
ssh_username— имя пользователя, по которому будет возможен вход в ВМ. -
security_groups— список групп безопасности для ВМ. Обязательное значение —sshилиssh+www. -
provisioners— список скриптов, которые будут запущены на ВМ.
-
-
Выполните команды на сборку:
source <OPENRC_СКРИПТ>cd image-build-packerpacker build ubuntu-ansible-packer.json -
Задайте дополнительные свойства созданному образу (который был собран с помощью Packer), выполнив команду:
openstack image set --property os_require_quiesce='True' --property hw_qemu_guest_agent='True' <НАЗВАНИЕ_ОБРАЗА>
После успешного выполнения всех шагов в Платформе появится загруженный образ. Посмотреть образ можно в Портале самообслуживания или Портале администратора на странице «Образы».
Перенос образа может понадобиться, например, когда образ собирается в одном облаке, а перенести его нужно в другое. Тогда после сборки образа выполните команды (на примере образа Custom-image.img):
openstack image save --file Custom-image.img Custom-imagescp Custom-image.img $TARGETIP:ssh $TARGETIPsource openrc.shopenstack image create --container-format bare --disk-format raw --file Custom-image.img --property os_require_quiesce='True' --property hw_qemu_guest_agent='True' \--public Custom-image
- ВМ в минимальной конфигурации (один диск, доступ в сеть по SSH, один раздел).
- Установленный ISO образ целевой ОС.
- Доступность репозиториев из сети ВМ.
Чтобы подготовить образ вручную, выполните шаги:
-
Установите целевую ОС на ВМ.
-
Перейдите на ВМ по SSH.
-
Установите пакет
cloud-init(см. официальную документацию). -
Включите автозапуск
cloud-init(например, с помощью linux-командыsystemctl enable cloud-init). При необходимости настройте конфигурационный файл/etc/cloud/cloud.cfg. -
Установите пакет
qemu-guest-agent(см. официальную документацию). -
Включите автозапуск
qemu-guest-agent(например, с помощью linux-командыsystemctl enable qemu-guest-agent). -
Выполните дополнительные настройки при необходимости (см. раздел Дополнительные шаги).
-
Выключите локальную ВМ.
-
Выполните экспорт переменных для доступа к OpenStack API любым удобным способом (см. раздел Использование OpenStack CLI для управления Платформой).
-
Загрузите образ:
openstack image create --container-format bare --disk-format raw --file Arch.img --public --property hw_qemu_guest_agent='True' --property os_require_quiesce='True' Arch
После успешного выполнения шагов будет создан файл (в примере выше — Arch.img), загруженный в Платформу.
-
Выключите все ресурсы (
datasources) вcloud-init, кроме OpenStack — создайте файл/etc/cloud/cloud.cfg.d/15_datasource.cfg:datasource:OpenStack:max_wait: 180 -
Выполните очистку ВМ — последовательно выполните команды (пример linux-команд):
rm /etc/udev/rules.d/*rm -rf /var/lib/cloud/*rm -rf /tmp/*find /var/log -maxdepth 5 -type f -exec rm -fv {} \;sudo truncate -s 0 /etc/udev/rules.d/70-persistent-net.rulessed -i '/HWADDR/d' /etc/sysconfig/network-scripts/ifcfg-eth0sudo truncate -s 0 /etc/resolv.confsudo rm -f /etc/NetworkManager/conf.d/99-cloud-init.confrpm-ostree cleanup -b -p -r -m
С помощью утилиты diskimage-builder можно собрать ограниченный набор образов; список поддерживаемых образов доступен в официальной документации.
- Поддержка Python-библиотек.
- Выход в интернет.
- Установленный пакет
qemu-utils(можно установить, например, с помощью ubuntu-командыsudo apt install qemu-utils). - Не менее 3 ГБ свободного пространства.
Чтобы подготовить образ с помощью утилиты diskimage-builder, выполните шаги:
-
Установите виртуальное окружение python virtualenv (см. официальную документацию).
-
Уточните версию python с помощью команды
python --versionили аналога. -
Создайте папку с виртуальным окружением:
virtualenv -p python<PYTHON_VERSION> venv_py<PYTHON_VERSION>;source venv_py<PYTHON_VERSION>/bin/activate -
Установите
diskimage-builder:pip install git+https://opendev.org/openstack/diskimage-builder.git -
Запустите сборку образа:
DIB_RELEASE=15.3 disk-image-create -t raw -o opensuse-15.3.img vm opensuse -
Загрузите образ:
openstack image create --container-format bare --disk-format raw --file opensuse-15.3.img --public --property hw_qemu_guest_agent='True' --property os_require_quiesce='True' Opensuse
После успешного выполнения шагов будет создан файл (в примере выше — opensuse-15.3.img), загруженный в Платформу.
С помощью diskimage-builder возможна донастройка целевой ОС, подробнее см. в официальной документации.