Search code examples
classincludepuppet

Puppet: Multiple Instances with Different Parameters


I am running a server with a wiki, which is provisioned using Puppet. Here's a simplified version of my wiki class:

class wiki($name, $repo, $username, $password) {
    # details omitted
}

I am using it currently as follows:

class profiles::my_wiki_server {
    class { 'wiki' :
        name => 'wiki',
        repo => 'wiki',
        username => 'admin',
        passowrd => 'topsecret'
    }
}

This works fine. Now I want to run a second wiki (let's call it jokes) on the same server. Unfortunately, using another class { 'wiki' : declaration doesn't work, as I saw it already documented in other questions.

So my workaround is to create two classes:

class wiki($name, $repo, $username, $password) {
    # details omitted
}

class wiki::default($name, $repo, $username, $password) {
    include wiki
}

class wiki::jokes($name, $repo, $username, $password) {
    include wiki
}

I can use those as follows:

class profiles::my_wiki_server {
    class { 'wiki::default' :
        name => 'wiki',
        repo => 'wiki',
        username => 'admin',
        passowrd => 'topsecret'
    }
    class { 'wiki::jokes' :
        name => 'jokes',
        repo => 'jokes',
        username => 'admin',
        passowrd => 'topsecret'
    }
}

However, when I do so, the variables are not set (Error: expects a value for parameter 'name' etc.).

Is there a way to set those variables so that the original wiki class can use them?


Solution

  • As mentioned in the comments, you need to use a defined type rather than a class.

    Defined types are documented at https://puppet.com/docs/puppet/latest/lang_defined_types.html.

    The short version is that, rather than

    class wiki ($name, $repo, $username, $password) {
        # details omitted
    }
    

    you want

    define wiki ($name, $repo, $username, $password) {
        # details omitted
    }
    

    You can then use the defined type as many times as you want:

    class profiles::my_wiki_server {
        wiki { 'wiki':
            name => 'wiki',
            repo => 'wiki',
            username => 'admin',
            passowrd => 'topsecret'
        }
    
        wiki { 'wiki::jokes':
            name => 'jokes',
            repo => 'jokes',
            username => 'admin',
            passowrd => 'topsecret'
        }
    }