Search code examples
postgresqlubuntu-14.04puppetpackerpuppet-enterprise

Puppet PostgresQL management


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 ?


Solution

  • 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.