Выполнять команды в качестве пользователя после предоставления Vagrant
Есть несколько команд, которые должны выполняться как обычный пользователь после первоначальной инициализации. Я думал, что могу сделать это, используя отдельную оболочку script и команду 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? Я подумал о создании еще одной оболочки script, которая отправляет .bashrc
, копируя ее в поле, используя средство обеспечения файла: и выполнение таких команд, но похоже вроде хака.
Каков правильный способ сделать это?
Ответы
Ответ 1
Вы должны сделать это, используя Vagrant Shell Provender, например
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
.
Ответ 2
Я хотел задокументировать решение для ситуаций, когда поставщик оболочки должен запускать команды в качестве пользователя без полномочий 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.
Ответ 3
Я пытался ответить, что @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 от @creisor
Другой способ использования команд rbenv
в процессе предоставления vagrant на ответах на этот вопрос