wykonywać polecenia jako użytkownik po udostępnieniu Vagrant

79

Niektóre polecenia muszą zostać uruchomione jako zwykły użytkownik po początkowym udostępnieniu. Pomyślałem, że mógłbym to zrobić używając oddzielnego skryptu powłoki i polecenia su --login -c <command> vagrant, ale nie uzyskuje to ścieżki użytkownika ani innych ustawień środowiska z .bashrc.

na przykład:

#!/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

Czy jest na to sposób? Może trzeba to zrobić za pomocą innego narzędzia do obsługi administracyjnej, takiego jak Puppet lub Chef? Myślałem o stworzeniu kolejnego skryptu powłoki, który pozyskuje .bashrcplik, skopiowaniu go do skrzynki za pomocą: file Provisioner i wykonaniu takich poleceń, ale wygląda to na coś w rodzaju włamania.

Jaki jest właściwy sposób, aby to zrobić?

Vince
źródło
su -pzachowa zmienne środowiskowe - czy to pomoże?
Josh Jolly,
@Vince, myślę, że najlepiej będzie odpowiedzieć na twoje pytanie, jeśli wspomnisz o Vagrantskrzynce kompilacji z instalacją Rubiego, dodasz Rubyznacznik i dołączysz instalację Rubiego do tytułu pytania W ten sposób => wykonaj polecenia instalacyjne Rubiego jako użytkownik podczas udostępniania Vagrant
ahmed hamdy

Odpowiedzi:

157

Powinieneś być w stanie to zrobić za pomocą narzędzia Vagrant Shell , np

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

Kluczem jest określenie, privileged: falseaby używał domyślnego użytkownika, a nie root.

jabclab
źródło
10
Czy istnieje sposób, aby to zrobić jako użytkownik inny niż domyślny?
Juno Woods
5

Chciałem udokumentować rozwiązanie dla sytuacji, w których dostawca powłoki musi uruchamiać polecenia jako użytkownik inny niż root w powłoce logowania :

Umieść swoje polecenia obsługi administracyjnej w skrypcie powłoki (np. „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

Następnie w swoim pliku 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Ścieżkę należy zastąpić poprawną ścieżką do skryptu obsługi administracyjnej wewnątrz maszyny włóczącej się .

Użyłem tego rozwiązania specjalnie po to, aby rvmpolecenia działały podczas udostępniania z Vagrantem.

evanhsu
źródło
0

Próbowałem zarówno @jabclab i @evanhsu nie działają ze mną

Żeby zainstalować rbenv i używać go w ramach procesu Vagrant Provisioning.

Używanie następnych poleceń przed użyciem rbenvpoleceń

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

Plik 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

Następnie VagrantFileplik będzie zawierał linię zaopatrzenia wędrownego

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

Źródło mojej odpowiedzi od Gits autorstwa @creisor

Kolejny sposób na użycie rbenvpoleceń w procesie udostępniania włóczęgów w odpowiedzi na to pytanie

ahmed hamdy
źródło
0

Czasami chcesz mieszać polecenia uprzywilejowane i nieuprzywilejowane. Jeśli twoja sytuacja wymaga tego, użyj runuser.

runuser -l vagrant -c 'command'

Chris Godwin
źródło