ejecutar comandos como usuario después del aprovisionamiento de Vagrant

79

Hay algunos comandos que deben ejecutarse como un usuario normal después del aprovisionamiento inicial. Pensé que podría hacer esto usando un script de shell separado y el comando su --login -c <command> vagrant, pero no obtiene la ruta del usuario u otras configuraciones del entorno de .bashrc.

p.ej:

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

¿Hay alguna forma de hacer esto? ¿Quizás deba hacerse con otra herramienta de aprovisionamiento como Puppet o Chef? He pensado en crear otro script de shell que obtenga el .bashrccódigo, copiarlo en la caja usando un: aprovisionador de archivos y ejecutar los comandos de esa manera, pero parece una especie de truco.

¿Cuál es la forma correcta de hacer esto?

Vince
fuente
su -ppreservará las variables de entorno, ¿esto ayuda?
Josh Jolly
@Vince Creo que va a ser prefecto a su pregunta mencionar sobre la acumulación Vagrantcaja con la instalación de Ruby, añadir Rubyetiquetas y añadir la instalación de Ruby en el título de pregunta como esta => ejecutar comandos de instalación de Ruby como usuario durante el aprovisionamiento de Vagrant
Ahmed Hamdy

Respuestas:

157

Debería poder hacer esto utilizando el aprovisionador Vagrant Shell , p. Ej.

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

La clave es especificar privileged: falsepara que use el usuario predeterminado y no root.

jabclab
fuente
10
¿Hay alguna forma de hacer esto como usuario no predeterminado?
Juno Woods
5

Quería documentar una solución para situaciones en las que el aprovisionador de shell debe ejecutar comandos como un usuario no root en un shell de inicio de sesión :

Coloque sus comandos de aprovisionamiento en un script de shell (por ejemplo, '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

Luego, en su Vagrantfile:

Vagrant.configure(2) do |config|

  $script = "/bin/bash --login /vagrant/bootstrap.sh"
  config.vm.provision :shell, privileged: false, inline: $script

end

Debe reemplazar la /vagrant/bootstrap.shruta con la ruta correcta para su script de aprovisionamiento dentro de la máquina vagabunda .

He usado esta solución específicamente para que los rvmcomandos funcionen mientras aprovisionaba con Vagrant.

Evanhsu
fuente
0

He intentado tanto @jabclab y @evanhsu no respuestas trabajar conmigo

Para instalarlo rbenvy usarlo dentro del proceso de Vagrant Provisioning.

Uso de comandos siguientes antes de usar rbenvcomandos

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

Archivo 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

Entonces el VagrantFilearchivo incluirá la línea de aprovisionamiento de vagabundos

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

Fuente de mi respuesta de Gits por @creisor

Otra forma de usar rbenvcomandos dentro del proceso de aprovisionamiento vagabundo en las respuestas de esta pregunta

ahmed hamdy
fuente
0

A veces desea mezclar comandos con privilegios y comandos sin privilegios. Si su situación lo requiere, utilice runuser.

runuser -l vagrant -c 'command'

Chris Godwin
fuente