hash to_yaml in erb template not giving valid yaml

2,463 views
Skip to first unread message

Martin Willemsma

unread,
Jul 5, 2012, 11:43:10 AM7/5/12
to Puppet Users
Hi,

I want to use a file resource to write a facts.yaml file for
Mcollective. For some reason it won't provide a valid yaml format if I
dump my scope to hash and convert to_yaml.

file {
"/etc/mcollective/facts.yaml" :
owner => root,
group => root,
mode => 400,
loglevel => debug,
#content => inline_template("<%= scope.to_hash.reject { |k,v| !(
k.is_a?(String) && v.is_a?(String) ) }.to_yaml %>"),

#content => inline_template("<%= { \"a\" => 1, \"b\"=> 2}.to_yaml %>"),
content =>
inline_template("<%= facts = {}; scope.to_hash.each_pair {|k,v|
facts[k.to_s] = v.to_s unless k.to_s =~
/pkg_|_hours|_seconds|memoryfree|plugin_|config|_timestamp/ };
facts.to_yaml.sort %>"),
}

After a run the content is indented with 2 spaces and some facts give
me garbage values. If I verify this on e.g. http://yamllint.com/ I
have a syntax error with the 2 leading spaces.

Snippet from '/etc/mcollective/facts.yaml'

[root~]# cat /etc/mcollective/facts.yaml
architecture: &id001 x86_64
hardwareisa: x86_64
hardwaremodel: *id001
kernelrelease: 2.6.18-274.17.1.el5xen
clientversion: *id002
kernelversion: 2.6.18
lsbdistcodename: Final
lsbdistdescription: CentOS release 5.8 (Final)
lsbdistid: CentOS
lsbdistrelease: "5.8"
lsbmajdistrelease: "5"


I did some debugging on the IRB. On the commandline I do get the
expected format. To me it seems the to_yaml is not working for me in
combination with inline template. What is causing the extra leading
spaces?

irb

irb(main):001:0> h = { "a" => 1 , "b" => 2 }
=> {"b"=>2, "a"=>1}
irb(main):002:0> require "yaml"
=> true
irb(main):003:0> h.to_yaml
=> "--- \nb: 2\na: 1\n"
irb(main):004:0>

I see several snippets on the internets to write a facts.yaml file to
be used with Mcollective. None of them work for me.

Puppet version: 2.7.12
OS: Ubuntu 10.04

Any hints on how to fix this issue?

---
kind regards,

Martin Willemsma

Stefan Schulte

unread,
Jul 5, 2012, 1:46:19 PM7/5/12
to Puppet Users
On Thu, Jul 05, 2012 at 05:43:10PM +0200, Martin Willemsma wrote:
> Hi,
>
> I want to use a file resource to write a facts.yaml file for
> Mcollective. For some reason it won't provide a valid yaml format if I
> dump my scope to hash and convert to_yaml.
>
> file {
> "/etc/mcollective/facts.yaml" :
> owner => root,
> group => root,
> mode => 400,
> loglevel => debug,
> #content => inline_template("<%= scope.to_hash.reject { |k,v| !(
> k.is_a?(String) && v.is_a?(String) ) }.to_yaml %>"),
>
> #content => inline_template("<%= { \"a\" => 1, \"b\"=> 2}.to_yaml %>"),
> content =>
> inline_template("<%= facts = {}; scope.to_hash.each_pair {|k,v|
> facts[k.to_s] = v.to_s unless k.to_s =~
> /pkg_|_hours|_seconds|memoryfree|plugin_|config|_timestamp/ };
> facts.to_yaml.sort %>"),
> }
>


The to_yaml output should start with a "---\n" line, but if you sort
your list (BTW: I get an error on ruby 1.9 when I call sort on a
string) you may produce an invalid yaml file if the "---" is not on top
anymore.

-Stefan

Reply all
Reply to author
Forward
0 new messages