Vagrant使用VirtualBox创建开发环境,然后使用ansible进行配置。作为配置的一部分,ansible运行重新启动,然后等待SSH重新启动。这可以按预期工作,但由于没有从“vagrant up”命令启动vagrant机器,当重新启动框时,同步文件夹无法正确安装。
运行“vagrant reload”修复机器并再次安装共享。
有没有一种方法可以告诉流浪汉重新加载服务器,还是做一些手动重启后流浪汉会做的所有钻头?
当SSH进入流浪者框时,只需运行“sudo reboot”也会产生同样的问题。
答案 0 :(得分:7)
Vagrant无法知道在配置期间机器正在重新启动。
如果可能的话,最好的办法是避免完全重启。例如,在构建基本框时应该已经完成内核更新。
另一种简单(但不是很方便)的方法是使用日志输出或文档或使用调用vagrant up && vagrant reload
的包装脚本来处理它。
最后,您可以编写一个插件,在配置完成后向Vagrant中间件堆栈注入所有必需的安装等操作,但您仍然需要考虑如何让插件知道机器已经启动。其他挑战是,这很容易让提供商具体。
答案 1 :(得分:3)
您应该能够将文件系统添加到/ etc / fstab以在引导时挂载。
这是我的榜样:
vagrant /vagrant vboxsf defaults 0 0
home_vagrant_src /home/vagrant/src vboxsf defaults 0 0
home_vagrant_presenter-src /home/vagrant/presenter-src vboxsf defaults 0 0
你的流浪者目录中应该有一个.vagrant隐藏目录,在那里你应该找到一个指向" synced_folders"的路径。文件(在我的情况下:/vagrant/.vagrant/machines/default/virtualbox/synced_folders
)。
该文件应该可以帮助您弄清楚标签是什么以及它们的挂载点:
{"virtualbox":{"/home/vagrant/src":{"guestpath":"/home/vagrant/src","hostpath":"/home/rkomorn/src","disabled":false,"__vagrantfile":true},"/home/vagrant/presenter-src":{"guestpath":"/home/vagrant/presenter-src","hostpath":"/home/presenter/src","disabled":false,"__vagrantfile":true},"/vagrant":{"guestpath":"/vagrant","hostpath":"/home/rkomorn/vagrant","disabled":false,"__vagrantfile":true}}}
它不是最容易阅读的,但是,使用python术语,标签似乎是内部字典的键,用/转换为_(例如:/ home / vagrant / presenter-src key成为home_vagrant_presenter-src标签)。
我实际上不确定为什么流浪汉不会将/ etc / fstab用于共享文件夹,但我猜这是一个很好的理由。
答案 2 :(得分:1)
将您的配置文件拆分为两个单独的步骤,并使用vagrant-reload plugin作为其他配置程序。
示例Vagrantfile:
config.vm.provision "Step 1 - requires reboot", type: "shell", path: "scripts/part1.sh"
config.vm.provision :reload
config.vm.provision "Step 2 - happens after reboot", type: "shell", path: "scripts/part2.sh"
答案 3 :(得分:0)
万一其他人遇到这个问题并像我一样找到了这个问题,这就是我如何解决该问题:
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "..."
# create a shared folder for the top-level project directory at /vagrant
# normally already configured but for some reason it isn't on these boxes
# https://www.vagrantup.com/docs/synced-folders/virtualbox.html#automount
# http://www.virtualbox.org/manual/ch04.html#sf_mount_auto
config.vm.synced_folder ".", "/mnt/vagrant", id: "vagrant", automount: true
config.vm.provision "shell", inline: "usermod -a -G vboxsf vagrant"
config.vm.provision "shell", inline: "ln -sfT /media/sf_vagrant /vagrant"
# More settings omitted...
end
此解决方案有几部分:
id
中的特定vagrant
分配给共享文件夹。这很重要,因为默认情况下,VIrtualBox中的自动挂载功能使用/mnt/sf_<id>
。它还会将文件夹安装在/mnt/vagrant
上,以免干扰。理想情况下,您应该选择所有VM上存在的更模糊的位置,或者只是记录不要在此处使用它。/mnt/sf_vagrant
的自动挂载位置到用户期望的/vagrant
共享文件夹的通常位置。vagrant
用户添加到vboxsf
组中。这是访问/mnt/sf_vagrant
内文件的必要步骤,因为来宾实用程序会以root:vboxsf
所有权挂载该文件夹。他们还设置了适当的文件和目录模式,因此在实践中效果很好,但是您确实需要成为vboxsf
组的成员。此解决方案具有以下优点:
/mnt/sf_vagrant
处的挂载,因此/vagrant
应该始终可用。它具有以下缺点:
/mnt/vagrant
挂载,则可能会发生意外行为。仅当虚拟机是最近通过vagrant
控制台客户端启动/重新引导的虚拟机时,才会出现该挂载,否则将不存在。编辑:为-T
添加了ln
选项,以避免在极端情况下创建/vagrant/sf_vagrant
作为符号链接。