выполнять команды от имени пользователя после подготовки Vagrant

79

Есть некоторые команды, которые нужно запускать от имени обычного пользователя после первоначальной подготовки. Я думал, что могу сделать это, используя отдельный сценарий оболочки и команду 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сохранит переменные среды - это поможет?
Джош Джолли
@Vince Я думаю, что будет префектом к вашему вопросу упомянуть о Vagrantблоке сборки с установкой Ruby, добавить Rubyтег и добавить установку Ruby в заголовок вопроса Как это => выполнить команды установки Ruby как пользователь во время подготовки Vagrant
Ахмед

Ответы:

157

Вы должны иметь возможность сделать это с помощью инициатора 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.

jabclab
источник
10
Есть ли способ сделать это как пользователь, не являющийся пользователем по умолчанию?
Juno Woods
5

Я хотел задокументировать решение для ситуаций, когда поставщик оболочки должен запускать команды как пользователь без полномочий 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.

Evanhsu
источник
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"

Источник моего ответа от Gits от @creisor

Другой способ использования rbenvкоманд в процессе vagrant Provisioning в ответах на этот вопрос

Ахмед Хамди
источник
0

Иногда вы хотите смешивать привилегированные и непривилегированные команды. Если ваша ситуация требует этого, используйте runuser.

runuser -l vagrant -c 'command'

Крис Годвин
источник