web-dev-qa-db-fra.com

exécuter des commandes en tant qu'utilisateur après l'approvisionnement Vagrant

Certaines commandes doivent être exécutées en tant qu'utilisateur normal après l'approvisionnement initial. Je pensais pouvoir le faire en utilisant un script Shell séparé et la commande su --login -c <command> vagrant, mais il n'obtient pas le chemin de l'utilisateur ou d'autres paramètres d'environnement à partir de .bashrc.

par exemple.:

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

Y a-t-il un moyen de faire cela? Peut-être que cela doit être fait avec un autre outil d'approvisionnement comme Puppet ou Chef? J'ai pensé à créer un autre script Shell qui source le .bashrc, en le copiant dans la boîte en utilisant a: file provisioner et en exécutant les commandes comme ça, mais cela ressemble à un hack.

Quelle est la bonne façon de procéder?

66
Vince

Vous devriez pouvoir le faire en utilisant Vagrant Shell provisioner , par ex.

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 clé est de spécifier privileged: false pour qu'il utilise l'utilisateur par défaut et non root.

135
jabclab

Je voulais documenter une solution pour les situations où le provisionneur Shell doit exécuter des commandes en tant qu'utilisateur non root dans un shell de connexion:

Mettez vos commandes de provisioning dans un script Shell (par exemple '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

Puis dans votre Vagrantfile:

Vagrant.configure(2) do |config|

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

end

Vous devez remplacer le /vagrant/bootstrap.sh chemin avec le chemin correct pour votre script de provisioning à l'intérieur de la machine vagabonde.

J'ai utilisé cette solution spécifiquement pour que les commandes rvm fonctionnent pendant le provisioning avec Vagrant.

3
evanhsu

J'ai essayé Les réponses @ jabclab et @ evanhs ne fonctionnent pas avec moi

Pour installer rbenv et l'utiliser dans le processus Vagrant Provisioning.

Utilisation des commandes suivantes avant d'utiliser les commandes rbenv

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

Fichier 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

Ensuite, le fichier VagrantFile inclura une ligne de provisionnement vagabonde

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

Source pour ma réponse de Gits par @creisor

Une autre façon d'utiliser les commandes rbenv dans le processus de provisionnement vagabond à réponses à cette question

0
ahmed hamdy