web-dev-qa-db-fra.com

Créer une variable d'environnement Linux à l'aide du provisioner de vagabond

Ubuntu est vagabond à des fins de développement. J'ai utilisé un fournisseur de scripts Shell pour télécharger/installer mes dépendances et créer des alias, mais je me suis heurté à un mur en termes d'utilisation du fournisseur pour créer des variables d'environnement (qui sont utilisées pour plusieurs indicateurs dans mon projet). À l'origine, j'avais quelque chose comme:

export MY_VAR='value'

Dans mon script d'approvisionnement, mais j'ai ensuite découvert que vous ne pouvez pas ajouter de variables d'environnement à partir d'un script Shell en l'exécutant normalement. Très bien, j'ai donc essayé de changer ma ligne de Vagrantfile en:

config.vm.provision "Shell", inline: “source setup.sh"

Ce qui n'a pas résolu le problème. Les variables d'environnement n'étaient toujours pas présentes. J'ai essayé d'ajouter les exportations directement en ligne:

config.vm.provision "Shell", inline: “export MY_VAR='value'"

Pas de chance. N'y a-t-il toujours pas d'environnement global dans lequel je me trouve? Existe-t-il un moyen d'utiliser le script Shell pour définir une variable d'environnement bash ou faut-il jeter un œil aux approvisionneurs Shell et apprendre le chef?

29
MBrizzle

Le script de provisionnement doit ajouter une ligne à votre fichier .profile:

echo "export VAR=value" >> ~/.profile

Lors de la connexion, le script .profile sera lu par bash et la variable sera définie.

32
rje

Étant donné que la réponse acceptée ajoute effectivement un export VAR=value à votre fichier .profile (ou .bashrc) chaque fois que vous exécutez vagrant provision, voici comment j'ai rapidement ajouté des variables d'environnement

source ~/.profile && [ -z "$VAR" ] && echo "export VAR=value" >> ~/.profile

Panne:

  • source ~/.profile: charge le fichier .profile actuel
  • [ -z "$VAR"]: vérifie si VAR est défini ou non, sinon:
  • echo "export VAR=value" >> ~/.profile: ajoute la ligne d'exportation à .profile

Mettre tous ensemble:

J'utilise normalement puphpet pour mes boîtes vagabondes, j'ai donc tendance à m'en tenir à la structure de répertoires qu'il utilise, ce qui signifie que je place mon script d'approvisionnement dans puphpet/Shell/* (par rapport au fichier Vagrantfile). Dans ce fichier, vous pouvez ajouter autant de variables d'environnement que vous le souhaitez:

#!/usr/bin/env bash
#Replace .profile with .bashrc if required
source ~/.profile
if [ -z "$VAR" ]; then # only checks if VAR is set, regardless of its value
    echo "export VAR=value" >> ~/.profile
fi
#other env variables and profile stuff here

Si vous souhaitez définir les variables d'environnement sur une valeur spécifique, même si elles sont définies, vous pouvez remplacer [ -z "$VAR" ] par ceci (comme suggéré par Maks3w):

if [ -z "$VAR" ] || [ "$VAR" != "value" ]; then
    #same as before
fi

Ensuite, ajoutez simplement ceci à votre Vagrantfile:

config.vm.provision "Shell", path: "puphpet/Shell/your-script.sh"

Cela devrait faire l'affaire ...

17

Cette réponse montre comment ajouter des variables d'environnement en modifiant simplement VagrantFile à l'aide de la syntaxe Ruby HEREDOC (Here doc)

  $install_user_vars = <<SCRIPT
    source ~/.profile

    if [ -z "$VAR" ] || [ "$VAR" != "value" ]; then
      echo "export VAR=value" >> ~/.profile
    fi

    if [ $(pwd) != "/vagrant" ]; then
      echo "cd /vagrant" >> ~/.profile
    fi

SCRIPT

  config.vm.provision "Shell", inline: $install_user_vars

Remarque: le SCRIPT proche doit être le premier caractère de sa propre ligne

5
Maks3w

Voici comment j'ai obtenu $GOPATH:

config.vm.provision "Shell", inline: <<-Shell
  echo -n                              >  /etc/profile.d/gopath.sh
  echo 'export GOPATH=$HOME/go'        >> /etc/profile.d/gopath.sh
  echo 'export PATH=$PATH:$GOPATH/bin' >> /etc/profile.d/gopath.sh
Shell

L'utilisation de guillemets simples et de $HOME (au lieu de ~) était nécessaire - je ne pouvais pas le faire fonctionner autrement.

4
rubicks

Je cherchais la même chose. Je voulais définir les variables d'environnement http(s)_proxy dans Vagrantfile. L’exigence était que je puisse modifier ces variables à tout moment et vagrant reload pour les appliquer. 

Finalement, j'ai trouvé la solution:

config.vm.provision "Shell", inline: "> /etc/profile.d/myvars.sh", run: "always"
config.vm.provision "Shell", inline: "echo \"export http_proxy=http://proxy.somedomain.com:3128\" >> /etc/profile.d/myvars.sh", run: "always"
config.vm.provision "Shell", inline: "echo \"export https_proxy=https://proxy.somedomain.com:3128\" >> /etc/profile.d/myvars.sh", run: "always"

0) Les scripts /etc/profile.d/*.sh sont exécutés au démarrage du shell bash
1) supprime tout de myvars.sh
2) définit la première variable
3) définit la seconde variable 

A cause de run: "toujours" je peux ajouter/supprimer des variables et après vagrant reload elles sont appliquées.

0
starikovs

Dans CentOs7, vous devez placer env vars sous /etc/profile.d/ Cela a fonctionné dans mon cas:

machine.vm.provision 'Shell',
  inline: 'Sudo su - && echo "export VAR1=test export VAR2=test" > /etc/profile.d/vars.sh'
0
hoisu