Parameters and Facts

Playing with Scopes

app.pp



$color = 'blue'
$car   = 'maruti'

node 'node1' {

  include tomcat

}


node 'node2' {

   $color = 'green'
   include tomcat

}

Create tomcat::scope class

class tomcat::scope {

   notify{"print the scope":
     message => "

       FAVOURITE COLOR :  ${color}
       FAVOURITE CAR   :  ${car}

    "
  }

}

Add this class to init.pp

class tomcat {

  include tomcat::scope
  include tomcat::install
  include tomcat::config
  include tomcat::service
}

Apply on both node1 and node2 and see the difference?

Question: Why does it print two different values?

Inheritance and story of params.pp

create file: modules/tomcat/params.pp

class tomcat::params {

  $color = 'white'
  $car   = 'figo'

}


Update tomcat::scope definition to inherit tomcat::params. Lets also define $color in this child class.

class tomcat::scope inherits tomcat::params{

   $color = 'yellow'


   notify{"print the scope":
     message => "

       FAVOURITE COLOR :  ${color}
       FAVOURITE CAR   :  ${car}

    "
  }

}

Parameterising Tomcat Configs

tomcat::params

class tomcat::params {

  $color = 'white'
  $car   = 'figo'
  $user  = 'tomcat'
  $group = 'tomcat'
  $config_path  = '/etc/tomcat/tomcat.conf'
  $packages  = [ 'tomcat', 'tomcat-webapps' ]
  $service_name = 'tomcat'
  $service_state = running

}

tomcat (init.pp)

class tomcat inherits tomcat::params{

  include tomcat::scope
  include tomcat::install
  include tomcat::config
  include tomcat::service
}

class tomcat::install

class tomcat::install inherits tomcat{

    include java

    package { $::tomcat::packages:
      ensure   => installed,
      require  => Package['epel-release']
    }

}

class tomcat::config

class tomcat::config inherits tomcat{

  file { $::tomcat::config_path:
    source    => 'puppet:///modules/tomcat/tomcat.conf',
    owner    => $::tomcat::user,
    group    => $::tomcat::group,
    mode     => '0644',
    notify   => Service['tomcat']
  }

}

class tomcat::service

class tomcat::service inherits tomcat{

   service { $::tomcat::service_name:
     ensure   => $::tomcat::service_state,
     enable   => true,
     require  => Class['tomcat::install'],
   }
}

Creating base module

cd /workspace/code/environments/production/modules

puppet module generate --skip-interview user-base

mv /workspace/base.pp base/manifests/init.pp

Add class to modules/base/manifests/init.pp. Code for this class can be availed from https://gist.github.com/initcron/dd302fe9fabcc9a1af071394bf8e8d6a

Add the base class to one of the nodes, and see if you could apply

e.g. for node2 definition in app.pp


node 'node2' {

   include base

   $color = 'green'
   include tomcat

}

Question : What happens when you apply this class on node2 by running puppet agent ??

Lets use params.pp for doing platform specific configurations,

class base::params {

  case $::os['family'] {
    'Debian': {
      $ntp_service = 'ntp'
    }
    'RedHat': {
      $ntp_service = 'ntpd'
    }
  }


}

And to use these params, we need to * inherit base::params in base class (init.pp) * parameterize the service name

Update init.pp with the above two changes. Here is the updated file for your reference https://gist.github.com/initcron/c8b6530dbae41c47c0d864d2a594844e

Using Facts

Lets also start using facts inside modules. To do this, lets create a file resource which generates /etc/motd and prints information about the system

Update modules/base/manifests/init.pp and add the following resource.

    file { '/etc/motd':
      ensure   => file,
      owner    => 'root',
      content  => "

         This server is a property of XYZ Inc.

         SYSTEM INFO
         ============

         Hostname     : ${::fqdn}
         IP Address   : ${::ipaddress}
         Memory       : ${::memory['system']['total']}
         Cores        : ${::processors['count']}
         OS           : ${::os['distro']['description']}


      "

    }

Apply on all nodes and validate.