如何更改 Vagrant sync_folder 的所有者?

How to change owner of Vagrant sync_folder?

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

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

这是创建代码用户的 bootstrap 配置脚本:

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

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

我读过一个 vagrant-bindfs 插件,它允许您更改 NFS 挂载文件系统的所有者和组,但我不知道如果它得到 运行 在我的配置脚本之前。

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

我知道我可以将 "vagrant:vagrant" 保留为我网站所在的已挂载文件系统的 owner:group,但我希望它归 ticker 用户所有,这样它就可以准确类似于我的生产服务器。

有没有其他方法可以将我的 Vagrant synced_folder 的所有者从 vagrant 用户更改为 my ticker 用户?如果这不可能,其他人 运行 遇到这种情况时会怎么做?

谢谢。

看起来,以下 2 种可能会起作用

  1. 从脚本装载

更新您的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

您可以定义同步文件夹的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

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