Convert the DPK to use Hiera Hash Merging
Aug 08, 2017Dan Iverson
The way PeopleSoft delivers Puppet and the Hiera backend, is that everything you define in psft_customizations.yaml
overrides configuration defined elsewhere. This is a useful setup when getting started with the DPK and Puppet. But when using YAML files to manage your configuration across multiple servers, you’ll quickly find that you are re-entering the same configuration in many files.
Hiera, the tool Puppet uses to read YAML files, has multiple ways to look up data. First, let’s cover what a YAML hash is. A hash is a key-value structure used in the DPK to store configuration. For example, this is the hash for PS_HOME information:
ps_home:
db_type: "%{hiera('db_platform')}"
unicode_db: "%{hiera('unicode_db')}"
location: "%{hiera('ps_home_location')}"
remove: true
The main hash key is ps_home
, and its value is all the configuration below it. The next level down has 4 keys with 4 corresponding values. The appserver_domain_list
hash is a large one that contains all the configuration for one or more app server domains.
Under the delivered setup, if you want to change a value for a domain you need to copy the entire appserver_domain_list
hash into your psft_customizations.yaml
file and make the change. With Hiera hashing, you could define your domains in a file named appservers.yaml
and any specific server changes can be defined in hostname.yaml
. For example, the hostname.yaml
file could contain this hash to override a configuration:
appserver_domain_list:
DEV:
feature_settings:
SERVER_EVENTS: "Yes"
DOMAIN_GW: "Yes"
This provides far more flexibility when working with YAML files, but it does introduce some complexity. If you want to give this a try, here is how you can convert the current DPK to use Hiera hasing.
Find/Replace
I used VisualStudio Code to do the find/replace. Open up the etc\modules
directory and do these against the modules\pt_profile
folder:
- Find:
hiera('tns_admin_list
- Replace:
hiera_hash('tns_admin_list
I repeated this step for the following lookups.
tns_admin_list
appserver_domain_list
prcs_domain_list
pia_domain_list
You don’t want to replace all the lookups – that will cause errors. But, you can replace additional lookups if you want. Anything that is a hash in YAML files can use the hiera_hash()
lookup function. If you wanted to make the ps_home:
key support hash merging, you could replace hiera('ps_home
with hiera_hash('ps_home
.
Change the Hiera Merge Behavior
By default, Hiera will look at the top-level keys of a hash and not merge the underlying settings. Hiera hashing will merge all the values inside the hash. This means you can you define a hash with default settings in a common file (e.g, default app server settings). Then you can specify server or application specific settings in a YAML file for that domain or server.
To enable the hash merging, open the hiera.yaml
file under c:\programdata\puppetlabs\hiera\etc
.
Add this line to the file:
:merge_behavior: deeper
Hiera Lookup Order
With Hiera hash merging, we can utilize more than the psft_customizations.yaml
file to manage our configuration. We can use multiple YAML files to control our configuration. For example, we could have:
[hostname].yaml
dev.yaml
hr.yaml
common.yaml
So, this setup would let us define common configuration that is shared across all applications in the common.yaml
. Next, we could define anything related to servers that run HR applications in the hr.yaml
. For any settings that are specific to the Development region, we can add them into dev.yaml
. Last, for anything that is specific to the server, we can add into the [hostname].yaml
file. This setup would let you re-use the common
, hr
, and dev
YAML files across multiple servers, and anything specific to the server would be defined in [hostname].yaml
.
In the hiera.yaml
file, we can define this setup like this:
:hierarchy:
- "%{::hostname}"
- dev
- hr
- common
Test Hiera Hashing
On the command line, you can use the hiera
utility to test lookups with Hiera. To do a normal Hiera lookup, use
hiera appserver_domain_list
To test a hiera hash lookup, use
hiera --hash appserver_domain_list
If you have multiple YAML files with the appserver_domain_list
hash, the first option will only show you the results from the top of the list. The second test should show you a merged appserver_domain_list
hash.
Note: This was originally posted by Dan Iverson and has been transferred from a previous platform. There may be missing comments, style issues, and possibly broken links. If you have questions or comments, please contact [email protected].