#!/bin/bash # # Deploy configuration using puppet. # # Parameters DIRNAME="`dirname $0`" BASEDIR="$DIRNAME/.." # Install dependencies source $DIRNAME/dependencies # Determine hostname #if [ ! -z "$1" ]; then # FQDN="$1" #else # FQDN="`cat /etc/hostname`" #fi #FQDN="`facter fqdn`" FQDN="`cat /etc/hostname`" # Set manifest PUPPET_MANIFEST="$BASEDIR/manifests/nodes/$FQDN.pp" if [ ! -e "$PUPPET_MANIFEST" ]; then PUPPET_MANIFEST="$BASEDIR/manifests/nodes/default.pp" fi # Check manifest if [ ! -e "$PUPPET_MANIFEST" ]; then echo "No manifest found for $FQDN" exit 1 fi # Ensure additional dependencies are installed. for package in $DEPLOY_DEPENDENCIES; do provision_package $package done # Parameters that needs dependencies installed DIST="`facter lsbdistcodename`" # Apply patches if [ -d "$BASEDIR/puppet/files/patches/$DIST" ]; then ( # Patches should be generated relativelly to the root folder cd / # Only apply if needed # Thanks https://unix.stackexchange.com/questions/55780/check-if-a-file-or-folder-has-been-patched-already for patch in `ls $BASEDIR/puppet/files/patches/$DIST`; do patch -p0 -N --dry-run --silent < $BASEDIR/puppet/files/patches/$DIST/$patch &> /dev/null # If the patch has not been applied then the $? which is the exit status # for last command would have a success status code = 0 if [ "$?" == "0" ]; then # Apply the patch patch -p0 -N < $BASEDIR/puppet/files/patches/$DIST/$patch fi done ) fi # Check for Puppetfile if [ -e "$BASEDIR/Puppetfile" ]; then if which r10k &> /dev/null; then ( cd $BASEDIR && $SUDO r10k puppetfile install -v ) elif which librarian-puppet &> /dev/null; then ( cd $BASEDIR && $SUDO librarian-puppet install ) fi fi # Setup facts ROLE="`hydractl yaml-param nodo::role $BASEDIR/config/node/$FQDN.yaml default`" LOCATION="`hydractl yaml-param nodo::location $BASEDIR/config/node/$FQDN.yaml default`" $SUDO mkdir -p /etc/facter/facts.d $SUDO echo "role=$ROLE" | $SUDO tee /etc/facter/facts.d/role.txt > /dev/null $SUDO echo "location=$LOCATION" | $SUDO tee /etc/facter/facts.d/location.txt > /dev/null # Run puppet apply PUPPET_OPTS="--confdir=$BASEDIR --modulepath=$BASEDIR/modules" LC_ALL=C $SUDO puppet apply $PUPPET_OPTS $PUPPET_MANIFEST