Я чувствую, что здесь не хватает чего-то очевидного. Так что я надеюсь, что кто-нибудь скажет мне, почему я веду себя глупо, прежде чем я попытаюсь отправить официальный отчет об ошибке.
Недавно я скачал версию OVA Образ облака Ubuntu 16.04 и я пытаюсь развернуть его на моем экземпляре vCenter на базе vSphere 6 через веб-клиент. Преимущество "облачного образа" над обычным шаблоном на основе ISO заключается в том, что он поставляется с cloud-init запекается по умолчанию. Версия OVA этого изображения предоставляет набор параметров cloud-init в виде параметров vApp, которые можно заполнить в конце мастера следующим образом:
По большей части все работает отлично и, как и ожидалось. Имя хоста устанавливается в значение hostname
. Пароль пользователя по умолчанию устанавливается на значение Default User's password
.
Проблема в том, что сейчас я пытаюсь использовать Encoded user-data
поле передать в облачная конфигурация YAML для выполнения дополнительных задач. На данный момент самым простым тестом, который я мог придумать, был следующий сценарий облачной конфигурации для создания одного пользователя с именем demo
:
#cloud-config
users:
- name: demo
Инструкции на Encoded user-data
указывает, что мне нужно кодировать в base64 передаваемые мной пользовательские данные, а затем они будут декодированы позже. В пример Я обнаружил, что в источнике cloud-init это подтверждается. Так я и сделал.
$ base64 -w0 cloud-config.txt && echo
I2Nsb3VkLWNvbmZpZwp1c2VyczoKICAtIG5hbWU6IGRlbW8K
И я вставил это закодированное значение в Encoded user-data
поле и закончил мастер. Но, к сожалению, как только виртуальная машина завершила развертывание и была запущена, «демонстрационного» пользователя найти не удалось.
Итак, я углубился в /var/log/cloud-init.log
искал подсказки, и единственное, что я нашел, это предупреждение о типе содержимого пользовательских данных.
__init__.py[DEBUG]: Calling handler CloudConfigPartHandler: [['text/cloud-config-jsonp', 'text/cloud-config']] (__begin__, None, 3) with frequency always
__init__.py[DEBUG]: Calling handler BootHookPartHandler: [['text/cloud-boothook']] (__begin__, None, 2) with frequency always
__init__.py[DEBUG]: Calling handler ShellScriptPartHandler: [['text/x-shellscript']] (__begin__, None, 2) with frequency always
__init__.py[DEBUG]: {'MIME-Version': '1.0', 'Content-Disposition': 'attachment; filename="part-001"', 'Content-Type': 'text/x-not-multipart'}
__init__.py[WARNING]: Unhandled non-multipart (text/x-not-multipart) userdata: 'b'I2Nsb3VkLWNvbmZpZwp1c2Vy'...'
__init__.py[DEBUG]: Calling handler CloudConfigPartHandler: [['text/cloud-config-jsonp', 'text/cloud-config']] (__end__, None, 3) with frequency always
util.py[DEBUG]: Writing to /var/lib/cloud/instances/test01/cloud-config.txt - wb: [384] 0 bytes
__init__.py[DEBUG]: Calling handler BootHookPartHandler: [['text/cloud-boothook']] (__end__, None, 2) with frequency always
__init__.py[DEBUG]: Calling handler ShellScriptPartHandler: [['text/x-shellscript']] (__end__, None, 2) with frequency always
handlers.py[DEBUG]: finish: init-local/consume-user-data: SUCCESS: reading and applying user-data
handlers.py[DEBUG]: start: init-local/consume-vendor-data: reading and applying vendor-data
stages.py[DEBUG]: no vendordata from datasource
handlers.py[DEBUG]: finish: init-local/consume-vendor-data: SUCCESS: reading and applying vendor-data
Я также искал подсказки в /var/lib/cloud/instance
. В user-data.txt
файл там содержал то же значение в кодировке base64, которое я вставил в мастер. Также был user-data.txt.i
файл, содержащий следующее:
Content-Type: multipart/mixed; boundary="===============1746641247068827328=="
MIME-Version: 1.0
Number-Attachments: 1
--===============1746641247068827328==
MIME-Version: 1.0
Content-Type: text/x-not-multipart
Content-Disposition: attachment; filename="part-001"
I2Nsb3VkLWNvbmZpZwp1c2VyczoKICAtIG5hbWU6IGRlbW8K
--===============1746641247068827328==--
Предупреждение в файле журнала создает впечатление, что основная проблема связана не с кодировкой base64, а с text/x-not-multipart
что заканчивается в user-data.txt.i
файл. Но я не уверен, как вообще устанавливается этот тип пантомимы.
Кто-нибудь знает, что я здесь делаю не так?