aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/hydra/deploy101
-rwxr-xr-xshare/hydra/deploy38
-rwxr-xr-xshare/hydractl/deploy55
3 files changed, 121 insertions, 73 deletions
diff --git a/lib/hydra/deploy b/lib/hydra/deploy
new file mode 100644
index 0000000..f537c42
--- /dev/null
+++ b/lib/hydra/deploy
@@ -0,0 +1,101 @@
+#!/bin/bash
+
+# Setup deployment parameters
+# TODO: check environment passing to sudo, chroot and ssh
+function hydra_deploy_setup {
+ # Common parameters
+ # Exclude eventual keys and version control files
+ DEPLOY_RSYNC="rsync -CrltDv --no-perms --exclude=keys --exclude=hiera/secrets --delete"
+
+ if [ "$1" == "remote" ]; then
+ # Deploy in a local folder
+ if [ ! -z "$2" ]; then
+ NODE="$2"
+ DEPLOY_COMMAND="$HYDRA_CONNECT $NODE sudo"
+ DEPLOY_RSYNC="$DEPLOY_RSYNC --rsync-path \"sudo rsync\" $HYDRA_FOLDER/puppet/ $NODE:/etc/puppet/"
+ FQDN="`$DEPLOY_COMMAND facter fqdn`"
+ DEPLOY_DEST="$FQDN:"
+ DEPLOY_COPY="$DEPLOY_RSYNC"
+ 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_RSYNC="$DEPLOY_RSYNC $HYDRA_FOLDER/puppet/ $FOLDER/etc/puppet/"
+ DEPLOY_COPY="$SUDO cp"
+ 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_COMMAND="$SUDO"
+ FQDN="`facter fqdn`"
+ PUPPET_OPTS="--confdir=$HYDRA_FOLDER/puppet --modulepath=$HYDRA_FOLDER/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/$DOMAIN/$FQDN.yaml`"
+ LOCATION="`hydra_yaml_param nodo::location $HYDRA_FOLDER/$DOMAIN/$FQDN.yaml`"
+ DEPLOY_ENV="LC_ALL=C FACTER_role=$ROLE FACTER_location=$LOCATION"
+ DEPLOY_PUPPET="$DEPLOY_ENV puppet appy $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
+}
+
+# Create hiera folder structure
+function hydra_hiera_copy {
+ $DEPLOY_COMMAND mkdir -p $FOLDER/etc/puppet/secrets/{domain,location,node,role}
+
+ if [ ! -z "$DOMAIN" ] && [ -e "$HYDRA_FOLDER/puppet/hiera/secrets/domain/$DOMAIN.yaml" ]; then
+ $DEPLOY_COPY $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/domain/$LOCATION.yaml" ]; then
+ $DEPLOY_COPY $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/domain/$ROLE.yaml" ]; then
+ $DEPLOY_COPY $HYDRA_FOLDER/puppet/hiera/secrets/location/$ROLE.yaml $DEPLOY_DEST/etc/puppet/hiera/secrets/role/
+ fi
+}
diff --git a/share/hydra/deploy b/share/hydra/deploy
index 940c17b..0afd879 100755
--- a/share/hydra/deploy
+++ b/share/hydra/deploy
@@ -32,40 +32,16 @@ fi
for node in $NODES; do
echo "Deploying to $node..."
- # Saner defaults
- $HYDRA_CONNECT $node sudo mkdir -p /etc/puppet
- $HYDRA_CONNECT $node sudo chown -R root. /etc/puppet
- $HYDRA_CONNECT $node sudo chmod -R 640 /etc/puppet
+ # Setup deploy environment
+ hydra_deploy_setyp remote $node
+ hydra_deploy_mkdirs
# Sync repository to server
- # Exclude eventual keys and version control files
- rsync -CrltDv --no-perms --exclude=keys --exclude=hiera/secrets --delete --rsync-path "sudo rsync" $HYDRA_FOLDER/puppet/ $node:/etc/puppet/
+ $DEPLOY_RSYNC
- # Setup custom facts
- FQDN="`$HYDRA_CONNECT $node facter fqdn`"
- 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'`"
-
- # 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
-
- # Copy needed hiera YAMLs
- $HYDRA_CONNECT $node sudo mkdir -p $FOLDER/etc/puppet/secrets/{domain,location,node,role}
- $HYDRA_CONNECT $node sudo cp $HYDRA_FOLDER/puppet/hiera/secrets/domain/$DOMAIN.yaml $FOLDER/etc/puppet/hiera/domain/
- $HYDRA_CONNECT $node sudo cp $HYDRA_FOLDER/puppet/hiera/secrets/location/$LOCATION.yaml $FOLDER/etc/puppet/hiera/location/
- $HYDRA_CONNECT $node sudo cp $HYDRA_FOLDER/puppet/hiera/secrets/location/$ROLE.yaml $FOLDER/etc/puppet/hiera/role/
+ # Copy hiera configuration
+ hydra_hiera_copy
# Run puppet
- $HYDRA_CONNECT $node <<EOF
- ##### BEGIN REMOTE SCRIPT #####
- sudo chown -R root. /etc/puppet
- sudo chmod -R 640 /etc/puppet
- LC_ALL=C FACTER_role=$ROLE FACTER_location=$LOCATION \
- sudo puppet apply /etc/puppet/manifests/nodes/$FQDN.pp
- ##### END REMOTE SCRIPT #######
-EOF
+ $DEPLOY_APPLY
done
diff --git a/share/hydractl/deploy b/share/hydractl/deploy
index 9c82ddf..b488698 100755
--- a/share/hydractl/deploy
+++ b/share/hydractl/deploy
@@ -22,7 +22,6 @@ hydra_config_load
# Parameters
FOLDER="$1"
-FQDN="`facter fqdn`"
# Set sudo config
local sudo device rsync
@@ -32,55 +31,27 @@ 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
+ # Setup deploy environment
+ hydra_deploy_setyp remote $node
+ hydra_deploy_mkdirs
# Sync repository to server
- # Exclude eventual keys and version control files
- $sudo rsync -CrltDv --no-perms --exclude=keys --exclude=hiera/secrets --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'`"
+ $DEPLOY_RSYNC
- # Copy needed hiera YAMLs
- $sudo mkdir -p $FOLDER/etc/puppet/secrets/{domain,location,node,role}
- $sudo cp $HYDRA_FOLDER/puppet/hiera/secrets/domain/$DOMAIN.yaml $FOLDER/etc/puppet/hiera/domain/
- $sudo cp $HYDRA_FOLDER/puppet/hiera/secrets/location/$LOCATION.yaml $FOLDER/etc/puppet/hiera/location/
- $sudo cp $HYDRA_FOLDER/puppet/hiera/secrets/location/$ROLE.yaml $FOLDER/etc/puppet/hiera/role/
-
- # 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
+ # Copy hiera configuration
+ hydra_hiera_copy
# Run puppet
- LC_ALL=C FACTER_role=$ROLE FACTER_location=$LOCATION \
- $sudo chroot $FOLDER puppet apply /etc/puppet/manifests/nodes/$FQDN.pp
+ $DEPLOY_APPLY
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'`"
+ echo "Deploying to localhost..."
+
+ # Setup deploy environment
+ hydra_deploy_setup
+ # TODO: override FQDN and DOMAIN
# 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
+ $DEPLOY_APPLY
fi