在Vagrant配置后以用户身份执行命令

Vin*_*nce 70 shell vagrant

在初始配置之后,有些命令必须作为普通用户运行.我以为我可以使用单独的shell脚本和命令来执行此操作su --login -c <command> vagrant,但它不会从.bashrc获取用户的路径或其他环境设置.

例如:

#!/usr/bin/env bash
su --login -c "rbenv install 2.0.0-p353" vagrant
su --login -c "rbenv global 2.0.0-p353" vagrant
su --login -c "gem update --system" vagrant
su --login -c "yes | gem update" vagrant
su --login -c "gem install rdoc" vagrant
su --login -c "gem install rails pg" vagrant
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?也许必须使用另一个配置工具,如Puppet或Chef?我想过创建另一个shell脚本来源.bashrc,使用:file provisioner将它复制到盒子并执行这样的命令,但它看起来有点像黑客.

这样做的正确方法是什么?

jab*_*lab 140

您应该能够使用Vagrant Shell配置程序执行此操作,例如

Vagrant.configure("2") do |config|
  $script = <<-SCRIPT
  rbenv install 2.0.0-p353
  rbenv global 2.0.0-p353
  gem update --system
  yes | gem update
  gem install rdoc
  gem install rails pg
  SCRIPT

  config.vm.provision "shell", inline: $script, privileged: false
end
Run Code Online (Sandbox Code Playgroud)

关键是指定privileged: false它将使用默认用户而不是root.

  • 有没有办法像非默认用户那样做? (8认同)
  • 这次真是万分感谢.今天这让我困扰了一段时间; 我想这就是我没有阅读文档=) (4认同)

小智 6

我想为 shell 配置程序必须以非 root 用户身份在登录 shell 中运行命令的情况记录一个解决方案:

将您的配置命令放入 shell 脚本(例如“bootstrap.sh”):

#! /bin/bash

rbenv install 2.0.0-p353
rbenv global 2.0.0-p353
gem update --system
yes | gem update
gem install rdoc
gem install rails pg
Run Code Online (Sandbox Code Playgroud)

然后在你的 Vagrantfile 中:

Vagrant.configure(2) do |config|

  $script = "/bin/bash --login /vagrant/bootstrap.sh"
  config.vm.provision :shell, privileged: false, inline: $script

end
Run Code Online (Sandbox Code Playgroud)

您应该将/vagrant/bootstrap.sh路径替换为vagrant 机器内配置脚本的正确路径。

我专门使用此解决方案rvm来在使用 Vagrant 进行配置时使命令起作用。