Packer是一个可以让你(重新)打包镜像以在不同环境下运行的实用程序. Multipass也可以运行那些镜像, 只需要满足一条件(意即, 镜像必须在虚拟机启动, 并且云端启动(cloud-init)需要可用.
内容:
最简单的方式是从现有的Ubuntu云镜像(Ubuntu Cloud image)启动, 然后是一些基础的项目设置(你可以点击文件名看具体内容, meta-data
是特意留空的):
|- cloud-data
| |- meta-data
| |- user-data
|---- template.json
1个目录, 3份文件
你需要安装QEMU(例如sudo apt install qemu
), 可以从此运行:
$ packer build template.json
$ multipass launch file://$PWD/output-qemu/packer-qemu --disk 5G
...
Launched: tolerant-hammerhead
$ multipass shell tolerant-hammerhead
...
ubuntu@tolearant-hammerhead ~:$
现在上面步骤起作用了, 使用multipass delete --purge tolerant-hammerhead
删除测试实例, 然后在template.json
文件中编辑下面部分:
{
"type": "shell",
"inline": ["echo Your steps go here."]
},
任何你在这所在都会影响到最终镜像. 你可以安装包, 配置服务, 做任何你可以在运行中系统上可做的事情. 有可能需要sudo
(无需密码)处理任何需要管理权限的事务, 或者你可以将下面这些加到过程中以有权限执行完整脚本:
"execute_command": "sudo sh -c '{{ .Vars }} {{ .Path }}'",
为了让镜像对让人也有用, 你可能需要"普遍化"镜像, 以使它可以在其他机器上也能平稳运行, 例如其他网络, 甚至是在不同的虚拟机上. 这是template.json文件中最后一个词条在设置过程中所做的事.
长话短说, Packer使用下载好的镜像启动虚拟机, 然后在运行中的系统上运行所有设置过程.
Ubuntu云端镜像被默认设置为仅允许基于密钥的SSH登录. Packer的qemu
builder仅支持密码授权, 所以我们在镜像打包过程中, 使用cloud-init
预设一个带有简单密码的packer
用户. 这些是通过JSON模板文件中下面这部分完成的:
"http_directory": "cloud-data",
"qemuargs": [
["-smbios", "type=1,serial=ds=nocloud-net;instance-id=packer;seedfrom=http://{{ .HTTPIP }}:{{ .HTTPPort }}/"]
],
这让Packer通过HTTP服务cloud-data
目录, 然后cloud-init
通过NoCloud
数据源(Nocloud datasource)消费它. 参考cloud-init文档以理解user-data词条的意思.
为了让Multipass能够消费此镜像, cloud-init
需要去执行另一套指令, 所以需要重置. 镜像中的Packer
用户需要被移除, 并且其他修改会被恢复(例如SSH密码授权). 这些是模板中设置过程的最后一步, 也不需要被解释.
你所作修改也有可能需要一些清理, 你可以挂载qemu镜像, 然后使用Meld工具比较这两个树(trees), 看看是否所有修改确实都是有意而为.
译者注: trees应被理解为git中的历史记录树
前往Packer文档学习关于QEMU编辑器, 其他设置过程和相关的配置, 和其他可能派上用场的内容. 可选方案, 你可以扩展user-data
到其他cloud-init
目录以扩充你的镜像.
请访问我们的讨论空间(our discourse space), 让我们了解你的镜像!