Il semblerait que transmettre des variables d'environnement lors de l'appel de vagrant up
est simple si vous utilisez un provisioner Ruby:
VAR=123 vagrant up
Dans le fichier Vagrant:
ENV['VAR']
Comment est-ce que je fais ceci avec le provisioner :Shell
? Cela ne semble pas fonctionner:
$VAR
Ce n'est pas l'idéal, mais je dois travailler pour le moment:
config.vm.provision "Shell" do |s|
s.inline = "VAR1 is $1 and VAR2 is $2"
s.args = "#{ENV['VAR1']} #{ENV['VAR2']}"
end
Depuis Vagrant 1.8.0 vous pouvez oublier les horribles bidouilles des autres réponses ici. Utilisez simplement l'option env
pour le fournisseur de shell ( docs ).
Utilisez-le comme ceci dans votre Vagrantfile:
config.vm.provision "Shell", path: "provisionscript.sh", env: {"MYVAR" => "value"}
Cela définira l'environnement pour le script d'approvisionnement uniquement. Si vous avez besoin d'un ensemble de variables d'environnement persistant pour tous les processus de la machine virtuelle, le provisioning Vagrant est hors de portée et regardez ici: Les variables d'environnement shell dans les fichiers vagants sont uniquement transmises en premier .
Je suis venu avec cette solution pour le provisioning basé sur CentOS: plaçant toutes mes variables d’environnement requises dans un fichier /etc/profile.d/vagrant.sh
, puis il est accessible dans n’importe quel script de provision.
en bref:
$before_script = <<SCRIPT
echo # vagrant profile script > /etc/profile.d/vagrant.sh
echo export ENV_VAR1=foo.com/bar >> /etc/profile.d/vagrant.sh
echo export ENV_VAR2=bar.com/foo >> /etc/profile.d/vagrant.sh
chmod +x /etc/profile.d/vagrant.sh
SCRIPT
$after_script = <<SCRIPT
rm -rf /etc/profile.d/vagrant.sh
SCRIPT
config.vm.provision "Shell", inline: $before_script
config.vm.provision "Shell", path: "build.sh"
config.vm.provision "Shell", inline: $after_script
Vous trouverez ici Vagrantfile
complet https://Gist.github.com/bivas/6192d6e422f8ff87c29d
Pour la postérité (c'est-à-dire si je la recherche à nouveau sur Google) ... Il est possible de transmettre des paires clé-valeur via env :
box.vm.provision :Shell do |s|
s.env = {AWS_ACCESS_KEY:ENV['AWS_ACCESS_KEY'], AWS_SECRET_KEY:ENV['AWS_SECRET_KEY']}
s.path = 'scripts/bootstrap.sh'
end
Ensuite, référencez-les dans votre script:
export AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY}
export AWS_SECRET_ACCESS_KEY=${AWS_SECRET_KEY}
Bonus:
Vagrant gérera les guillemets pour les valeurs de variables d’environnement, mais le les touches restent intactes
Si quelqu'un finissait par chercher comment définir des variables dans l'environnement du script d'approvisionnement, cela fonctionnait pour moi.
config.vm.provision :Shell, :inline => <<-SH
export GRAPHITE_Host=192.168.33.10
/vagrant/install_app_with_monitoring.sh
SH
Notez que cela suppose que vous partagez votre répertoire de travail sous la forme /vagrant
sur le VM, mais il devrait s'agir du répertoire par défaut.
Vous pouvez utiliser #{ENV['VAR']}
dans un script en ligne, par exemple:
config.vm.provision "Shell", inline: <<-END
...
# Install my dotfiles are there. If you're in a hurry you can do
# SKIP_DOTFILES=1 vagrant up
if ! [ -d /home/vagrant/dotfiles ] && [ -z '#{ENV['SKIP_DOTFILES']}']; then
if ! [ -x /usr/bin/git ]; then
DEBIAN_FRONTEND=noninteractive apt-get install -y git
fi
su - vagrant -c 'git clone https://github.com/mgedmin/dotfiles'
su - vagrant -c 'dotfiles/install.sh'
fi
...
END
Exemple tiré d'un fichier Vagrant actif.
Cela a quelques inconvénients: si $ VAR contient des guillemets simples, les choses vont se casser.
La plupart de ces réponses semblent être dépassées. Avec Vagrant 2.1.1, cela a fonctionné pour moi:
VAGRANTFILE_API_VERSION = "2" //...
machine.vm.provision "Shell",
env: {
"ELASTIC_XMS" => servers["elastic"]["memory_xms"],
"ELASTIC_XMX" => servers["elastic"]["memory_xmx"]
},
inline: "sed -i -e \"s/-Xms.*/$ELASTIC_XMS/g\" /etc/elasticsearch/jvm.options"
Le vagrant-env plugin fait exactement cela. Avec cela, vous pouvez ajouter des variables d’environnement au fichier .env
du répertoire local qui sera chargé dans le fichier Vagrant
. Je suggère de garder .env
dans votre .gitignore
, afin que votre vie privée soit garantie.
Vous pouvez simplement spécifier pour Shell
en utilisant inline
dans votre fichier Vagrantfile
:
config.vm.provision "Shell", inline: %Q(/usr/bin/env FOO=1 BAR=1 bash /path/to/script.sh)
Ou chargez des variables supplémentaires à partir du fichier YAML:
require 'yaml'
dir = File.dirname(File.expand_path(__FILE__))
vconfig = YAML::load_file("#{dir}/config.yml")
config.vm.provision "Shell", inline: %Q(/usr/bin/env FOO=#{vconfig['foo']} bash /path/to/script.sh)
Vous pouvez également implémenter certains arguments facultatifs à partir de la ligne de commande, par exemple:
# Parse optional arguments.
opts = GetoptLong.new(
[ '--foo', GetoptLong::OPTIONAL_ARGUMENT ], # With optional parameter.
[ '--bar', GetoptLong::OPTIONAL_ARGUMENT ], # With optional parameter.files.
)
opts.each do |opt, arg|
case opt
when '--foo'
foo==arg
when '--bar'
bar=arg
end
end
puis utilisez: opt['--foo'].to_s
.
Voir aussi: Comment passer le paramètre sur Vagrant et le placer dans le champ du livre de recettes Chef?
Voici comment je le fais fonctionner.
Je suis passé de la méthode du proviseur de marionnettes vagabond à celui du ravitailleur Shell. Je l'ai fait principalement parce que je voulais que marionnette ne s'exécute pas en tant que root. Le fournisseur Shell vous donne: privileged => false.
Ma vieille manière:
config.vm.provision :puppet do |puppet|
puppet.module_path = ENV.fetch('MODULES_PATH', 'modules')
puppet.manifests_path = ENV.fetch('MANIFESTS_PATH', 'manifests')
puppet.manifest_file = ENV.fetch('MANIFEST_FILE', 'site.pp')
puppet.options = "--debug"
end
MON NOUVEAU CHEMIN:
config.vm.provision :Shell, :privileged => false do |Shell|
Shell.inline = "puppet apply --debug --modulepath '/vagrant/#{ENV.fetch('MODULES_PATH', 'modules')}' --detailed-exitcodes '/vagrant/#{ENV.fetch('MANIFESTS_PATH', 'manifests')}/#{ENV.fetch('MANIFEST_FILE', 'site.pp')}'"
end