我在Ubuntu上安装了带有Vagrant 1.7 的ruby 2.1.5
我跑了:
~$ vagrant plugin install vagrant-env
如gosuri/流浪者env中所述。
我还应该提到,现在只有当我添加时,这才有效
require 'dotenv'
Dotenv.load
文档(README)没有指定将其实现到Vagrantfile中。如果我忽略了这一点,那么我会得到一个错误,说这行带有:
config.env.enable
是未知的配置节。
我的.env文件与Vagrantfile位于同一目录中。无论我在文件中有什么,它都会在第一行出错。我可以把它留空或做一个评论,它仍然会说第一行的格式不正确。
我想使用它,因为这是我能找到的唯一解决方案,它将允许我将ENV变量传递到Vagrant文件以及清单文件Puppet。
这是我的流浪文件的一个片段
# -*- mode: ruby -*-
# vi: set ft=ruby :
require 'dotenv'
Dotenv.load
Vagrant.configure("2") do |config|
config.env.enable
#config.dotenv.enabled = true
config.vm.provider "virtualbox" do |vb|
vb.customize ["modifyvm", :id, "--memory", "#{ENV['MEMORY_ALLOCATION']}"]
end
config.vm.network "public_network", ip: ENV['PUBLIC_IP']
end
Vagrant::Config.run do |config|
...
config.vm.define "devboxserver" do |app|
...
app.vm.provision :puppet do |puppet|
puppet.facter = {
"env" => ENV
}
puppet.module_path = "puppet/modules"
puppet.manifests_path = "puppet/manifests"
puppet.manifest_file = "site.pp"
puppet.options="--verbose --debug"
end
end
end
正如你所看到的,我也尝试了流浪的dotenv(你看到它被注释掉了),但这也给我带来了问题,因为它甚至在加载Vagrantfile之前就试图调用配置变量。但我想这是另一个问题。我不得不把那颗宝石从流浪汉目录中删除。
但回到流浪者的env问题,我写了我的.env文件,就像我可以从github插件网站和引用的文章中看到的一样
USER_NAME=jason
PUBLIC_IP=192.168.1.00
MEMORY_ALLOCATION=1024
GITREPO_ACCOUNT_URL=https://github.com/me
GITREPO_URL=https://github.com/me/my_app
POSTGRES_PASSWORD=secret-pass
DEV_DB_NAME=my_app_development
PROD_DB_NAME=my_app_production
TEST_DB_NAME=my_app_test
我得到的错误是:
jason@host:~/folder/vagrant$ vagrant up
There is a syntax error in the following Vagrantfile. The syntax error
message is reproduced below for convenience:
Line "USER_NAME=jason" doesn't match format
由于目标是在我流浪的执行过程中创建环境变量,并与Puppet共享,我做了任何理智的程序员(或程序员)都会做的事情。我通过抓取.env变量并将其转换为哈希创建了自己的简单破解。
我把这个破解添加到我的流浪者文件的顶部:
# -*- mode: ruby -*-
# vi: set ft=ruby :
env = {}
File.read(".env").split("n").each do |ef|
env[ef.split("=")[0]] = ef.split("=")[1]
end
Vagrant.configure("2") do |config|
config.vm.provider "virtualbox" do |vb|
vb.customize ["modifyvm", :id, "--memory", env['MEMORY_ALLOCATION']]
end
config.vm.network "public_network", ip: env['PUBLIC_IP']
end
...
然而,由于Puppet文件并不是真正的ruby文件,使用Puppet.facter抓取并将"env"变量($env)设置为哈希是不起作用的,因为我们谈论的是两种不同的语言结构。
相反,我只是扩展了puppet.facter列表,现在我为所有.env变量设置了一个puppet.acter变量集,而不是一个$env散列。
...
app.vm.provision :puppet do |puppet|
puppet.facter = {
"fqdn" => "#{env['BOX_NAME']}.local",
"user_name" => env['USER_NAME'],
"box_name" => env['BOX_NAME'],
"gitrepo_account_url" => env['GITREPO_ACCOUNT_URL'],
"gitrepo_url" => env['GITREPO_URL'],
"postgres_password" => env['POSTGRES_PASSWORD'],
"dev_db_name" => env['DEV_DB_NAME'],
"prod_db_name" => env['PROD_DB_NAME'],
"test_db_name" => env['TEST_DB_NAME'],
"my_email" => env['MY_EMAIL']
}
puppet.module_path = "puppet/modules"
puppet.manifests_path = "puppet/manifests"
puppet.manifest_file = "site.pp"
puppet.options="--verbose --debug"
end
...
在我的木偶脚本中,我只是像正常情况一样调用变量。例如:$user_name、$dev_db_name等
然后我删除了流浪env,因为它不再需要了。