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

时间:2014-03-20 23:53:39

标签: shell vagrant

在初始配置后,有些命令必须以普通用户身份运行。我以为我可以使用单独的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将它复制到盒子中并执行类似的命令,但它看起来有点像黑客。

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

4 个答案:

答案 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'