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?
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é.
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 siVAR
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...
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
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.
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.