在初始配置后,有些命令必须以普通用户身份运行。我以为我可以使用单独的shell脚本和命令su --login -c <command> vagrant
来做到这一点,但是它没有从.bashrc获取用户的路径或其他环境设置。
e.g:
#!/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
有办法做到这一点吗?也许必须使用另一个配置工具,如Puppet或Chef?我想过创建另一个shell脚本来源.bashrc
,使用:file provisioner将它复制到盒子中并执行类似的命令,但它看起来有点像黑客。
这样做的正确方法是什么?
答案 0 :(得分:131)
您应该可以使用Vagrant Shell provisioner执行此操作,例如
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
关键是要指定privileged: false
,以便它将使用默认用户,而不是root
。
答案 1 :(得分:2)
我想记录一个解决方案,以解决shell配置程序必须以登录shell中的非root用户运行命令的方式:
将您的配置命令放入shell脚本(例如&#39; bootstrap.sh&#39;):
#! /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
然后在你的Vagrantfile中:
Vagrant.configure(2) do |config|
$script = "/bin/bash --login /vagrant/bootstrap.sh"
config.vm.provision :shell, privileged: false, inline: $script
end
您应该使用错误机器内的配置脚本的正确路径替换/vagrant/bootstrap.sh
路径。
我使用此解决方案专门用于在使用Vagrant配置时使rvm
命令正常工作。
答案 2 :(得分:0)
我尝试了@jabclab和@evanhsu这两个答案都不适合我
要安装rbenv
并在Vagrant Provisioning流程中使用它。
在使用rbenv
命令之前使用下一步命令
export PATH="$HOME/.rbenv/bin:$PATH"
export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"
eval "$(rbenv init -)"
Bootstrap.sh文件
#!/usr/bin/env bash
sudo apt-get update
echo "========================= install dependencies for install rbenv ==========================="
sudo apt-get install -y autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev
echo "========================= install rbenv =========================================="
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
echo "========================= install ruby build plugin for rbenv ======================="
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
echo "========================= install ruby v2.5.0 =========================================="
export PATH="$HOME/.rbenv/bin:$PATH"
export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"
eval "$(rbenv init -)"
rbenv install 2.5.0
rbenv global 2.5.0
ruby -v
gem -v
echo "========================= install bundler dependencies manager for ruby ====================="
gem install bundler
rbenv rehash
然后,VagrantFile
文件将包含流浪者配置行
deploy_config.vm.provision :shell, privileged: false, path: "bootstrap.sh"
Gits by @creisor的答案来源
在answers of this question的无用人员配置过程中使用rbenv
命令的另一种方法
答案 3 :(得分:0)
有时您想混合使用特权命令和非特权命令。如果您的情况需要使用runuser。
runuser -l vagrant -c 'command'