Подготовка образа диска ВМ для загрузки в Платформу
Подготовка образа диска ВМ для его загрузки в Платформу может выполняться разными способами. Далее описаны варианты подготовки образа:
- Утилита 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.sh.ansible.sh.clean.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-packer$ packer 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-image$ scp Custom-image.img $TARGETIP:$ ssh $TARGETIP$ source openrc.sh$ openstack 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.rules$ sed -i '/HWADDR/d' /etc/sysconfig/network-scripts/ifcfg-eth0$ sudo truncate -s 0 /etc/resolv.conf$ sudo rm -f /etc/NetworkManager/conf.d/99-cloud-init.conf$ rpm-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 возможна донастройка целевой ОС (подробнее — в официальной документации).