This is the situation I have:

All my hosts are the* same OS.*
All my host are in the* same puppet environment,* so I cannot use 
%{environment}

I have a module that sets all the *basic* functionality for the OS, 
resolution, authentication, security, packages, etc
I have a module for each application hosted.

At the moment all the 'data' is in Puppet, mostly in parametrised classes 
in site.pp.

What I want to get is a hiera set-up that allows me to use this structure:

:hierarchy:
  - global     # source of application names (classes? modules?) and 
environments list
  - basic     # data for the basic class
  - prod/%{application}/%{hostname}        # hostname files for specific 
data
  - prod/%{application}/%{env}                 # environmental data for 
each application (module)
  - prod/%{application}/default                 # default data for an 
application
  - nonprod/%{sysclass}/%{hostname}
  - nonprod/%{sysclass}/%{env}
  - nonprod/%{sysclass}/default             
  

Then to have something like this under the datadir:


#├── global.yaml
#├── basic.yaml
#├── nonprod
#│   ├── app1
#│   │   ├── common-integration.yaml           << Alfresco common 
integration
#│   │   ├── continuous-integration.yaml       
#│   │   ├── dev.yaml
#│   │   ├── default.yaml
#│   │   ├── host1.yaml                       
#│   │   ├── host2.yaml
#│   │   ├── performance.yaml
#│   │   ├── qa.yaml
#│   │   ├── test.yaml
#│   │   └── uat.yaml
#│   └── app2
#└── prod
#    ├── app1
#    └── app2
# 
# etc.

In global.yaml

---
:classes:
  basic:
  app1:
  app2:
  app3:
  app4:
:env:
  test:
  dev:
  commonint:
  continuousint:
  dev:
  performance:
  qa:
  test:
  uat:


in app1 default.yaml:

---
classes:
  app1:

app1_version:  'latest'



in app1 dev.yaml:
---
app1_version:  '3.0'

If I wanted host1 and host2 to be part of dev for app1:


host1.yaml:
---
classes:
  basic:
  app1:
env:
  dev:

maybe in host2 I want to override version too:

host2.yaml
---
classes:
  basic:
  app1:
env:
  dev:
app1_version: '3.1'


So in short, I would like hiera to be a source of facts, where I can get 
information that feeds Puppet in order to classify the nodes and to feed 
the parametrised classes.

I recently found this blog entry:

http://garyhetzel.com/2012/04/12/hiera_as_a_puppet_enc

Gary has been very helpful and I have got an idea of what needs doing. I 
can query all the data the way I want using the hiera command. Something 
like these:

hiera app1_version sysclass=app1 env=dev

Returns the expected '3.0' and if I query by adding teh host:

hiera app1_version sysclass=app1 env=dev hostname=host1

I get 3.1. Cool!


Example using Gary's approach:

/opt/puppet-data/nonprod/hieratest/default.yaml 
---
classes: hieratest
env: hieratest_default

/opt/puppet-data/nonprod/hieratest/host1.yaml 
---
classes: 
  hieratest:
env: 'hieratest_performance'


# hiera env sysclass=hieratest --debug
DEBUG: Wed Sep 26 16:40:46 +0100 2012: Hiera YAML backend starting
DEBUG: Wed Sep 26 16:40:46 +0100 2012: Looking up type in YAML backend
DEBUG: Wed Sep 26 16:40:46 +0100 2012: Looking for data source global
DEBUG: Wed Sep 26 16:40:46 +0100 2012: Looking for data source basic
DEBUG: Wed Sep 26 16:40:46 +0100 2012: Looking for data source 
nonprod/hieratest/default
DEBUG: Wed Sep 26 16:40:46 +0100 2012: Found env in 
nonprod/hieratest/default
hieratest_default

# hiera type sysclass=hieratest hostname=host1 --debug
DEBUG: Wed Sep 26 16:40:57 +0100 2012: Hiera YAML backend starting
DEBUG: Wed Sep 26 16:40:57 +0100 2012: Looking up type in YAML backend
DEBUG: Wed Sep 26 16:40:57 +0100 2012: Looking for data source global
DEBUG: Wed Sep 26 16:40:57 +0100 2012: Looking for data source basic
DEBUG: Wed Sep 26 16:40:57 +0100 2012: Looking for data source 
nonprod/hieratest/host1
DEBUG: Wed Sep 26 16:40:57 +0100 2012: Found env in nonprod/hieratest/host1
hieratest_performance


But when it comes to use this in Puppet the results are not as I expect, 
nothing happens, it just does a run no classes are used. I see that the 
basic class custom facts are loaded, but nothing gets executed, as if the 
catalogue for host1 would not include it.


In Puppet  I expect to just have:

in site.pp:
node default {}

And then in each application’s init.pp:

$env = hiera("env")  << this allows me to get the right config  files (with 
are maintained in a git repo)
$app1_version = hiera("app1_version") << this allows me to set the right 
RPM version (from satellite/spacewalk/RHN)

As per Gary's post, I can use hiera as node terminus, and so it is set in 
puppet.conf.

I would like to make emphasis  in this: Gary's hiera as an ENC works, but 
for a more simple scenario than the one I am proposing, if I only wanted to 
classify Classes and Hosts, it does work fine. Where I have not been able 
to succeed is in adding an 'env' layer after the application (classes, 
organised in modules).

I can get to organise things solely by host-name too (I could have a huge 
list of hundreds of hosts and manage that), but what I need is to be able 
to split them into directories as these are managed by each team 
responsible for the applications. 

I a a beginner in ruby, and I am willing to help as much as I can to get 
the use of hiera as an ENC as much as possible.

Do I have the right approach given the requirements? 
Is there a better approach to this one?


Kind regards,

Guillem

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Users" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/puppet-users/-/kFpoqN97hncJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/puppet-users?hl=en.

Reply via email to