#!/bin/bash # Setup deployment parameters function hydra_deploy_setup { # Common parameters # Exclude eventual keys and version control files DEPLOY_DEPENDENCIES="puppet ruby-sqlite3 ruby-activerecord ruby-activerecord-deprecated-finders" DEPLOY_RSYNC="rsync -CrltDv --no-perms --exclude=/ssl --exclude=keys --exclude=site_keys --exclude=hiera/secrets --delete --rsync-path" RSYNC_PATH="rsync" COPY_PATH="" if [ "$1" == "remote" ]; then # Deploy in a local folder if [ ! -z "$2" ]; then NODE="$2" DEPLOY_COMMAND="$HYDRA_CONNECT $NODE sudo" RSYNC_PATH="sudo rsync" DEPLOY_OPTS="$HYDRA_FOLDER/puppet/ $NODE:/etc/puppet/" FQDN="`$DEPLOY_COMMAND cat /etc/hostname`" DEPLOY_DEST="$FQDN:" COPY_PATH="$RSYNC_PATH" PUPPET_MANIFEST="/etc/puppet/manifests/nodes/$FQDN.pp" else echo "No folder specified." exit 1 fi elif [ "$1" == "folder" ]; then # Deploy in a remote host if [ ! -z "$2" ]; then FOLDER="$2" DEPLOY_COMMAND="$SUDO chroot $FOLDER" DEPLOY_OPTS="$HYDRA_FOLDER/puppet/ $FOLDER/etc/puppet/" DEPLOY_DEST="$FOLDER" PUPPET_MANIFEST="/etc/puppet/manifests/nodes/$FQDN.pp" 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 else echo "No node specified." exit 1 fi else # Deploy on the localhost DEPLOY_RSYNC="" DEPLOY_COMMAND="$SUDO" FQDN="`cat /etc/hostname`" PUPPET_OPTS="--confdir=$HYDRA_FOLDER/puppet --modulepath=$HYDRA_FOLDER/puppet/modules" PUPPET_MANIFEST="$HYDRA_FOLDER/puppet/manifests/nodes/$FQDN.pp" fi # Common parameters DOMAIN="`echo $FQDN | cut -d . -f 2-`" ROLE="`hydra_yaml_param nodo::role $HYDRA_FOLDER/puppet/hiera/node/$FQDN.yaml`" LOCATION="`hydra_yaml_param nodo::location $HYDRA_FOLDER/puppet/hiera/node/$FQDN.yaml`" DEPLOY_PUPPET="LC_ALL=C puppet apply $PUPPET_OPTS $PUPPET_MANIFEST" DEPLOY_APPLY="$DEPLOY_COMMAND $DEPLOY_PUPPET" # 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 } # Return a simple parameter from an YAML file function hydra_yaml_param { local param="$1" local file="$2" grep "^$param: " $file | cut -d ' ' -f 2 | sed -e "s/'//g" -e 's/"//g' } # Create puppet folder structure function hydra_deploy_mkdirs { # Saner defaults $DEPLOY_COMMAND mkdir -p /etc/puppet $DEPLOY_COMMAND chown -R root. /etc/puppet $DEPLOY_COMMAND chmod -R 640 /etc/puppet } # Copy hiera secrets function hydra_deploy_copy_secrets { local location="$1" if [ -z "$location" ]; then location="remote" fi $DEPLOY_COMMAND mkdir -p $FOLDER/etc/puppet/hiera/secrets/{domain,location,node,role} if [ ! -z "$DOMAIN" ] && [ -e "$HYDRA_FOLDER/puppet/hiera/secrets/domain/$DOMAIN.yaml" ]; then hydra_deploy_copy $location $HYDRA_FOLDER/puppet/hiera/secrets/domain/$DOMAIN.yaml $DEPLOY_DEST/etc/puppet/hiera/secrets/domain/ fi if [ ! -z "$LOCATION" ] && [ -e "$HYDRA_FOLDER/puppet/hiera/secrets/location/$LOCATION.yaml" ]; then hydra_deploy_copy $location $HYDRA_FOLDER/puppet/hiera/secrets/location/$LOCATION.yaml $DEPLOY_DEST/etc/puppet/hiera/secrets/location/ fi if [ ! -z "$ROLE" ] && [ -e "$HYDRA_FOLDER/puppet/hiera/secrets/role/$ROLE.yaml" ]; then hydra_deploy_copy $location $HYDRA_FOLDER/puppet/hiera/secrets/role/$ROLE.yaml $DEPLOY_DEST/etc/puppet/hiera/secrets/role/ fi if [ ! -z "$FQDN" ] && [ -e "$HYDRA_FOLDER/puppet/hiera/secrets/node/$FQDN.yaml" ]; then hydra_deploy_copy $location $HYDRA_FOLDER/puppet/hiera/secrets/node/$FQDN.yaml $DEPLOY_DEST/etc/puppet/hiera/secrets/node/ fi } # Copy a single file function hydra_deploy_copy { local location="$1" local orig="$2" local dest="$3" if [ "$location" == "folder" ]; then $SUDO cp $orig $dest elif [ "$location" == "remote" ]; then $DEPLOY_RSYNC "$RSYNC_PATH" $orig $dest fi }