Greetings,

I am having an issue with Hiera again. Bangin my head on it for a few hours 
and not getting anywhere. Since this group was able to help last time, I 
have my fingers crossed you can help me again. :-D

I am trying to use JSON with Hiera this time.

First, fully updated dev box.
$ cat /etc/redhat-release 
Scientific Linux release 6.7 (Carbon)

$ sudo yum update
Loaded plugins: refresh-packagekit, security
Setting up Update Process
No Packages marked for Update

$ rpm -qa | egrep '(puppet|fact|hiera|ruby)'
facter-2.4.4-1.el6.x86_64
puppet-3.8.2-1.el6.noarch
hiera-1.3.4-1.el6.noarch
puppet-server-3.8.2-1.el6.noarch
ruby-libs-1.8.7.374-4.el6_6.x86_64
ruby-rdoc-1.8.7.374-4.el6_6.x86_64
ruby-shadow-2.2.0-2.el6.x86_64
ruby-1.8.7.374-4.el6_6.x86_64
rubygems-1.3.7-5.el6.noarch
ruby-augeas-0.4.1-3.el6.x86_64
rubygem-deep_merge-1.0.0-2.el6.noarch
libselinux-ruby-2.0.94-5.8.el6.x86_64
rubygem-json-1.5.5-3.el6.x86_64
ruby-irb-1.8.7.374-4.el6_6.x86_64


Let's use the puppet documentation to get started, shall we?
https://docs.puppetlabs.com/hiera/1/data_sources.html

$ cat /etc/puppet/hiera.yaml 
---
:backends:
   - json
:hierarchy:
   - common
:merge_behavior: "deeper"
:json:
   :datadir: /etc/puppet/hieradata

BTW: the doc's actual JSON example is broken as it is missing the [ ] 
around it. I included it. below and if you don't you fail the parser and 
Hiera just ignores everything instead of giving an error.

$ cat /etc/puppet/hieradata/common.json 
[
{
   "apache-packages" : [
   "apache2",
   "apache2-common",
   "apache2-utils"
   ],

    "hosts_entry" :  "sandbox.%{fqdn}",

    "sshd_settings" : {
                       "root_allowed" : "no",
                       "password_allowed" : "no"
                     }
}
]

Verify valid JSON
$ cat /etc/puppet/hieradata/common.json | jq '.[0]'
{
  "sshd_settings": {
    "password_allowed": "no",
    "root_allowed": "no"
  },
  "hosts_entry": "sandbox.%{fqdn}",
  "apache-packages": [
    "apache2",
    "apache2-common",
    "apache2-utils"
  ]
}

Awesome!  Lets validate in Hiera:
$ hiera --version
1.3.4
$ hiera -c /etc/puppet/hiera.yaml hosts_entry
/usr/lib/ruby/site_ruby/1.8/hiera/filecache.rb:56:in `read_file': Data 
retrieved from /etc/puppet/hieradata/common.json is String not Hash 
(TypeError)
from /usr/lib/ruby/site_ruby/1.8/hiera/backend/json_backend.rb:24:in 
`lookup'
from /usr/lib/ruby/site_ruby/1.8/hiera/backend.rb:76:in `datasources'
from /usr/lib/ruby/site_ruby/1.8/hiera/backend.rb:74:in `map'
from /usr/lib/ruby/site_ruby/1.8/hiera/backend.rb:74:in `datasources'
from /usr/lib/ruby/site_ruby/1.8/hiera/backend/json_backend.rb:17:in 
`lookup'
from /usr/lib/ruby/site_ruby/1.8/hiera/backend.rb:206:in `lookup'
from /usr/lib/ruby/site_ruby/1.8/hiera/backend.rb:203:in `each'
from /usr/lib/ruby/site_ruby/1.8/hiera/backend.rb:203:in `lookup'
from /usr/lib/ruby/site_ruby/1.8/hiera.rb:60:in `lookup'
from /usr/bin/hiera:225



And here is where things went wrong. The worst part is that it is such a 
generic error I can't find anything of real value in my online searching. 
Even worse, the only directly relevant hit I found basically said to stop 
using JSON and use YAML instead. Not really a solution is it? 

But whatever. It is probably good to verify that YAML is at least working 
with Heira in the dev environment. Using the puppet documentation again for 
guidance. 
$ mv /etc/puppet/hieradata/common.json /etc/puppet/hieradata/common.yaml
$ vim /etc/puppet/hieradata/common.yaml
$ cat /etc/puppet/hieradata/common.yaml 
---
# array
apache-packages:
    - apache2
    - apache2-common
    - apache2-utils

# string
apache-service: apache2

# interpolated facter variable
hosts_entry: "sandbox.%{fqdn}"

# hash
sshd_settings:
    root_allowed: "no"
    password_allowed: "yes"

# alternate hash notation
sshd_settings: {root_allowed: "no", password_allowed: "yes"}

# to return "true" or "false"
sshd_settings: {root_allowed: no, password_allowed: yes}


$ vim /etc/puppet/hiera.yaml 
$ cat /etc/puppet/hiera.yaml
---
:backends:
    - yaml
:hierarchy:
    - common
:merge_behavior: "deeper"
:yaml:
    :datadir: /etc/puppet/hieradata


$ hiera -c /etc/puppet/hiera.yaml hosts_entry
sandbox.

Awesome! So YAML works.

Back to the JSON version....

$ hiera -c /etc/puppet/hiera.yaml hosts_entry
/usr/lib/ruby/site_ruby/1.8/hiera/filecache.rb:56:in `read_file': Data 
retrieved from /etc/puppet/hieradata/common.json is String not Hash 
(TypeError)
from /usr/lib/ruby/site_ruby/1.8/hiera/backend/json_backend.rb:24:in 
`lookup'
from /usr/lib/ruby/site_ruby/1.8/hiera/backend.rb:76:in `datasources'
from /usr/lib/ruby/site_ruby/1.8/hiera/backend.rb:74:in `map'
from /usr/lib/ruby/site_ruby/1.8/hiera/backend.rb:74:in `datasources'
from /usr/lib/ruby/site_ruby/1.8/hiera/backend/json_backend.rb:17:in 
`lookup'
from /usr/lib/ruby/site_ruby/1.8/hiera/backend.rb:206:in `lookup'
from /usr/lib/ruby/site_ruby/1.8/hiera/backend.rb:203:in `each'
from /usr/lib/ruby/site_ruby/1.8/hiera/backend.rb:203:in `lookup'
from /usr/lib/ruby/site_ruby/1.8/hiera.rb:60:in `lookup'
from /usr/bin/hiera:225


Dah!

No matter how simple I make it or what tweaks I do to the common.json file, 
I always get that exact error. If I run puppet agent, I get a very similar 
error too! 

"So just use YAML like the other post said" 
1) That doesn't fix JSON and it avoids the problem ("Hey doc, my legs are 
broken!" "Have you tried walking on your hands instead? Why not just do 
that?" :-P)

2) The fancy new tool that my security team is using to manage and monitor 
system wide variables reads/writes JSON but doesn't do YAML. Meaning we 
either have to keep doing the manual checks we are doing, or stick a parser 
in between. Why? Puppet and Heira are supposed to work with JSON, it 
read/writes JSON, this should theoretically just work.

Does anyone know why hiera isn't working with JSON? I really feel like this 
is probably a simple solution that I am just not seeing. I am hoping 
someone else might be able to recognize the answer.

Thanks!
~Stack~

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to puppet-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/puppet-users/2703e86d-f1e8-40a3-9d0c-24fd85bbbfe4%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to