Skip to content

Ssh resource model generator

ahonor edited this page Dec 14, 2010 · 11 revisions

This script may help you get started creating a resource model for your RunDeck Project. Given a set of hosts, this script will SCP a collection script and execute it. The results are then copied back and then aggregated.

Usage

The script takes several options but without any arugments, it will read hosts from stdin and copy and execute it's built in script template.

Read hosts from stdin

  echo "dev01" | $PROG > resources.xml

Read hosts from a file

  $PROG -f hostsfile > resources.xml

Use an external collection script

  $PROG -f hostsfile -s myscript.sh > resources.xml

Discovering hosts

Hosts lists can be generated with a tool like nmap. Here an nmap script returns hosts listening on SSH port 22 on the specified subnet:

 nmap -sP 10.0.1.* -PS22 -oG nmap.out && \
     awk '/Status: Up/ {print $2}' nmap.out > hosts

File listing


#!/bin/bash
# Requires: mktemp
#
# DESCRIPTION
#  Takes a set of newline delimited hosts and runs a remote
#  script to collect host metadata to generate resources.xml document. 
#


die() { echo $* 1>&2 ; exit 1 ; }

PROG=`basename $0`
WORKSPACE=$(mktemp -d /tmp/${PROG}.XXXX) || die
SSH_ARGS=

# Option defaults
SSH_USER=$(whoami)
VERBOSE=0
NODE_SCRIPT=
HOST_FILE=
SSHID_FILE=
usage()
{
cat <&2 ; } }

[ -s "$HOST_FILE" -a ! -r "$HOST_FILE" ] && {
    die "file not readable: $HOST_FILE"
}
[ -s "$SSHID_FILE" -a ! -r "$SSHID_FILE" ] && {
    die "file not readable: $SSHID_FILE"
} || {
    SSH_ARGS="$SSH_ARGS -i $SSHID_FILE"
}

mkdir -p ${WORKSPACE} || { die "Failed creating data directory: $WORKSPACE" ; }

if [ -z "${NODE_SCRIPT}" ] 
then
NODE_SCRIPT=`mktemp ${WORKSPACE}/node-collect.XXXX`
# here doc generates collection script template
cat > ${NODE_SCRIPT} <" > \$outputfile
EOF
fi

# Reasign fd0 to the specified host file
[ -f "$HOST_FILE" ] && { exec 0<> $HOST_FILE ; }

verbose "{SSH_USER=\"$SSH_USER\", WORKSPACE=\"$WORKSPACE\", HOST_FILE=\"$HOST_FILE\", SSH_ARGS=\"$SSH_ARGS\"}"

numProcessed=0
while read line
do
    echo $line | egrep -q '^#' && continue ;#skip comment lines
    hostinfo=( $line )                     ;#parse the line into an array
    [ ${#hostinfo[*]} -lt 1 ]  && continue ;#skip lines with no info
    host=${hostinfo[0]}
    verbose "collecting node info from host: ${host} ..."
    scp $SSH_ARGS $NODE_SCRIPT ${SSH_USER}@${host}:/tmp/$(basename $NODE_SCRIPT) || {
	die "Failed copying collection script on host: ${host}"
    }
    ssh $SSH_ARGS -n ${SSH_USER}@${host} sh /tmp/$(basename $NODE_SCRIPT) /tmp/node.xml.$$ || {
     	die "Failed executing collection script on host: ${host}"
    }
    scp $SSH_ARGS ${SSH_USER}@${host}:/tmp/node.xml.$$ ${WORKSPACE}/${host}.xml || {
    	die "Failed copying resources data from host: ${host}"
    }
    numProcessed=$(expr "$numProcessed" + 1)
done 

if [ "$numProcessed" -gt 0 ]
then
    verbose "Generating resources.xml for $i hosts ..."
    echo "" 
    cat ${WORKSPACE}/*.xml || die "Failure due to internal script error"
    echo ""
    verbose "Done."
fi

#
# clean up the temporary files
#
verbose "cleaning up temporary files"
rm -rf ${WORKSPACE}