Führen Sie nach der Vagrant-Bereitstellung Befehle als Benutzer aus

79

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 .bashrcQuellcode 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?

Vince
quelle
su -pwerden Umgebungsvariablen erhalten - hilft das?
Josh Jolly
@Vince ich denke , es Präfekt auf Ihre Frage sein wird , um zu bauen zu erwähnen VagrantBox mit Ruby - Installation, Add - RubyTag und Anfügen Ruby - Installation auf Anfrage Titel Like this => ausführen Ruby - Installation Befehle als Benutzer während Vagrant Provisioning
ahmed hamdy

Antworten:

155

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 nicht root.

jabclab
quelle
10
Gibt es eine Möglichkeit, dies als nicht standardmäßiger Benutzer zu tun?
Juno Woods
5

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.shPfad durch den richtigen Pfad für Ihr Bereitstellungsskript innerhalb des Vagabundcomputers ersetzen .

Ich habe diese Lösung speziell verwendet, um rvmBefehle während der Bereitstellung mit Vagrant zum Laufen zu bringen.

evanhsu
quelle
0

Ich habe versucht, dass sowohl @jabclab- als auch @evanhsu- Antworten bei mir nicht funktionieren

So installieren rbenvund verwenden Sie es im Vagrant Provisioning-Prozess.

Verwenden der nächsten Befehle vor der Verwendung von rbenvBefehlen

export 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 VagrantFileDatei enthält dann eine vagabundierende Bereitstellungszeile

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

Quelle für meine Antwort von Gits von @creisor

Eine andere Möglichkeit, rbenvBefehle im Vagrant-Bereitstellungsprozess bei der Beantwortung dieser Frage zu verwenden

ahmed hamdy
quelle
0

Manchmal möchten Sie privilegierte Befehle und nicht privilegierte Befehle mischen. Wenn Ihre Situation dies erfordert, verwenden Sie runuser.

runuser -l vagrant -c 'command'

Chris Godwin
quelle