Blog
Answers about Puppet
DevOps, Automation
Universe and Everything
Need Puppet help?
Contact Alessandro Franceschi / example42
for direct expert help on Puppet.
If solution is quick, it’s free. No obligations.
Tip of the Week 26 - The PSICK Developer Environment Setup
Working on Puppet code with least possible effort requires a properly setup of a suitable workstation environment. Usually everybody starts playing around with different sets of utilities and tools, learning the hard way about the best usable setup.
This article will guide you to a setup, providing a proper basis for initially working with PSICK, Puppet or Ruby in general.
Puppet Development is based on Ruby. The first thing we need is a Puppet recommended Ruby version. As version can change from release to release, therefor we need some flexibility on Ruby versions being available. Puppet provides a website with information on Component versions in recent Puppet Enterprise releases. More information regarding ruby development for Puppet is mentioned in the System Requirements - Section Prerequisites.
The usually preferred method uses Ruby in user space. This allows work without super user privileges. There are two possible solutions:
Within this posting we will use rbenv.
System preparation
As we might need to install ruby from source, several development and application packages are required:
# RedHat/CentOS:
yum install -y git gcc make bzip2
yum install -y openssl-devel readline-devel zlib-devel gcc-c++
# Debian/Ubuntu:
apt-get install -y git gcc make bzip2
apt-get install -y libssl-dev libreadline-dev zlib1g-dev g++
On OS X and macOS Xcode installation is required. Then install the Command Line Tools:
xcode-select --install
Installation of rbenv
Installation of rbenv is done as a non-root user
First we clone the rbenv github repository:
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
Now we can compile shell extensions (this step is optional)
cd ~/.rbenv && src/configure && make -C src
Now we add the rbenv executable path to our PATH environment variable:
# RedHat/CentOS/OS X/macOS:
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
# Debian/Ubuntu:
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
For the next step we need output from rbenv, which we will add to our shell:
~/.rbenv/bin/rbenv init
The output:
# RedHat/CentOS/OS X/macOS:
# Load rbenv automatically by appending
# the following to ~/.bash_profile:
eval "$(rbenv init -)"
# Debian/Ubuntu:
# Load rbenv automatically by appending
# the following to ~/.bashrc:
eval "$(rbenv init -)"
Follow the provided information and add the mentioned line to your shell environment.
Next we need to take care on possible ways to install ruby versions. This is not part of rbenv directly but placed into a separate repository which delivers an extension to rbenv: ruby-build
Just run the following git command will place the code into proper location:
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
Remember to refresh your shell:
exec bash
Verify functionality of rbenv:
rbenv version
This should return the following output:
system (set by /home/tuxmea/.rbenv/version)
Install ruby versions
Puppet 4 uses Ruby 2.1.9, Puppet 5 uses Ruby 2.4.1
Install both ruby version by running the following command:
rbenv install 2.1.9
Verify installation of new ruby version:
$rbenv versions
2.1.9
Install ruby basic extensions
Now we activate the ruby version to install some basic ruby extensions which are required for further development:
rbenv shell 2.1.9
gem install bundler wirble pry
rbenv shell --unset
Bundler is used to install ruby extensions required by some development into another path. This allows you to run development and testing even when there is version mismatch between some application you are working on.
Wirble is an irb (interactive ruby shell) extension which offers syntax highlighting and tab completion.
Pry is a ruby debugger. During development one can set breakpoints where pry will open an irb session within the running application.
Configuration for wirble irb extension is done in ~/.irbrc
require 'rubygems'
require 'wirble'
Wirble.init
Wirble.colorize
Wirble and pry are not required for Puppet testing, but recommended extensions for development of custom facts, functions, types or providers.
Repeat the steps mentioned above with ruby version 2.4.1 to be prepared for Puppet 5 code testing!
GIT Prompt
As we are working on a GIT repository, it is highly recommended to have an informative shell prompt delivering information about your actual repository state.
For bash shells one wants to check git bash prompt, for zsh shells one might consider using oh my zsh.
For git bash prompt the following steps are required:
cd ~
git clone https://github.com/magicmonty/bash-git-prompt.git .bash-git-prompt --depth=1
Now enable the git bash prompt in your shell:
# RedHat/CentOS/OS X/macOS:
cat <<- EOF >> ~/.bash_profile
# git bash prompt
GIT_PROMPT_ONLY_IN_REPO=1
source ~/.bash-git-prompt/gitprompt.sh
EOF
# Debian/Ubuntu:
cat << EOF >> ~/.bashrc
# git bash prompt
GIT_PROMPT_ONLY_IN_REPO=1
source ~/.bash-git-prompt/gitprompt.sh
EOF
Don’t forget to reinitialize your shell exec bash
Start working on PSICK
Now clone the PSICK repository:
git clone https://github.com/example42/psick.git
When changing into the psick directory the default ruby version is selected automatically by using content from .ruby-version file. Additionally you will se the default branch at the shell prompt:
[mea@puppet ~]$
[mea@puppet ~]$ cd psick/
✔ ~/psick [production L|✔]
Now it is possible to install all ruby gems required for testing into a separate path:
bundle install --path vendor
Next you can run tests. Tests are not yet complete but under development.
# e.g.
# get puppet version used for testing
bundle exec puppet --version
# list all rake tasks
bundle exec rake -T
# install modules from Puppetfile
bundle exec r10k puppetfile install -v
Happy testing, developing and puppetizing.
Martin Alfke