【问题标题】:Synced folders lost when rebooting a Vagrant machine using the Ansible provisioner使用 Ansible 配置器重新启动 Vagrant 机器时同步的文件夹丢失
【发布时间】:2014-07-16 16:19:37
【问题描述】:

Vagrant 使用 VirtualBox 创建开发环境,然后使用 ansible 配置它。作为配置的一部分,ansible 会重新启动,然后等待 SSH 恢复。这可以按预期工作,但是因为 vagrant 机器不是从“vagrant up”命令启动的,所以当盒子从重新启动后恢复时,同步的文件夹没有正确安装。

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

有没有办法告诉 vagrant 重新加载服务器或执行 vagrant 在手动重启后会做的所有事情?

在 SSH-ed 进入 vagrant box 时简单地运行“sudo reboot”也会产生同样的问题。

【问题讨论】:

    标签: linux ssh vagrant reboot ansible


    【解决方案1】:

    Vagrant 无法知道在配置期间机器正在重新启动。

    如果可能,最好完全避免在此处重新启动。例如,在构建基础盒时应该已经完成​​内核更新。

    另一种简单(但不是很方便)的方法是使用日志输出或文档来处理它,或者使用调用 vagrant up && vagrant reload 的包装脚本来处理它。

    最后,您可以编写一个插件,在配置后将所有需要的挂载等操作注入 Vagrant 中间件堆栈,但您仍然需要考虑如何让插件知道机器已启动。另一个挑战是这很容易获得特定于提供商的信息。

    【讨论】:

      【解决方案2】:

      您应该能够将文件系统添加到 /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 目录中应该有一个 .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 键成为 home_vagrant_presenter-src 标签) .

      我实际上不确定为什么 vagrant 不只是将 /etc/fstab 用于共享文件夹,但我猜这是有充分理由的。

      【讨论】:

        【解决方案3】:

        将您的供应商分成两个单独的步骤,并使用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"
        

        【讨论】:

          【解决方案4】:

          如果其他人遇到这个问题并像我一样发现这个问题,我就是这样解决这个问题的:

          # -*- 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. 第一行将vagrant 中的特定id 分配给共享文件夹。这很重要,因为 VIrtualBox 中的自动挂载功能默认使用 /mnt/sf_<id>。它还将文件夹挂载在/mnt/vagrant 以使其不受干扰。理想情况下,您会选择一个存在于所有虚拟机上的更隐蔽的位置,或者只是记录不在那里使用它。
          2. 第三行创建一个符号链接,从/mnt/sf_vagrant 的自动挂载位置到用户期望共享文件夹/vagrant 的通常位置。
          3. 第二行将虚拟机中的vagrant用户添加到vboxsf组。这是访问/mnt/sf_vagrant 中的文件所必需的,因为来宾实用程序以root:vboxsf 所有权安装文件夹。他们还设置了适当的文件和目录模式,因此在实践中可以正常工作,但您需要成为 vboxsf 组的成员。

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

          • /mnt/sf_vagrant 的挂载会在重启后由 virtualbox 来宾实用程序自动挂载,因此/vagrant 应该始终可用。
          • 它不需要安装插件或使用任何外部工具。

          它有以下缺点:

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

          编辑:将-T 选项添加到ln 以避免将/vagrant/sf_vagrant 创建为符号链接的极端情况。

          【讨论】:

            【解决方案5】:

            我也有同样的问题。这就是我在/etc/fstab 中的内容。

            #VAGRANT-BEGIN
            # The contents below are automatically generated by Vagrant. Do not modify.
            vagrant_data /vagrant_data vboxsf uid=1000,gid=1000,_netdev 0 0
            vagrant /vagrant vboxsf uid=1000,gid=1000,_netdev 0 0
            #VAGRANT-END
            

            因此,如果您看到 fstab 条目仍然存在,您所要做的就是运行 mount -a 以再次触发挂载。或者你可以复制这些行。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-07-21
              • 2015-09-26
              • 2015-08-21
              • 2014-07-01
              • 1970-01-01
              • 2017-10-11
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多