Есть некоторые команды, которые нужно запускать от имени обычного пользователя после первоначальной подготовки. Я думал, что могу сделать это, используя отдельный сценарий оболочки и команду 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 и выполняя подобные команды, но это похоже на взлом.
Как правильно это сделать?
su -p
сохранит переменные среды - это поможет?Vagrant
блоке сборки с установкой Ruby, добавитьRuby
тег и добавить установку Ruby в заголовок вопроса Как это => выполнить команды установки Ruby как пользователь во время подготовки VagrantОтветы:
Вы должны иметь возможность сделать это с помощью инициатора 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
.источник
Я хотел задокументировать решение для ситуаций, когда поставщик оболочки должен запускать команды как пользователь без полномочий 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.источник
Я пробовал Оба ответа @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 Provisioning в ответах на этот вопросисточник
Иногда вы хотите смешивать привилегированные и непривилегированные команды. Если ваша ситуация требует этого, используйте runuser.
runuser -l vagrant -c 'command'
источник