In my puppet environment I tryed to implement default configuration that
can be extended in child node definition.

For instance:
    * All the linux SSH servers must allow connect two groups: group1 and
group2
    * Each node (or classnode) should can have more groups allowed to
connect.
    * Some "special" nodes can overwrite this value.

First I implemented it using parametrized defines, and using the
redefinition of the instance (I think that I can do this with parametrized
classes)

In this case:

    define linux($connect_allowed_groups) {
        $ssh_allowed_groups = $connect_allowed_groups
        include ssh_server
    }

    # The general linuxserver case
    node linuxserver {
        linux{"base":
            connect_allowed_groups => [ "group1", "group2" ]
        }
    }

    # A node with an extra group allowed to connect
    node 'node1.mydomain.com' inherits linuxserver {
        Linux["base"]{
            connect_allowed_groups +> [ "group3" ]
        }
    }

    # A node where there is an the connect groups are overwriten
    node 'node2.mydomain.com' inherits linuxserver  {
        Linux["base"]{
            connect_allowed_groups => [ "group1", "group3" ]
        }
    }

Now I am trying to use external nodes, but in external nodes you only can
include non-parametrized classes and set parameters.

Also, from my tests I checked that the parameters (please correct me if I am
wrong):
 - Are stored in global scope: All classes has access to it.
 - But if a class defines that parameter, it is used the class value.

To simulate the behaviour exposed before I think that the unique way that I
think I can use is:

    class linux{
        case $overwrite_connect_allowed_groups {
            '':         { ssh_allowed_groups =
$default_connect_allowed_groups }
            default: { ssh_allowed_groups =
$overwrite_connect_allowed_groups }
        }
        case $extra_connect_allowed_groups {
            '':      {  }
            default: { ssh_allowed_groups += $extra_connect_allowed_groups }
        }

        include ssh::base
    }

And have a external node classifier with:

    - name: node1.mydomain.com
      parameters:
       extra_connect_allowed_groups: ["group3"]
      classes:
       - linux

    - name: node2.mydomain.com
      parameters:
       overwrite_connect_allowed_groups: ["group1","group3"]
      classes:
       - linux

But it looks extremelly weird and unreadable, specially as it grows in
number of variables.

Other way could be use extlookup, as proposed here:

in site.pp:

    $extlookup_datadir = "/etc/puppet/data/common/extdata/"
    $extlookup_precedence = ["hosts/%{fqdn}", "domain_%{domain}", "common"]

the linux class:

    class linux{
        ssh_allowed_groups = extlookup('connect_allowed_groups')
        include ssh::base
    }

And just have a files for extlookup:

/etc/puppet/data/common/extdata/common.csv

    connect_allowed_groups,group1,group2

/etc/puppet/data/common/extdata/hosts/node1.mydomain.com.csv

    connect_allowed_groups,group1,group2,group3

/etc/puppet/data/common/extdata/hosts/node2.mydomain.com.csv

    connect_allowed_groups,group1,group3

But I do not like too much the extlookup solution because:
 * I can not define a common subset of groups that all host will inheret
(except the ones that overwrite this value). May be using again the
"default_connect_allowed_groups" variable.
 * I think that is bad to have configuration in two places: external nodes
and cvs's files.

Do you have an idea to implement this better?

--
Atentamente
Héctor Rivas

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Users" group.
To post to this group, send email to puppet-us...@googlegroups.com.
To unsubscribe from this group, send email to 
puppet-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/puppet-users?hl=en.

Reply via email to