使用Ansible配置程序重新启动Vagrant计算机时,同步文件夹丢失

时间:2014-05-27 16:43:47

标签: linux ssh vagrant reboot ansible

Vagrant使用VirtualBox创建开发环境,然后使用ansible进行配置。作为配置的一部分,ansible运行重新启动,然后等待SSH重新启动。这可以按预期工作,但由于没有从“vagrant up”命令启动vagrant机器,当重新启动框时,同步文件夹无法正确安装。

运行“vagrant reload”修复机器并再次安装共享。

有没有一种方法可以告诉流浪汉重新加载服务器,还是做一些手动重启后流浪汉会做的所有钻头?

当SSH进入流浪者框时,只需运行“sudo reboot”也会产生同样的问题。

4 个答案:

答案 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

此解决方案有几部分:

  1. 第一行将id中的特定vagrant分配给共享文件夹。这很重要,因为默认情况下,VIrtualBox中的自动挂载功能使用/mnt/sf_<id>。它还会将文件夹安装在/mnt/vagrant上,以免干扰。理想情况下,您应该选择所有VM上存在的更模糊的位置,或者只是记录不要在此处使用它。
  2. 第三行创建了一个符号链接,该链接从/mnt/sf_vagrant的自动挂载位置到用户期望的/vagrant共享文件夹的通常位置。
  3. 第二行将虚拟机中的vagrant用户添加到vboxsf组中。这是访问/mnt/sf_vagrant内文件的必要步骤,因为来宾实用程序会以root:vboxsf所有权挂载该文件夹。他们还设置了适当的文件和目录模式,因此在实践中效果很好,但是您确实需要成为vboxsf组的成员。

此解决方案具有以下优点:

  • 重新启动后,virtualbox guest虚拟机实用程序会自动挂载/mnt/sf_vagrant处的挂载,因此/vagrant应该始终可用。
  • 不需要安装插件或使用任何外部工具。

它具有以下缺点:

  • 如果用户找到并使用/mnt/vagrant挂载,则可能会发生意外行为。仅当虚拟机是最近通过vagrant控制台客户端启动/重新引导的虚拟机时,才会出现该挂载,否则将不存在。
  • 它需要相对较新版本的VirtualBox和Vagrant。

编辑:为-T添加了ln选项,以避免在极端情况下创建/vagrant/sf_vagrant作为符号链接。