我觉得我肯定忽略了某些显而易见的东西。所以我希望有人能在我尝试提交正式错误报告之前告诉我为什么我这么愚蠢。
我最近下载了Ubuntu 16.04 云镜像并尝试通过 Web 客户端将其部署到基于 vSphere 6 的 vCenter 实例。与基于 ISO 的常规模板相比,“云映像”的优点在于它附带云初始化默认情况下已嵌入。此映像的 OVA 版本将一组 cloud-init 选项公开为 vApp 选项,可在向导末尾填写,如下所示:
大部分情况下,一切运行正常,符合预期。主机名设置为 的值hostname
。默认用户的密码设置为 的值Default User's password
。
问题是我现在试图使用该Encoded user-data
字段传递一个云配置YAML 文件来执行一些其他任务。目前,我能想到的最简单的测试是使用以下 cloud-config 脚本来创建一个名为 的用户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
。但我不确定该 mime 类型是如何设置的。
有人知道我在这里做错了什么吗?