我目前正在构建一个相当复杂的服务器堆栈(一个 ruby on rails 应用程序),我希望开发人员能够使用它而不必自己安装所有东西。因此我使用 Vagrant 来允许他们这样做。
这个想法是,当你第一次安装镜像时,它会拉取最新的源并安装依赖项,源通过同步文件夹(vagrant 内置的功能)公开,以便开发人员可以提交源并在自己的环境中编辑它们。Vagrant-box 仅适用于服务器。
Vagrantfile 中的同步文件夹条目:
config.vm.synced_folder "gameeso/", "/var/gameeso", :create => "true"
该图像是一个带有 upstart 脚本的 Ubuntu 服务器(脚本在启动时执行,并且仅在互联网连接建立时执行),该脚本:
从 Github 中提取最新的开发分支(如果文件夹不存在)
安装依赖项(由脚本完成)
- 启动服务器
所有这些都发生在同步文件夹中。这种方法让我遇到了一些问题,主要是 Vagrant 会清除我的客户系统上的同步文件夹。 我通过在 upstart 脚本中添加“sleep 10”解决了这个问题,这样它可以等到 Vagrant 设置同步文件夹。
当然,这不是一种安全的方法(以防启动时间超过 10 秒,虽然现在不太可能,但我宁愿不去发现 ;))
我的问题是:有没有更好的方法让客户主机(流浪者形象)填充同步文件夹?
当然,提前感谢!
答案1
Vagrant 的内置配置功能应该非常适合此目的。有很多方法可以做到这一点,但最简单的方法可能是提取 Upstart 脚本的核心并将其变成普通的 shell 脚本。然后,将其中一个块放入您的Vagrantfile
:
使用“内联”脚本。Vagrant 会将内容复制到目录
Vagrantfile
中的脚本中/tmp
并执行它。$script = <<<SCRIPT // The contents of your script go here SCRIPT config.vm.provision "shell", inline: $script
请注意,此处的脚本位于“定界符”,这意味着您需要小心确保
SCRIPT
结束 heredoc 的标记位于正确的位置 - 即单独一行,没有多余的空格。 (上面关于 heredoc 的链接确实显示了一种允许空格的方法,但无论如何您都需要小心。)指向脚本文件.Vagrant 会把这个文件复制到
/tmp
目录中并执行它。config.vm.provision "shell", path: "setup.sh"
注意这里的路径是相对于
Vagrantfile
位置的。 然而,该文件不是从该位置执行的,因此如果您需要该文件位于某个目录中,则应遵循方法#3。使用指向脚本文件的“内联”脚本。 这样,您就可以在选定的位置执行脚本(在下面的示例中,这是在
/vagrant
您完成先决条件chmod
或设置环境变量之后)。$script = <<SCRIPT chmod +x /vagrant/setup.sh cd /vagrant ./setup.sh SCRIPT config.vm.provision "shell", inline: $script
您还可以使用通过“真实”部署和配置系统工作的配置方法,但根据您的要求,这可能会有些过度。