Roles and Profiles Pattern (Methodology)¶
Overview¶
Provides a methodology for abstraction of Puppet code.
It's all about abstraction:
- Data (parameters) gets abstracted by Hiera
- Providers/Resources abstract the underlying OS implementation
- Providers get abstracted by Types
- Resources get abstracted by Classes
- Classes get abstracted by Modules (Component Modules)
- Modules get abstracted by Profiles
- Profiles get abstracted by Roles
Classification/Abstraction Flow:¶
- A node is assigned a Role
- A Role includes one or more Profiles
- Profiles include Component modules, Resources combined with logic.
- Make calls out to Hiera for hierarchal specific data (parameters)
- Hiera data is passed to Component modules
- Component modules call Puppet Resources
- Puppet Resources use Types/Providers to configure setting on a node

Profiles¶
Combines modules andresources to define a logical technology stack(single).
For more detail consult the documented set of guidelines
Profiles follow the following rules:
- Technology specific
- May include resources directly
- May make calls to Hiera for required data (parameters)- These calls may be transparent via automatic parameter lookup
 
- Include Component module classes/resources
- Named according to the technology they manage- Do NOT include environments in profile nawmes
 
Being technology specific does not limit the profile to managing a single application. It should include all applications and logic need to fully manage an application stack.
Example:
class profile::wordpress {
  ## Hiera lookups
  $site_name               = hiera('profiles::wordpress::site_name')
  $wordpress_user_password = hiera('profiles::wordpress::wordpress_user_password')
  $mysql_root_password     = hiera('profiles::wordpress::mysql_root_password')
  $wordpress_db_host       = hiera('profiles::wordpress::wordpress_db_host')
  $wordpress_db_name       = hiera('profiles::wordpress::wordpress_db_name')
  $wordpress_db_password   = hiera('profiles::wordpress::wordpress_db_password')
  $wordpress_user          = hiera('profiles::wordpress::wordpress_user')
  $wordpress_group         = hiera('profiles::wordpress::wordpress_group')
  $wordpress_docroot       = hiera('profiles::wordpress::wordpress_docroot')
  $wordpress_port          = hiera('profiles::wordpress::wordpress_port')
  ## Create user
  group { 'wordpress':
    ensure => present,
    name   => $wordpress_group,
  }
  user { 'wordpress':
    ensure   => present,
    gid      => $wordpress_group,
    password => $wordpress_user_password,
    name     => $wordpress_group,
    home     => $wordpress_docroot,
  }
  ## Configure mysql
  class { 'mysql::server':
    root_password => $mysql_root_password,
  }
  class { 'mysql::bindings':
    php_enable => true,
  }
  ## Configure apache
  include apache
  include apache::mod::php
  apache::vhost { $::fqdn:
    port    => $wordpress_port,
    docroot => $wordpress_docroot,
  }
  ## Configure wordpress
  class { '::wordpress':
    install_dir => $wordpress_docroot,
    db_name     => $wordpress_db_name,
    db_host     => $wordpress_db_host,
    db_password => $wordpress_db_password,
  }
}
Roles¶
A unquie collection (wrapper) of one or more profiles (technology stacks) to define a node
For more detail consult the documented set of guidelines
Roles follow the following rules:
- Maps technology to a node
- Nodes get classified with only a SINGLE role- A role similar, yet different, from another role is: a NEW role.
 
- Do NOT include logic
- ONLY use includes for abstracting profiles
- Named according to the nodes purpose (business logic)
Example:
Includes the profile wordpress to install/configure wordpress and includes the base profile to configure globally common settings such as NTP and default user accounts.
class role::myblog {
  include profile::wordpress
  include profile::base
}
References¶
Puppet Camp 2013 Presentation Puppet Roles and Profiles Workflow (SH*% Gary Says)