#!/bin/bash # # Deploy a node using automated recipes. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public # License along with this program. If not, see # . # Load. source $APP_BASE/lib/hydra/functions || exit 1 hydra_config_load # Parameters FOLDER="$1" FQDN="`facter fqdn`" # Set sudo config local sudo device rsync if [ "`whoami`" != 'root' ]; then sudo="sudo" fi # Dispatch if [ ! -z "$FOLDER" ]; then if [ ! -d "$FOLDER"]; then echo "folder not found: $FOLDER" exit 1 fi # Fix hostname if [ -s "$FOLDER/etc/hostname" ]; then FQDN="`cat $FOLDER/etc/hostname`" fi echo "Deploying to $FOLDER..." # Saner defaults $sudo mkdir -p $FOLDER/etc/puppet $sudo chown -R root. $FOLDER/etc/puppet $sudo chmod -R 640 $FOLDER/etc/puppet # Sync repository to server # Exclude eventual keys and version control files $sudo rsync -CrltDv --no-perms --exclude=keys --exclude=hiera --delete $HYDRA_FOLDER/puppet/ $FOLDER/etc/puppet/ # Setup custom facts DOMAIN="`echo $FQDN | cut -d . -f 2-`" ROLE="`grep "^nodo::role: " domain/$DOMAIN/$FQDN.yaml | cut -d ' ' -f 2 | sed -e "s/'//g" -e 's/"//g'`" LOCATION="`grep "^nodo::location: " domain/$DOMAIN/$FQDN.yaml | cut -d ' ' -f 2 | sed -e "s/'//g" -e 's/"//g'`" # Copy needed hiera YAMLs $sudo mkdir -p $FOLDER/etc/puppet/{domain,location,node,role,virtual} $sudo cp $HYDRA_FOLDER/puppet/hiera/domain/$DOMAIN.yaml $FOLDER/etc/puppet/hiera/domain/ $sudo cp $HYDRA_FOLDER/puppet/hiera/location/$LOCATION.yaml $FOLDER/etc/puppet/hiera/location/ $sudo cp $HYDRA_FOLDER/puppet/hiera/location/$ROLE.yaml $FOLDER/etc/puppet/hiera/role/ $sudo rsync -av --delete $HYDRA_FOLDER/puppet/hiera/virtual/ $FOLDER/etc/puppet/hiera/virtual/ # Check for manifest if [ ! -e "$HYDRA_FOLDER/puppet/manifests/nodes/$FQDN.pp" ]; then echo "Not found: $HYDRA_FOLDER/puppet/manifests/nodes/$FQDN.pp" exit 1 fi # Run puppet LC_ALL=C FACTER_role=$ROLE FACTER_location=$LOCATION \ $sudo chroot $FOLDER puppet apply /etc/puppet/manifests/nodes/$FQDN.pp elif [ -e "$HYDRA_FOLDER/puppet/manifests/nodes/$FQDN.pp" ]; then # Setup custom facts DOMAIN="`echo $FQDN | cut -d . -f 2-`" ROLE="`grep "^nodo::role: " domain/$DOMAIN/$FQDN.yaml | cut -d ' ' -f 2 | sed -e "s/'//g" -e 's/"//g'`" LOCATION="`grep "^nodo::location: " domain/$DOMAIN/$FQDN.yaml | cut -d ' ' -f 2 | sed -e "s/'//g" -e 's/"//g'`" # Run puppet LC_ALL=C FACTER_role=$ROLE FACTER_location=$LOCATION \ $sudo puppet apply --confdir=$HYDRA_FOLDER/puppet \ --modulepath=$HYDRA_FOLDER/modules $HYDRA_FOLDER/puppet/manifests/nodes/$FQDN.pp fi