понедельник, 2 марта 2020 г.

Подготовка образа Ubuntu для vRealize Automation 8

Начиная с vRA 8, для гостевых ОС появилась возможность настройки через Cloud-Init. Cloud-Init позволяет подготовить ВМ к работе без необходимости использования сторонних агентов (как было в vRA 7.x) и систем управления вроде Ansible или Puppet. Администратору достаточно описать настройки в разделе CloudConfig в YAML шаблоне, после чего vRA сохранит их .ISO файле, подключит .ISO к ВМ и запустит Cloud-Init внутри гостевой ОС.

Однако, у Cloud-Init есть недостаток - он несовместим с Guest OS Customization, который используется VMware для настройки статического IP адреса в гостевой ОС. После выполнения настроек Guest OS Customization, ВМ перезагружается, что приводит к сбою работы Cloud-Init.

Для того, чтобы обеспечить работу двух механизмов, Maher AlAsfar в своем блоге https://vmwarelab.org/2020/02/14/vsphere-customization-with-cloud-init-while-using-vrealize-automation-8-or-cloud/ привел инструкцию по подготовке шаблона ВМ на базе Ubuntu 18.04. Ниже приведен вольный перевод его статьи с небольшими уточнениями по процессу подготовки шаблона. Идея фикса заключается в том, чтобы позволить Guest OS Customization переименовать компьютер и задать статический IP адрес, после чего запустить Cloud-Init через задание в Cron.

Для начала работы нам потребуется свежеустановленная Ubuntu Server 18.04. Вы можете использовать как обычный дистрибутив, так и Live Server.

Установите актуальную версию VMware Tools:
sudo apt-get update -y
sudo apt install -y open-vm-tools

Если вы используете Ubuntu Server (не Live Server), то установите Cloud Init:
sudo apt-get install -y cloud-init

Отредактируйте файл /etc/cloud/cloud.cfg и добавьте в него строчку disable_vmware_customization: true

Закомментируйте строку #D /tmp 1777 root root - в файле /usr/lib/tmpfiles.d/tmp.conf

В файле /lib/systemd/system/open-vm-tools.service добавьте строку After=dbus.service в разделе [Unit].

Для Live Server выполните рекомендации из https://kb.vmware.com/s/article/54986. Удалите каталог /var/lib/cloud/seed/nocloud-net и удалите файл /etc/cloud/cloud.cfg.d/50-curtin-networking.cfg

Выполните команду sudo dpkg-reconfigure cloud-init и оставьте настройку Cloud Init через OVF (OVF: Reads data from OVF Transports).

Теперь нам потребуется подготовить скрипт, который будет запускаться Cron'ом спустя 90 секунд после старта ОС. Создайте файл /vra/enable-cloud-init.sh:
#/vra/enable-cloud-init.sh
sudo crontab -r

sudo rm -rf /etc/cloud/cloud-init.disabled

sudo cloud-init init
sleep 20

sudo cloud-init modules --mode config
sleep 20

sudo cloud-init modules --mode final
Второй скрипт требуется запустить перед выключением ВМ. Этот скрипт удалит временные файлы и устаревшие параметры ВМ и создаст задание в crontab. Создайте скрипт для подготовки шаблона /vra/cleanup.sh:
#/vra/cleanup.sh
#Schedule the script to run at next boot
echo "@reboot sleep 90; sh /vra/enable-cloud-init.sh" | crontab -

#Disable cloud-init
touch /etc/cloud/cloud-init.disabled

#Delete obsolete netplan network interface config file
rm -rf /etc/netplan/50-cloud-init.yaml

#Delete temp files
rm -rf /tmp/*
rm -rf /var/tmp/*

#Regenerate host ssh certificates
rm -f /etc/ssh/ssh_host_*
dpkg-reconfigure openssh-server

#Clear out the local repository
apt-get clean

#Clear cloud-init logs and seeds
cloud-init clean --logs --seed

#Remove machine-id
cat /dev/null > /etc/machine-id
rm /var/lib/dbus/machine-id
ln -s /etc/machine-id /var/lib/dbus/machine-id

#Stop rsyslog service
service rsyslog stop

#Clean up bash history
history -w && cat /dev/null > ~/.bash_history
history -c
Добавьте права на запуск: chmod +x /vra/cleanup.sh

Запустите скрипт:
sudo /vra/cleanup.sh

Выключите ВМ:
shutdown -h now

Шаблон ВМ готов к кастомизации. Теперь требуется создать blueprint, указать в нем шаблон ВМ и параметры кастомизации в разделе CloudConfig и запустить тестовое задание.

После завершения кастомизации Guest OS Customization в vSphere Client при выборе ВМ на вкладке Monitor -> Events появится сообщение Customization of VM succeeded.

Спустя 90 секунд внутри ОС запустится задание Cron, которое выполнит оставшиеся настройки припомощи Cloud-Init. Проверить статус cloud-init можно с помощью команды: cloud-init status --long

Проверить данные, которые были переданы Cloud-Init для настройки, можно с помощью команды: cloud-init query userdata

В случае возникновения ошибок, можно проверить журналы Guest OS Customization: /var/log/vmware-imc/toolsDeployPkg.log
Журналы Cloud-Init: /var/log/cloud-init.log

Дополнительная информация по подготовке образа Ubuntu:
  1. https://jimangel.io/post/create-a-vm-template-ubuntu-18.04/
  2. https://blah.cloud/infrastructure/using-cloud-init-for-vm-templating-on-vsphere/
  3. https://github.com/vmware/open-vm-tools/issues/240