Ny way to use arrays in a puppet module (not in template)

configurationhadooppuppet

I want to use puppet to manage a hadoop cluster. On the machines we have several directories which must be created and set permissions.

But i'm unable to add array values for defined methods.

define hdfs_site( $dirs ) {
    file { $dirs:
        ensure => directory,
        owner => "hadoop",
        group => "hadoop",
        mode  => 755;
    }

    file {
        "/opt/hadoop/conf/hdfs-site.xml":
            content => template("hdfs-site.xml.erb"),
            owner   => "root",
            group   => "root",
            mode    => 644;
    }
}

define hadoop_slave( $mem, $cpu, $dirs ) {
    hadoop_base {
        mem => $mem,
        cpu => $cpu,
    }

    hdfs_site {
        dirs => $dirs,
    }
}

hadoop_base is similar to hdfs_site.

EDIT

The error message was:

Could not parse for environment production: All resource specifications require names; expected '%s' at /etc/puppet/modules/hadoop/manifests/init.pp:52

which is the $dirs line in hadoop_slave

Best Answer

As the message tells you, any resource specification requires a name.

In your specific case the following snippet should work:

define hadoop_slave( $mem, $cpu, $dirs ) {
    hadoop_base { "${name}_hadoop_base":
        mem => $mem,
        cpu => $cpu,
    }

    hdfs_site { "${name}_hdfs_site":
        dirs => $dirs,
    }
}