Chef模板循环:无法将Chef :: Node :: immutableMash转换为String

时间:2014-11-25 19:02:34

标签: ruby chef-solo vagrantfile

我有一个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}],值最终成为零对象,但我不确定为什么或如何纠正它。

1 个答案:

答案 0 :(得分:0)

哈希最终在示例中以key的值结束,因为YAML文件将DEBUG: 2声明为variables的列表成员。这转换为variables是一个具有单个哈希成员的数组。

尝试将模板代码更改为:
<%= @vars[0].each {|key, value| puts "env[" + key + " = " + value } %>

或者尝试将YAML更改为此而不更改模板代码: variables: DEBUG: 2

任何一个更改都会让你的模板循环遍历你期望的哈希值。