在流浪者配置之后以用户身份执行命令

在初始配置之后,有些命令必须作为普通用户运行。我认为我可以使用一个单独的 shell 脚本和命令 su --login -c <command> vagrant来完成这项工作,但是它无法从中获取用户的路径或其他环境设置。巴希尔。

例如:

#!/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 供应器将其复制到框中,并执行类似的命令,但这看起来有点像黑客技术。

怎么做才是正确的?

40085 次浏览

你应该能够做到这一点使用 流浪弹药供应商,例如。

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

我想为 shell 提供程序必须作为非根用户 在登录 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

然后在你的流浪汉档案里:

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 供应时能够正常工作。

我试了 @ jabclab@ evanhsu的答案都不适合我

安装 rbenv并在流浪者配置过程中使用它。

在使用 rbenv命令之前使用下一个命令

export PATH="$HOME/.rbenv/bin:$PATH"
export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"
eval "$(rbenv init -)"

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

这个问题的答案的流浪供应过程中使用 rbenv命令的另一种方法

有时候你想混合使用特权命令和非特权命令。如果你的情况需要这样做,使用 runuser。

runuser -l vagrant -c 'command'