Créer une variable d'environnement linux à l'aide de Vagrant provisioner

J'ai vagrant exécutant Ubuntu à des fins de développement. J'ai utilisé un provisioner de script shell pour télécharger / installer mes dépendances et créer des alias, mais j'ai frappé un mur en termes d'utilisation du provisioner pour créer des variables d'environnement (qui sont utilisées pour plusieurs drapeaux dans mon projet). À l'origine, j'avais quelque chose comme:

export MY_VAR='value'

Dans mon script provisioner, mais a ensuite découvert que vous ne pouvez pas ajouter des variables d'environnement à partir d'un script shell en l'exécutant normalement. Assez juste, j'ai donc essayé de changer ma ligne de Vagrantfile en:

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

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

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

Pas de chance. Toujours pas d'environnement mondial quand je suis arrivé. Existe-t-il un moyen d'utiliser le script shell pour définir une variable d'environnement bash, ou est-il temps de jeter l'éponge sur les provisionneurs shell et d'apprendre chef?

28
demandé sur Community 2014-07-12 03:18:39

5 réponses

Vous devriez avoir le script de provisionnement ajouter une ligne à votre .profil:

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

Lors de la connexion, la .script de profil sera lu par bash et la variable sera réglé.

31
répondu rje 2014-07-11 23:28:30

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

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

Répartition:

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

Mettre tout cela ensemble:

J'utilise normalement puphpet pour mes boîtes vagabondes, donc j'ai tendance à coller à la structure de répertoire qu'il utilise, ce qui signifie mettre mon script de provisionnement dans puphpet/shell/* (par rapport au fichier Vagrantfile). Dans ce fichier, vous pouvez ajouter autant de variables d'environnement que vous aimez:

#!/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 voulez définir les variables d'environnement à une valeur spécifique, même si elles sont définies, vous pouvez remplacer [ -z "$VAR" ] par ceci (comme l'a suggéré Maks3w):

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

Ensuite, ajoutez simplement ceci à votre fichier Vagrantfile:

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

, ce Qui devrait faire l'affaire...

16
répondu Elias Van Ootegem 2016-05-25 10:06:20

Cette réponse montre comment ajouter des variables d'environnement en modifiant simplement VagrantFile en utilisant la syntaxe Ruby HEREDOC (ici 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: La fermeture SCRIPT doit être le premier caractère de sa propre ligne de

5
répondu Maks3w 2015-03-04 14:33:01

Voici comment j'ai fait fonctionner $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 $HOME (au lieu de ~) étaient nécessaires---je ne pouvais pas le faire fonctionner autrement.

4
répondu rubicks 2015-06-05 20:24:23

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

Enfin, je suis venu avec 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 deuxième variable

, Car de exécution: "toujours" je peux Ajouter / Supprimer des variables et après vagrant reload elles sont appliquées.

0
répondu starikovs 2016-07-25 07:53:04