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?
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.
É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 ...
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
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.
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.
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'