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


79

初始配置后,必须以普通用户身份运行一些命令。我以为可以使用单独的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

有没有办法做到这一点?也许必须使用其他配置工具(例如Puppet或Chef)来完成?我曾想过创建另一个shell脚本来作为的来源.bashrc,然后使用:file Provisioner将其复制到框中并执行类似的命令,但这似乎有点像hack。

什么是正确的方法?


su -p将保留环境变量-这有帮助吗?
2014年

@Vince我认为,提一下有关Vagrant使用Ruby安装的构建框,添加Ruby标签并在问题标题上附加Ruby Installation这样的问题将是您的问题,就像这样=>在Vagrant设置期间以用户身份执行Ruby安装命令
ahmed hamdy

Answers:


155

您应该能够使用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

关键是要指定,privileged: false以便它将使用默认用户而不是默认用户root


10
有没有办法以非默认用户身份执行此操作?
朱诺·伍兹

5

我想为shell配置器必须在登录shell中以非root用户身份运行命令的情况提供解决方案:

将您的配置命令放入外壳脚本(例如“ 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

然后在您的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中用正确的配置脚本路径替换该路径。

我专门使用此解决方案来使rvm命令在与Vagrant一​​起配置时工作。


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"

来自@creisor的Gits我的答案来源

rbenv此问题的答案下,在流浪者置备过程中使用命令的另一种方法


0

有时您想混合使用特权命令和非特权命令。如果您的情况需要使用runuser。

runuser -l vagrant -c 'command'

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.