在ERB模板中对YAML输出进行排序

时间:2013-02-28 08:32:53

标签: ruby types yaml erb puppet

在Puppet使用的ERB模板中,我正在尝试对哈希的YAML输出进行排序,以确保它始终是相同的输出。

这是我到目前为止(mytest/templates/hash.erb):

<%=
  class MyHash < Hash
    def to_yaml( opts = {} )
      YAML::quick_emit( self, opts ) do |out|
        out.map( taguri, to_yaml_style ) do |map|
          keys.sort.each do |k|
            v = self[k]
            map.add( k, v )
          end
        end
      end
    end
  end
  myScope = scope.to_hash.reject{|k,v| k.to_s =~ /(uptime|timestamp|free)/}
  MyHash[myScope].to_yaml
-%>

产生:

$ puppet apply -e 'include mytest' --modulepath .
Failed to parse template mytest/hash.erb:
  Filepath: /usr/lib/ruby/1.8/yaml.rb
  Line: 391
  Detail: wrong argument type String (expected Data)
 at /home/rpinson/bas/puppet/mytest/manifests/init.pp:3 on node foo.example.com

这是mytest/manifests/init.pp

的内容
class mytest {
  notify { 'toto':
    message => template('mytest/hash.erb'),
  }
}

我似乎无法理解这种类型数据的来源,以及如何正确地转换参数以使其工作......

1 个答案:

答案 0 :(得分:0)

事实证明,问题的根源是ZAML,YAML替换Puppet用于性能目的。

可以通过测试此erb - 模板而不使用Puppet来证明这一点。

我很确定它会起作用。

我正在调查允许他们一起工作。

更新:

ZAML.dump(MyHash[myScope]) # instead of MyHash[myScope].to_yaml

这可能会治愈问题,至少我的那个问题确实很相似。