web-dev-qa-db-ja.com

Vagrantプロビジョニング後にユーザーとしてコマンドを実行する

初期プロビジョニング後に通常のユーザーとして実行する必要があるコマンドがいくつかあります。別のシェルスクリプトとコマンド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などの別のプロビジョニングツールを使用して行う必要がありますか? .bashrcをソースとする別のシェルスクリプトを作成し、:fileプロビジョニングツールを使用してボックスにコピーし、そのようなコマンドを実行することを考えましたが、それは一種のハックのようです。

これを行う正しい方法は何ですか?

66
Vince

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

重要なのは、rootではなくデフォルトのユーザーを使用するようにprivileged: falseを指定することです。

135
jabclab

シェルプロビジョニングツールが非ルートユーザーとしてコマンドを実行する必要がある状況のソリューションを文書化することを望んでいましたログインシェルで

プロビジョニングコマンドをシェルスクリプト(たとえば、「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パスをプロビジョニングスクリプトの正しいパスで置き換える必要があります-vagrant machine内

このソリューションを使用して、Vagrantでのプロビジョニング中にrvmコマンドが機能するようにしました。

3
evanhsu

@ jabclab@ evanhs の両方を試しました

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ファイルには、Vagrant Provisioning Lineが含まれます

deploy_config.vm.provision :Shell, privileged: false, path: "bootstrap.sh"

Gits by @creisor からの回答のソース

この質問の回答 でのvagrantプロビジョニングプロセス内でrbenvコマンドを使用する別の方法

0
ahmed hamdy