很抱歉让你远离你需要的东西!
从 Vagrantfile 更改 HOST 文件:
你真正想要的很简单。每次运行 vagrant 命令时,Vagrantfile 都会由 Vagrant 解释。它是常规的 ruby 代码,所以如果你想更改 HOST 文件,你需要做的就是放入执行此更改的 Vagrantfile Ruby 代码。这是我放在 Vagrantfile 末尾的示例代码:
require 'tempfile'
require 'fileutils'
path = '~/.ssh/known_hosts'
temp_file = Tempfile.new('foo')
begin
File.open(path, 'r') do |file|
file.each_line do |line|
if line !~ /REGEX_OF_LINE_YOU_WANT_TO_EXCLUDE/ then
temp_file.puts line
end
end
end
temp_file.rewind
FileUtils.mv(temp_file.path, path)
ensure
temp_file.close
temp_file.unlink
end
请注意通过将您自己的值设置为来编辑上面的代码REGEX_OF_LINE_YOU_WANT_TO_EXCLUDE
。
希望我通过提供这个答案至少部分纠正了我的错误:)
原始答案
对于任何人(以及我的)未来参考,我将留下部分答案,即更改 GUEST OS 文件或将文件复制到 GUEST OS:
Vagrant 提供了几个provisioners。
解决方案 1:对于简单的文件复制,您可以使用 Vagrant file provisioner。Vagrantfile 中的以下代码会将文件~/known_hosts.template
从主机系统复制到 VM 的文件/home/vagrant/.ssh/known_hosts
# Context -------------------------------------------------------
Vagrant.configure('2') do |config|
# ...
# This is the section to add ----------------------------------
config.vm.provision :file do |file|
file.source = '~/known_hosts.template'
file.destination = '/home/vagrant/.ssh/known_hosts'
end
#--------------------------------------------------------------
end
文件配置器在 Vagrant 网站上的记录很差,我们必须感谢 @tmatilai,他在 serverfault 上回答了类似的问题。
请记住,您应该在目标字段中使用绝对路径,并且复制是由 vagrant 用户执行的,因此文件将具有 vagrant 的所有者:组。
解决方案 2:如果您需要使用 root 权限复制文件,或者确实必须在不使用模板的情况下更改文件,请考虑使用文档齐全的shell provisioner。在这种情况下,文件复制只有在您将文件放置在从 VM(guestOS)中可见的文件夹中时才有效,但您拥有 shell 的所有功能。
解决方案 3:虽然在这种情况下会有点矫枉过正,但您可以使用非常强大的Chef或Puppet作为配置器,并通过其中一个框架执行操作。我对 Puppet 一无所知,可能只会谈论 Chef。食谱将非常简单。创建具有所需内容的模板文件 (.erb),然后您的配方将仅将文件放置在必要的位置。当然,您需要一个装有厨师包装的盒子。