Hi!

suppose my puppet recipes are deploying a configuration
for the entire cluster (lets say Hadoop) consisting of quite a
few distributed systems (lets say distributed file-system --
HDFS, scheduler -- YARN, coordinator -- zookeeper). Each
of these distributed systems in turn consists of a few agents
(e.g. in HDFS there's a NameNode, DataNode, etc.).

My biggest concern is how to make it possible to cascade
defaults in such a way that they can be specified at each
of the levels: entire cluster, subsystem, an agent that
is part of the subsystem.

To be more explicit, suppose I have a node description
that looks like this:
-----------------------------------------------------------------
class { "cluster::hdfs::datanode":
   namenode_uri => "hdfs://foo.company.com",
                auth     => "kerberos"
}
class { "cluster::hdfs::secondary_namenode":
    namenode_uri => "hdfs://foo.company.com",
               auth      => "kerberos"
}
class { "cluster::zookeeper::server":
    ensemble         => "zoo1.company.com",
            auth         => "kerberos"
}
-----------------------------------------------------------------

What would be the ideal way for me to not repeat myself
and set auth as a cluster-level default, while having
namenode_uri as an HDFS-level default?

Really, what I need should look something like:
----------------------------------------------------------------------
class { "cluster":
   auth => kerberos
}
class { "hdfs":
   namenode_uri => "hdfs://foo.company.com"
}
class { "cluster::hdfs::datanode": }
class { "cluster::hdfs::secondary_namenode": }
class { "cluster::zookeeper::server":
    ensemble         => "zoo1.company.com",
}
------------------------------------------------------------------------

Any ideas on how this could be implemented? I've tried
a couple of things, but so far no luck. The natural way
of solving it via inheritance (e.g. cluster::hdfs inherits cluster
and cluster::hdfs::datanode inherits cluster::hdfs, etc.)
seems to be of no help at all. Another thing I was considering
was something along the lines of:
      class cluster::hdfs::datanode (
          $auth = $cluster::hdfs::params::auth
      ) inherits cluster::hdfs::params {...}
      ..............
      class cluster::hdfs::params {
          if defined(Class['cluster::hdfs']) {
              $auth = $cluster::hdfs::auth
          } elsif defined(Class['cluster']) {
              $auth = $cluster::auth
          } else {
              $auth = 'simple'
          }
      }

seems to be pretty ugly and worse yet  dependent on the parsing
order.

Am I missing something obvious here?

Thanks,
Roman.

-- 
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 post to this group, send email to puppet-users@googlegroups.com.
Visit this group at http://groups.google.com/group/puppet-users?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to