如何更改Vagrant sync_folder的所有者?

时间:2016-01-12 13:47:26

标签: vagrant ansible virtualization

我正在尝试使用Ansible创建一个Vagrant VM。我想在我的管理节点上的一个名为" project"的文件夹中找到我的网站。它与我的Ansible playbook和Vagrantfile位于同一目录中。我希望Vagrant在配置它时将此目录作为/ srv / http / ticker安装在(远程)VM上,但我也希望该目录由" ticker" user:group,就像我在我的生产网站上一样。问题是当Vagrant尝试挂载同步文件夹时,自动收报机用户不存在,我收到此错误:

Failed to mount folders in Linux guest.  This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly.  The command attempted was:

mount -t vboxsf -o uid=`id -u ticker`,gid=`getent group ticker...
mount -t vboxsf -o uid=`id -u ticker`,gid=`id -g ticker` srv_http_ticker /srv/http/ticker

The error output from the last command was:
stdin: is not a tty
id: ticker: no such user
id: ticker: no such user
mount: failed to parse mount options: No such file or directory

我已经安装了vagrant-vbguest插件,当我重新加载Vagrant时,我发现它正在运行,所以我不相信问题是" vboxsf"文件系统不可用。

这是我的Vagrantfile:

Vagrant.configure("2") do |config|
  config.vm.box = "debian/jessie64"
  config.vm.network "forwarded_port", guest: 80, host: 8080
  config.vm.network "forwarded_port", guest: 443, host: 8443
  # Putting provision here doesn't fix the problem
  # config.vm.provision :shell, path: "bootstrap-mgmt.sh"
  config.vm.synced_folder "project/", "/srv/http/ticker",
      :owner => "ticker",
      :group => "ticker"
  config.vm.provision :shell, path: "bootstrap-mgmt.sh"
end

这是创建自动收报机用户的引导程序配置脚本:

#!/usr/bin/env bash
sudo adduser --system --home /home/ticker --shell /bin/bash --group --disabled-login --gecos "" ticker

我尝试在synced_folder指令之前移动provision指令,但它仍然在synced_folder指令之后执行。我怀疑任何配置脚本总是最后运行并且应该发生,即使我在Vagrantfile中移动命令。

我已经读过一个vagrant-bindfs插件,它允许你更改NFS挂载的文件系统的所有者和组,但我不知道如果它运行之前它将如何帮助我我的配置脚本。

我尝试使用文件模块在Ansible脚本中更改/ srv / http / ticker目录的所有者,但这不起作用(我读过的所有内容都表明它不会)。

我知道我可以离开" vagrant:vagrant"作为所有者:我的网站所在的已安装文件系统的组,但我希望它由自动收录器用户拥有,以便它与我的生产服务器完全相似。

我是否有另一种方法可以将我的Vagrant synced_folder的所有者从流浪者用户更改为我的自动收报机用户?如果这是不可能的,那么其他人在遇到这种情况时会做些什么呢?

感谢。

1 个答案:

答案 0 :(得分:1)

看起来,以下两种可能性将起作用

  1. 从脚本安装
  2. 使用

    更新您的bootstrap-mgmt.sh脚本
    #!/usr/bin/env bash
    sudo adduser --system --home /home/ticker --shell /bin/bash --group --disabled-login --gecos "" ticker
    
    sudo mount -t vboxsf -o uid=`id -u ticker`,gid=`getent group ticker | cut -d: -f3` project /project
    sudo mount -t vboxsf -o uid=`id -u ticker`,gid=`id -g ticker` project /project
    
    1. 使用UID
    2. 您可以使用不会更改的UID和GID定义同步文件夹

        TICKER_UID = 106
        TICKER_GID = 111
        config.vm.synced_folder "project/", "/project",
            owner: TICKER_UID, group: TICKER_GID
      

      这是从github issue

      引用的

      旧答案

      你可以做点什么

      Vagrant.configure("2") do |config|
        config.vm.box = "debian/jessie64"
        config.vm.network "forwarded_port", guest: 80, host: 8080
        config.vm.network "forwarded_port", guest: 443, host: 8443
        # Putting provision here doesn't fix the problem
        # config.vm.provision :shell, path: "bootstrap-mgmt.sh"
        config.vm.define "web" do |web|
          web.vm.synced_folder "project/", "/srv/http/ticker",
            :owner => "ticker",
            :group => "ticker"
        end
      
        config.vm.provision :shell, path: "bootstrap-mgmt.sh"
      end
      

      根据配置顺序,外部范围将在内部范围之前运行。我没有测试,我知道它适用于配置,也适用于您的情况