Es gibt einige Befehle, die nach der ersten Bereitstellung als normaler Benutzer ausgeführt werden müssen. Ich dachte, ich könnte dies mit einem separaten Shell-Skript und dem Befehl tun su --login -c <command> vagrant
, aber es ruft nicht den Pfad des Benutzers oder andere Umgebungseinstellungen von .bashrc ab.
z.B:
#!/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
Gibt es eine Möglichkeit, dies zu tun? Vielleicht muss es mit einem anderen Bereitstellungstool wie Puppet oder Chef gemacht werden? Ich habe darüber nachgedacht, ein anderes Shell-Skript zu erstellen, das das .bashrc
Quellcode erstellt, es mit einem: file-Provisioner in die Box kopiert und die Befehle so ausführt, aber es scheint eine Art Hack zu sein.
Was ist der richtige Weg, um dies zu tun?
su -p
werden Umgebungsvariablen erhalten - hilft das?Vagrant
Box mit Ruby - Installation, Add -Ruby
Tag und Anfügen Ruby - Installation auf Anfrage Titel Like this => ausführen Ruby - Installation Befehle als Benutzer während Vagrant ProvisioningAntworten:
Sie sollten dies mit dem Vagrant Shell-Provisioner tun können , z
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
Der Schlüssel ist anzugeben
privileged: false
, damit der Standardbenutzer verwendet wird und nichtroot
.quelle
Ich wollte eine Lösung für Situationen dokumentieren, in denen der Shell-Provisioner Befehle als Nicht-Root-Benutzer in einer Login-Shell ausführen muss :
Fügen Sie Ihre Bereitstellungsbefehle in ein Shell-Skript ein (z. B. '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
Dann in Ihrem Vagrantfile:
Vagrant.configure(2) do |config| $script = "/bin/bash --login /vagrant/bootstrap.sh" config.vm.provision :shell, privileged: false, inline: $script end
Sie sollten den
/vagrant/bootstrap.sh
Pfad durch den richtigen Pfad für Ihr Bereitstellungsskript innerhalb des Vagabundcomputers ersetzen .Ich habe diese Lösung speziell verwendet, um
rvm
Befehle während der Bereitstellung mit Vagrant zum Laufen zu bringen.quelle
Ich habe versucht, dass sowohl @jabclab- als auch @evanhsu- Antworten bei mir nicht funktionieren
So installieren
rbenv
und verwenden Sie es im Vagrant Provisioning-Prozess.Verwenden der nächsten Befehle vor der Verwendung von
rbenv
Befehlenexport PATH="$HOME/.rbenv/bin:$PATH" export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH" eval "$(rbenv init -)"
Bootstrap.sh-Datei
#!/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
Die
VagrantFile
Datei enthält dann eine vagabundierende Bereitstellungszeiledeploy_config.vm.provision :shell, privileged: false, path: "bootstrap.sh"
Quelle für meine Antwort von Gits von @creisor
Eine andere Möglichkeit,
rbenv
Befehle im Vagrant-Bereitstellungsprozess bei der Beantwortung dieser Frage zu verwendenquelle
Manchmal möchten Sie privilegierte Befehle und nicht privilegierte Befehle mischen. Wenn Ihre Situation dies erfordert, verwenden Sie runuser.
runuser -l vagrant -c 'command'
quelle