我正在使用 libvirt python 绑定创建一个类似于云计算提供商的系统。
我希望让用户能够以类似于 AWS 的方式指定自定义虚拟机映像。
我想动态生成 SSH 密钥对并设置 VM 进行公钥认证。
哪种方法最好? 我应该对用户指定的 VM 映像施加哪些要求才能使其正常工作?
我原本想使用无密码的 root 帐户来允许我的软件登录并设置所需的内容,但这会留下一个(短暂的)时间跨度,在此期间每个人都可以以 root 身份登录。有没有更好的解决方案?我可以在启动虚拟机映像之前编辑它吗?
实际上,我需要登录才能登录到机器并执行一些命令,然后才能将其交给用户。
编辑:
其他详细信息:
- 我了解 Eucalyptus、Cloudstack 和 Openstack。此实现适用于非常特定的环境/要求(HPC 集群、批处理作业调度),不允许运行这些。
- 我其实并不关心(或者,就这个问题而言,这并不重要)密钥对来自哪里,我只想知道服务提供商如何访问机器,通过在用户端尽可能少地设置 VM 映像;ErikA 对此回复建议使用特定于服务的密钥对。很公平。还有其他解决方案吗?
- 最终用户不必访问新的虚拟机,他将通过斯拉普(不过,如果他愿意的话他可以访问它,我不在乎)。
- 提供商负责:
- 分配和创建新的域(虚拟机)
- 生成 SLURM 守护进程(这不一定在启动时发生,而是在某个时间点发生,因此需要提供商能够访问机器)
答案1
答案2
我按照以下方式解决了这个问题:
因为我需要分配给虚拟机的 IP 地址,而 libvirt 没有提供检索它的方法(相反,VMWare 提供了用于此类操作的 VMWare 工具套件),所以我最终在虚拟机和主机之间设置了一个串行(在客户机上)到 tcp(在主机上)通道,使用 libvirt 的虚拟设备支持。
客户机上的简单 shell 脚本会等待 IP 地址分配给指定接口,然后将其写入串行设备。当主机上的 TCP 服务器收到 IP 地址时,它会发回其公钥,客户机上的脚本会读取该公钥(同样,从串行端口读取)并将其写回到正确的authorized_keys
文件中。
此解决方案无需 IP 交换部分,只需客户机在启动时从串行端口读取密钥即可。此解决方案的优点是客户机操作系统无需使用给定密钥进行自定义(因此,不同的密钥对可用于不同的系统“分区”),并且可以管理密钥的放置位置;缺点是必须配置客户机才能运行脚本。
另一个解决方案是在虚拟机启动之前安装磁盘映像,方法是使用类似libguestfs
,复制公钥,卸载它并启动客户机。此解决方案比 TCP<->SerialPort 解决方案更可取,但由于我无论如何都需要 IP 地址,所以我反过来操作。
第三个解决方案,正如 ErikA 在他的第一条评论中所建议的那样,是让创建镜像的用户通过向他们提供您的公钥来完成所有设置。对于最常见的情况,这可能是最好的(最干净、最优雅的)解决方案。