如何在Vagrant基础镜像(VirtualBox)中包含和引用自定义SSH密钥?

5
在vagrant文档中,我没有找到如何在使用"vagrant package"时从已包含的Vagrantfile中引用同一基线盒子中的已包含文件的提示。有人可以帮忙吗?
详情:
当为vagrant从头创建一个新的基线盒子时,您可以自由使用标准的vagrant不安全的ssh密钥或创建一个自定义的新密钥。我选择了后者。当我使用这个额外行的Vagrantfile时,我的自定义密钥与这个新的基线盒子一起正常工作:
config.ssh.private_key_path = "custom_key_file"

现在我决定将我的基线盒分发给我的团队成员。这并不是问题。只需要输入:

vagrant package --output custom.box

所有其他团队成员都会将“custom_key_file”复制到项目根目录,并创建一个包含以下内容的“Vagrantfile”(使用版本控制系统完成):

# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
    config.vm.box = "custombox"
    config.ssh.private_key_path = "custom_key_file"
end

完成后,每个团队成员输入以下内容即可快速轻松地获取基于custom.box的虚拟机:
vagrant box add custombox custom.box
vagrant up

运行正常。

现在我想在分发之前对我的基准盒子进行一些微调。我想包括"custom_key_file"和一个名为"Vagrantfile.pkg"的文件,该文件如下所示:

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
    config.vm.box = "custombox"
    config.ssh.private_key_path = "custom_key_file"
end

为了创建经过调整的基准框,我输入以下内容:
vagrant package --output custom2v.box --vagrantfile Vagrantfile.pkg --include custom_key_file

当我提取custom2v.box时,我可以看到这棵��:
C:.
│   box-disk1.vmdk
│   box.ovf
│   Vagrantfile
│
└───include
        custom_key_file
        _Vagrantfile

而“include /_Vagrantfile”中包含了我的 Vagrantfile.pkg 文件内容。我可以按照以下方式将该框添加:
vagrant box add custombox2v custom2v.box

针对一个新的项目,现在很容易将其启用于 Vagrant。只需添加一个名为 "Vagrantfile" 的文件,并按照以下方式进行设置:

# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
    config.vm.box = "custombox2v"
end

但是当我执行以下操作时:
vagrant up

我收到了以下错误信息:

[...]
Bringing machine 'default' up with 'virtualbox' provider...
There are errors in the configuration of this machine. Please fix
the following errors and try again:

SSH:
* `private_key_path` file must exist: custom_key_file

Can anyone help?

1个回答

6
原因是Vagrant的配置加载顺序和合并。
您希望发生的是Vagrant使用位于框架存档中的私钥。
当您运行"up"时,实际发生的情况是Vagrant将您的配置与其"加载和合并"路径上的其他配置合并。
因此,在最后一步,您将拥有一个大的配置文件,其中包含以下设置: config.ssh.private_key_path = "custom_key_file" 因此,Vagrant将在与您的Vagrantfile相同的文件夹中查找custom_key_file,这就是为什么会出现错误的原因。
请参阅此答案此问题以了解如何配置Vagrant相对于框架的Vagrantfile查找密钥的信息。

我原本以为Vagrant会记住所有找到Vagrantfile的路径并在合并配置时遍历这些路径以查找引用的文件。但是,我失败了。看起来Vagrant并不是这样工作的。遗憾的是,似乎没有环境变量或Ruby变量可用于使配置可移植(没有绝对路径)。感谢提供问题链接。我将使用Ruby语句“实现”该缺失功能并接受您的答案。 - DanielaWaranie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接