Начиная с 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:
Запустите скрипт:
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:
Однако, у 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Добавьте права на запуск: chmod +x /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
Запустите скрипт:
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: