No problem! Feeling lost is a little normal -- Puppet is a deceptively
complex tool. You will probably go through MANY iterations of
architecture, module layout, etc, as you ramp up your Puppet skills.
When I first started with Puppet, I wrote a very clever ENC that did
some internal-business-logic stuff. It worked great, and I was very
proud of myself. Fast forward a few months, and I realized that I had
basically reinvented Hiera, in a way that wasn't as good as Hiera, and
all I had to do to use pure Hiera was write a custom fact and use it in
my Hiera hierarchy.
The stuff I described is a little hard to understand if you haven't
dealt with modules before, because it's very abstract. However, it seems
like you're on the right track. Group everything to make an "ELK
server" into a profile module -- including packages, configuration
files, and network ports, then just include that into a role module that
gets assigned to a node. If there is special "data" (say, database
credentials), that should come from Hiera. You may find that you may
need to (or it might just be easier to) split out your ELK module into
its 3 components, then have the ELK module tie them all together.
However, I would caution you against completely rewriting everything
from scratch -- there are a lot of really great modules on the Forge --
Elasticache, for example, has a really good module that is provided by
the vendor. Don't reinvent the wheel. :) Just write enough 'glue' code
to tie everything together to meet your business needs.
I would start by watching the video linked to by Rich in his reply to
this thread. I haven't watched the whole thing, but what I've watched
is a pretty awesome intro to a lot of best practices. There are a
couple other good videos of the roles & profiles model floating around
that may be worth your time to watch as well.
On 8/13/2016 9:53 AM, Robert Poulson wrote:
Hi Peter,
thank you for the valuable input!
I read your answer yesterday many times and asked myself: "yes, it's
clear that I'm doing it wrong, but what is the Right Way™then?".
But many hours later, I might have one of those "aha moments" :)
I always wanted to write modules - or use them in a manner - which
define the state of the node after the module gets assigned to it. The
modules either contain the information themselves (like the mounts,
apache modules etc.) or get these as a parameter; and they always got
assigned directly to the node.
But it seems to me that in this "roles & profiles" model, one uses the
modules more like if they were just various libs; they're not assigned
to the nodes per se, but are just "called" (included) in the node
classifiers with the parameters.
This way, I don't have to open the port 5601 for Kibana in my ELK
module, but include the firewall class with port 5601 as a parameter
within the ELK profile.
Or something similar. Or something different. But I think I got your
point :)
The good news is, I have very much work ahead of me so I don't mind to
start creating new modules, and re-doing the existing ones in this
philosophy.
Thanks; and feel free to correct me if I'm still wrong :)
Rp
On Thu, Aug 11, 2016 at 11:30 PM, Peter Kristolaitis
<alte...@alter3d.ca <mailto:alte...@alter3d.ca>> wrote:
This is probably a case of trying to use Hiera for stuff you
shouldn't be using it for. It's important to keep in mind that
Hiera is not really a replacement for manifest files -- or even
better, modules that follow a role & profile architecture. You
can hack Hiera to do that, but you're going to rip your hair out
debugging it, and there are better architectural ways of dealing
with it anyways. create_resources() seems really cool when you
first learn about it. That fades quickly as you scale. ;)
To use your firewall example, "ports opened" depend on the profile
of the system (e.g. what software is installed). All nodes that
have Apache need port 80 and 443 opened, for example. All SSH
servers need port 22.
In a "roles & profiles" model, every node probably gets a
"baseline firewall" profile assigned to it. This is where you
would set up iptables policies, default-drop rules, etc. If
you're using the puppetlabs-firewall module, you'll probably tell
it to purge all non-Puppet-managed firewall rules.
Then in every profile class that requires an open network port,
you would have it add the appropriate firewall rule definition.
The SSH profile class adds a firewall rule for port 22. The
Apache class adds firewall rules for ports 80 and 443.
This way, when Puppet is configuring your system, the logic is "I
have Apache installed, so I need ports 80 and 443 opened", instead
of "I'm node ABC and I have port 80 and 443 opened, but I might or
might not have Apache installed", which is a situation you can
easily get into if you're shoving as much as you can into Hiera.
This approach seems like much more work at first, because breaking
out all your logic into profile modules can be quite verbose and
time-consuming. Sometimes you will get a profile class that does
nothing but install a single package (e.g. if you have multiple
profiles that require a single Apache module). That's OK. It
will be MUCH easier and less error-prone to manage over the long
run, and you'll appreciate the architecture if you start using
exported resources and other features of Puppet.
On 2016-08-11 04:46 PM, Robert Poulson wrote:
Hey List,
during the last weeks I finally managed to spend some quality
time :) with Puppet and I deepened my knowledge a bit: learned
some ruby, wrote my first custom ruby facts, used hiera in my
latest module... it's been fun.
There is one concept with Hiera though which is still unclear for me.
Let's say all of our servers have only port 22 open. But I assign
my module to a node which installs and configures Apache, so it
should add port 80 and 443 to the open ports list.
Or I assign my other module to a node which uses SSO and has to
enable the mod_auth_kerb Apache module. On my ELK nodes I'd like
to use some more Apache modules as well.
Or a Docker node needs to add some rules to the /etc/sudoers,
another application some more rules...
I could name a few more examples, but the point is: I can't
always define something static in a hiera value, like open_ports:
/ apache_modules_enabled: / sudo_commands: etc. but need to
dynamically manage these arrays when a module is assigned to a node.
How should be this achieved?
A _very_ primitive analogy is like
$PATH="$PATH:/usr/local/my_app"
where I don't have to take care of the actual content of $PATH,
but can simply extend it. Something similar would be great in
Hiera (or elsewhere) instead of using defines for every resource
I have.
Thanks
Rp
--
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
<mailto:puppet-users+unsubscr...@googlegroups.com>.
To view this discussion on the web visit
https://groups.google.com/d/msgid/puppet-users/CANwwCtz0nz6%2BzZMX4ksfrfy%3D8sMjmsSi6vrSpZqS49fVUVO-dA%40mail.gmail.com
<https://groups.google.com/d/msgid/puppet-users/CANwwCtz0nz6%2BzZMX4ksfrfy%3D8sMjmsSi6vrSpZqS49fVUVO-dA%40mail.gmail.com?utm_medium=email&utm_source=footer>.
For more options, visit https://groups.google.com/d/optout
<https://groups.google.com/d/optout>.
--
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
<mailto:puppet-users+unsubscr...@googlegroups.com>.
To view this discussion on the web visit
https://groups.google.com/d/msgid/puppet-users/efe67a83-ce29-07ef-3e69-1bcdb32f2d05%40alter3d.ca
<https://groups.google.com/d/msgid/puppet-users/efe67a83-ce29-07ef-3e69-1bcdb32f2d05%40alter3d.ca?utm_medium=email&utm_source=footer>.
For more options, visit https://groups.google.com/d/optout
<https://groups.google.com/d/optout>.
--
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
<mailto:puppet-users+unsubscr...@googlegroups.com>.
To view this discussion on the web visit
https://groups.google.com/d/msgid/puppet-users/CANwwCtyX0jER-zaQwXfuYhxs8hz5ngMKqbSu%2Bv8RnDAS72s8yw%40mail.gmail.com
<https://groups.google.com/d/msgid/puppet-users/CANwwCtyX0jER-zaQwXfuYhxs8hz5ngMKqbSu%2Bv8RnDAS72s8yw%40mail.gmail.com?utm_medium=email&utm_source=footer>.
For more options, visit https://groups.google.com/d/optout.
--
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/bdcda760-379b-1da0-d2e8-9f6c47571fd3%40alter3d.ca.
For more options, visit https://groups.google.com/d/optout.