我有一个Vagrant设置,其中我正在尝试使用Chef-solo生成一个conf文件,该文件循环通过已定义的变量传递给应用程序。除了循环之外,一切都在工作,我对Ruby / Chef不太熟悉以发现错误。
我将列出整个事件链,以防问题出现问题,但这个过程的第一部分似乎工作正常。
配置文件是用yaml编写的,包含要传递的env变量定义:
...
variables:
- DEBUG: 2
...
配置文件由Vagrantfile读入ruby哈希,用于创建Chef json节点:
...
settings = YAML::load(File.read("config.yaml"))
# Provision The Virtual Machine Using Chef
config.vm.provision "chef_solo" do |chef|
chef.json = {
"mysql" => {"server_root_password" => "secret"},
"postgresql" => {"password" => {"postgres" => "secret"}},
"nginx" => {"pid" => "/run/nginx.pid"},
"php-fpm" => {"pid" => "/run/php5-fpm.pid"},
"databases" => settings["databases"] || [],
"sites" => settings["sites"] || [],
"variables" => settings["variables"] || []
}
...
运行一堆厨师烹饪书(apt,php,nginx,mysql等),最后是我的自定义食谱,这是什么让我悲伤。负责创建conf文件的cookbook部分如下所示:
# Configure All Of The Server Environment Variables
template "#{node['php-fpm']['pool_conf_dir']}/vars.conf" do
source "vars.erb"
owner "root"
group "root"
mode 0644
variables(
:vars => node['variables']
)
notifies :restart, "service[php-fpm]"
end
而vars.erb只是一个单行
<%= @vars.each {|key, value| puts "env[" + key + " = " + value } %>
所以,当我运行所有这个厨师时,会抛出一个关于无法将哈希值转换为字符串的错误。
can't convert Chef::Node::immutableMash into String
因此,由于某种原因,这是一个immutableMash,key
的值最终成为哈希[{"DEBUG"=>2}]
,值最终成为零对象,但我不确定为什么或如何纠正它。
答案 0 :(得分:0)
哈希最终在示例中以key
的值结束,因为YAML文件将DEBUG: 2
声明为variables
的列表成员。这转换为variables
是一个具有单个哈希成员的数组。
尝试将模板代码更改为:
<%= @vars[0].each {|key, value| puts "env[" + key + " = " + value } %>
或者尝试将YAML更改为此而不更改模板代码:
variables:
DEBUG: 2
任何一个更改都会让你的模板循环遍历你期望的哈希值。