0
votes

I am trying to provision an EC2 instance using puppet. In the process I have downloaded the puppetlabs-postgresql module from puppetlabs. Since I'm fairly new to puppet, i do not want to manage my database by creating classes in my site.pp file located in /etc/puppet/manifests/site.pp. Rather I want to have a module call database in /etc/puppet/modules/database. What I have done so far is create an init.pp file in /etc/puppet/modules/database. Below is the content of my init.pp file :

class database {
    # resources
    postgresql::globals{'globals':
        version             => '9.3',
        manage_package_repo => true,
        encoding            => 'UTF8',
        locale              => 'it_IT.utf8',

    }

    postgresql::server{'server':
        ensure           => 'present',
        listen_addresses => '*',
        manage_firewall  => true,
    }

    postgresql::server::contrib{'contrib':
        package_ensure => 'present',
    }
}

And then in my /etc/puppet/manifests/site.pp file i have included the database class as below :

node default {
    include localusers
    include database
}

However i keep getting an error :

   Error: Puppet::Parser::AST::Resource failed with error ArgumentError: Invalid resource type postgresql::globals at /etc/puppet.manifests/init.pp:12

Please what is the correct way to make use of the postgresql classes and resources in my own module and create a database in the module as well ?

1

1 Answers

2
votes

You're on the right track, but there are a few issues with how you're using the postgresql module. The reason you're getting the Invalid resource type error is that you're trying to use postgresql::globals as a defined type when it's actually a class. You have the same issue with the other two classes you're using. Try this...

class database {
    # set global defaults before creating server
    class { 'postgresql::globals':
        version             => '9.3',
        manage_package_repo => true,
        encoding            => 'UTF8',
        locale              => 'it_IT.utf8',
    }->
    class { 'postgresql::server':
        listen_addresses => '*',
        manage_firewall  => true,
    }

    # install the postgresql contrib package
    class { 'postgresql::server::contrib':
        package_ensure => 'present',
    }

    # create database with user and default permissions
    postgresql::server::db { 'my_awesome_db':
        user     => 'my_db_user',
        password => 'puppetRocks',
    }
}

In the reference section of the module documentation, there's a breakdown of the classes and resources (a.k.a. defined types). The postgresql::server::db type that I used is the simplest way to create a database, user, and permissions all at once. There are separate types available for each of those to provide more fine-grained control.