Most puppet modules can be designed to support multiple operating systems. Puppet has built in features to allow this through some simple syntax in the .pp file. It is a good practice to do that, whether you are publishing these modules on Puppet Forge or building highly customized modules for a specific purposes in a private enterprise.
1. Scalability - In case an organization chooses to switch operating systems or support other operating systems, your modules are already supporting them or they already have some operating systems and it is a matter of adding a few lines of code at the very top to add support for other operating systems.
2. Visibility and usability - The modules that support more than one operating system have higher usage counts on Puppet Forge because they support more than one type of need.
We will walk through a simple example to demonstrate multi-OS support. I checked in this code in GitHub at https://github.com/adityai/puppetApache.
Module: Install Apache web server and start it as a service.
OS Support: CentOs, Ubuntu and RHEL
Step 1: Folder structure
Create the following folder structure and blank files.
Folder: puppetApache
|-> Folder: apache -> Folder: manifests -> File: init.pp
|-> runner.pp
Step 2: Create runner.pp
We can use runner.pp to make it easy for us to apply the module from command line. Open the puppetApache/runner.pp file and enter the following line of code.
include apache
Step 3: Create the apache class
Open puppetApache/manifests/init.pp and enter the following code. I will explain each line of code in comments here.
#Create a class named apache
Step #4: Run the module
Execute the following command from the puppetApache folder in the command line.
sudo puppet apply --modulepath . runner.pp
Step #5: Verify that apache is installed and running as a service
Execute the following command on the command line. You may have to run it with sudo depending on the user permissions.
For CentOs/RHEL:
service httpd status
For Ubuntu:
service apache2 status
Step #6: A little fun.
Now that we have confirmed that the apache web server is installed and running, let us stop the service and re-apply the puppet module.
Stop the Apache service
service apache2 stop #will stop the service on Ubuntu
Check the status of the service
service apache2 status #will show that the service is stopped
Apply the puppet module again.
sudo puppet apply --modulepath . runner.pp
Check the status of the service
service apache2 status #will show that the service is running
Here's what happened: When the puppet client applied the module:
1. It observed that apache is already installed (ensure => installed) and it does nothing with apache package.
2. It observed that the apache service is stopped (ensure => running) and it started the service.
Helpful Tip: If you really want your module to support multiple operating systems, I recommend setting up the case $::operatingsystem part as soon as you create the init.pp. As you add more sections, update the case $::operatingsystem part in parallel.
Have fun!
1. Scalability - In case an organization chooses to switch operating systems or support other operating systems, your modules are already supporting them or they already have some operating systems and it is a matter of adding a few lines of code at the very top to add support for other operating systems.
2. Visibility and usability - The modules that support more than one operating system have higher usage counts on Puppet Forge because they support more than one type of need.
We will walk through a simple example to demonstrate multi-OS support. I checked in this code in GitHub at https://github.com/adityai/puppetApache.
Module: Install Apache web server and start it as a service.
OS Support: CentOs, Ubuntu and RHEL
Step 1: Folder structure
Create the following folder structure and blank files.
Folder: puppetApache
|-> Folder: apache -> Folder: manifests -> File: init.pp
|-> runner.pp
Step 2: Create runner.pp
We can use runner.pp to make it easy for us to apply the module from command line. Open the puppetApache/runner.pp file and enter the following line of code.
include apache
Step 3: Create the apache class
Open puppetApache/manifests/init.pp and enter the following code. I will explain each line of code in comments here.
#Create a class named apache
class apache { | |
#Case: when operating system is: case $::operatingsystem { #When operating system is ubuntu, set the package name and service name to apache2 | |
"ubuntu": { | |
$packagename = "apache2" | |
$servicename = "apache2" | |
} #When operating system is centos or rhel, set the package name and service name to httpd | |
"centos", "rhel": { | |
$packagename = "httpd" | |
$sercicename = "httpd" | |
} #Default condition when the operating system is not supported, fail and stop. | |
default: { | |
fail("Ubsupported OS: ${::operatingsystem}") | |
} | |
} | |
#Ensure Apache is installed #Refer to puppet type reference https://docs.puppetlabs.com/references/latest/type.html#package | |
package { 'apache': | |
name => $packagename, | |
ensure => installed, | |
} | |
#Ensure Apache is running #Refer to puppet type reference https://docs.puppetlabs.com/references/latest/type.html#service | |
service { 'apache': | |
name => $servicename, | |
ensure => running, #require acts as a dependency. In this case, this service section requires the apache package section to be completed before this service section can run. #This ensures that dependencies are met before a particular section can execute. | |
require => Package['apache'], | |
} | |
} |
Step #4: Run the module
Execute the following command from the puppetApache folder in the command line.
sudo puppet apply --modulepath . runner.pp
Step #5: Verify that apache is installed and running as a service
Execute the following command on the command line. You may have to run it with sudo depending on the user permissions.
For CentOs/RHEL:
service httpd status
For Ubuntu:
service apache2 status
Step #6: A little fun.
Now that we have confirmed that the apache web server is installed and running, let us stop the service and re-apply the puppet module.
Stop the Apache service
service apache2 stop #will stop the service on Ubuntu
Check the status of the service
service apache2 status #will show that the service is stopped
Apply the puppet module again.
sudo puppet apply --modulepath . runner.pp
Check the status of the service
service apache2 status #will show that the service is running
Here's what happened: When the puppet client applied the module:
1. It observed that apache is already installed (ensure => installed) and it does nothing with apache package.
2. It observed that the apache service is stopped (ensure => running) and it started the service.
Helpful Tip: If you really want your module to support multiple operating systems, I recommend setting up the case $::operatingsystem part as soon as you create the init.pp. As you add more sections, update the case $::operatingsystem part in parallel.
Have fun!