Skip to content

Instantly share code, notes, and snippets.

@jamescun
Created December 14, 2012 22:05
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save jamescun/4289083 to your computer and use it in GitHub Desktop.
Save jamescun/4289083 to your computer and use it in GitHub Desktop.
Sync puppet manifests and modules with a remote HTTP server and execute puppet apply
#!/bin/sh
# Masterless Puppet Script
# Copyright (C) 2012 James Cunningham <j@goscale.com>
# All Rights Reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the <organization> nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# Server Config
MANIFEST_SERVER="https://127.0.0.1" # Remote Server To Sync
AUTH_HTTP_USER=$(/bin/hostname --fqdn) # Username For Auth
AUTH_HTTP_PASS="secure-password" # Password For Auth
REMOTE_MANIFEST_DIR="/manifests/" # Remote Directory for manifests
REMOTE_MODULES_DIR="/modules/" # Remote Directory for modules
MANIFEST_DIR=/etc/puppet/manifests/ # Directory to sync manifests
MODULES_DIR=/etc/puppet/modules/ # Directory to sync modules
# Update Manifests using WGet
echo "== Syncing manifests with master..."
/usr/bin/wget --mirror -q \
--no-host-directories --no-parent --cut-dirs=1 \
--reject="index.html*" \
--http-user=$AUTH_HTTP_USER --http-password=$AUTH_HTTP_PASS \
--directory-prefix=$MANIFEST_DIR \
$MANIFEST_SERVER$REMOTE_MANIFEST_DIR
# Test Sync
WGET_EXIT=$?
if [ $WGET_EXIT -ne 0 ]; then
echo " - Failed to sync manifests with remote server. Exit Code $WGET_EXIT"
exit 1
fi
echo " + Synced manifests with master successful"
# Update Modules using WGet
echo "== Syncing modules with master..."
/usr/bin/wget --mirror -q \
--no-host-directories --no-parent --cut-dirs=1 \
--reject="index.html*" \
--http-user=$AUTH_HTTP_USER --http-password=$AUTH_HTTP_PASS \
--directory-prefix=$MODULES_DIR \
$MANIFEST_SERVER$REMOTE_MODULES_DIR
# Test Sync
WGET_EXIT=$?
if [ $WGET_EXIT -ne 0 ]; then
echo " - Failed to sync modules with remote server. Exit Code $WGET_EXIT"
exit 1
fi
echo " + Synced modules with master successful"
# Run Puppet
echo "== Beginning Puppet Apply"
/usr/bin/puppet apply --modulepath=$MODULES_DIR $MANIFEST_DIR/init.pp
# Test Puppet
PUPPET_EXIT=$?
if [ $PUPPET_EXIT -ne 0 ]; then
echo " - Failed to apply puppet config. Exit Code $PUPPET_EXIT"
exit 2
fi
echo " + Applied Puppet Config"
echo "== Masterless Puppet Complete"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment