[DEPRECATED] This gem is no longer recommended or maintained. Use envbash-ruby instead, which works with Vagrant.
Vagrant envbash plugin
This is a Vagrant plugin to load environment
variables from env.bash. Putting settings in env.bash provides a single
source of development configuration for Vagrant (e.g. AWS secrets that shouldn't
be committed to source control) and the application under development. This is
especially important for web apps that adhere to the
twelve-factor methodology.
This plugin was inspired by vagrant-env
with the primary difference that env.bash is a proper Bash script that will be
executed by /bin/bash, so it can contain conditionals, multi-line strings,
etc. This also makes it easier to source into the shell in the Vagrant guest as
application configuration.
This plugin also adds a command vagrant env to inspect how env.bash modifies
the environment.
Installation
Install using Vagrant's plugin system:
vagrant plugin install vagrant-envbash
Usage
With the plugin installed, Vagrant will look for env.bash in the same
directory as Vagrantfile. If found, Vagrant will execute the file as a Bash
script. Any environment variables that are exported in the file will be updated
in ENV. Additionally any variables that are unset will be removed from ENV.
The plugin runs very early in the Vagrant execution, so ENV is fully updated
before executing configuration in Vagrantfile. This means that env.bash is
the ideal place to put development configuration such as AWS secrets for
vagrant-aws that shouldn't be
committed to source control in Vagrantfile.
Examples
Example of AWS secrets in env.bash
With this Vagrantfile:
Vagrant.configure("2") do |config|
config.vm.provider :aws do |aws, override|
override.vm.box = "dummy"
aws.access_key_id = ENV['AWS_ACCESS_KEY_ID']
aws.secret_access_key = ENV['AWS_SECRET_ACCESS_KEY']
aws.keypair_name = ENV['AWS_KEYPAIR_NAME']
aws.ami = ENV.fetch('AWS_AMI', "ami-7747d01e")
end
end
then the secrets can be put into env.bash:
export AWS_ACCESS_KEY_ID=xxxxxxxxxxxx
export AWS_SECRET_ACCESS_KEY=yyyyyyyyyyyyyyyyyy
export AWS_KEYPAIR_NAME=email@example.com
Additionally if the Vagrantfile has multiple provider configuration stanzas to
enable a large developer organization, then the developer can choose their
preferred provider on a per-project basis by setting VAGRANT_DEFAULT_PROVIDER
in env.bash:
export VAGRANT_DEFAULT_PROVIDER=aws
Trivial example of vagrant env
With this initial environment configuration:
$ export W=unmodified
$ export X=unmodified
$ # Y is not set
$ export Z=unmodified
And this env.bash:
export W=unmodified
export X=modified
export Y=added
unset Z # remove from ENV
Then we can run vagrant env to see what happens:
$ vagrant env
CHANGED the following variables:
X="modified" (was: "unmodified")
ADDED the following variables:
Y="added"
REMOVED the following variables:
Z="unmodified"
FAQ
Should I commit env.bash to source control?
No, definitely not. The purpose of env.bash is to store development
configuration that isn't suitable for committing to the repository, whether
that's secret keys or developer-specific customizations. In fact, you should add
the following line to .gitignore:
/env.bash
Is it necessary to explicitly export variables in env.bash?
Yes. If you have a lot of settings and want to avoid repeating export, you can
put set -a at the top of your env.bash to automatically export all
variables. In that case, you should also set +a at the bottom to avoid
confusion if you source env.bash into your guest shell configuration.
How do I put a multi-line string into env.bash?
You can put newlines directly into a multi-line string in Bash, so for example this works:
export PRIVATE_KEY="
-----BEGIN RSA PRIVATE KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END RSA PRIVATE KEY-----"
Can I remove settings from the environment?
Yes, anything you unset will be removed from ENV. See the example of
vagrant env above.
How do I source env.bash into my guest shell environment?
Assuming that your source directory is available on the default /vagrant mount
point in the guest, you can simply add a line at the bottom of
/home/vagrant/.bash_profile:
source /vagrant/env.bash
Note that this means that settings are loaded on vagrant ssh so you need to
exit the shell and rerun vagrant ssh to refresh if you change settings.