mirror of
https://github.com/postmannen/ctrl.git
synced 2024-12-14 12:37:31 +00:00
added mini-steward script
This commit is contained in:
parent
c3866a8617
commit
3a66b81750
4 changed files with 288 additions and 0 deletions
42
scripts/mini-steward/README.md
Normal file
42
scripts/mini-steward/README.md
Normal file
|
@ -0,0 +1,42 @@
|
|||
# mini-steward
|
||||
|
||||
Loop over all lines of host ip addresses specified in the hosts.txt
|
||||
file, and execute the the script with the id.rsa given as the input argument.
|
||||
This script will run until done, to kill it use:
|
||||
|
||||
```bash
|
||||
CTRL+z
|
||||
pkill -f loop-wrapper
|
||||
```
|
||||
|
||||
## Overview
|
||||
|
||||
- This is a helper script that will copy a script you want to run on one or more nodes, and execute it.
|
||||
- The result of running the script will be returned in the `status.log` file.
|
||||
- The script wil continue running until execution on all nodes are succesful.
|
||||
- The result when successful run on a host will be written to the `done.log` file, with the output specified.
|
||||
|
||||
## Usage
|
||||
|
||||
Specify the the hosts to execute the script on in the `hosts.txt` file, notation `ip-address,node-name` separated by new lines.
|
||||
|
||||
Example :
|
||||
|
||||
```text
|
||||
10.0.0.1,node1
|
||||
10.0.0.2,node2
|
||||
```
|
||||
|
||||
And start running the script with:
|
||||
|
||||
```bash
|
||||
./loop-wrapper <script-to-copy-and-execute> <path-to-id.rsa file>
|
||||
```
|
||||
|
||||
### The script to be executed
|
||||
|
||||
To get the output written to `done.log` from the script that have been copied and ran on the nodes, it should write the desired output to `STDOUT` as it's last thing before calling `exit 0`.
|
||||
|
||||
The same goes for error messages.
|
||||
|
||||
See more details in the `test.sh` file for an example.
|
0
scripts/mini-steward/hosts.txt
Normal file
0
scripts/mini-steward/hosts.txt
Normal file
135
scripts/mini-steward/loop-wrapper.sh
Executable file
135
scripts/mini-steward/loop-wrapper.sh
Executable file
|
@ -0,0 +1,135 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Loop over all lines of host ip addresses specified in the hosts.txt
|
||||
# file, and execute the the script given as the input argument. If no
|
||||
# script is given as argument the scriptName specified below will be
|
||||
# used.
|
||||
# This script will run until done, to kill it use
|
||||
# > CTRL+z
|
||||
# > pkill -f loop-wrapper
|
||||
###
|
||||
# Info: change out the script in scriptName below with the executable
|
||||
# script you want copied to host, and executed.
|
||||
###
|
||||
# Environmental variables can be passed on to the host if needed by
|
||||
# embedding them directly in the ssh command. See below.
|
||||
#
|
||||
# sshOut=$(ssh -o ConnectTimeout=$sshTimeout -n -i $idRsaFile "$sshUser"@"$ipAddress" "sudo bash -c 'export NODENAME="$name"; $scpDestinationFolder/$scriptName'" 2>&1)
|
||||
# Here we are exporting NODENAME set to the current value of $name when
|
||||
# starting the ssh session, and then the script called on host can take
|
||||
# use of it directly.
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
echo "No script to call supplied"
|
||||
echo "Usage: ./loop-wrapper <my-script> <id.rsa>"
|
||||
exit 1
|
||||
else
|
||||
scriptSourcePath=$(dirname "$1")"/"
|
||||
echo "scriptSourcePath=$scriptSourcePath"
|
||||
scriptName=$(basename "$1")
|
||||
echo "scriptName=$scriptName"
|
||||
fi
|
||||
|
||||
if [ -z "$2" ]; then
|
||||
echo "No id.rsa file supplied"
|
||||
echo "Usage: ./loop-wrapper <my-script> <id.rsa>"
|
||||
exit 1
|
||||
else
|
||||
idRsaFile=$2
|
||||
fi
|
||||
|
||||
pingTimeout=3
|
||||
|
||||
statusLog="./status.log"
|
||||
touch $statusLog
|
||||
|
||||
notDoneFile="./notdone.tmp"
|
||||
doneFile="./done.log"
|
||||
touch $doneFile
|
||||
|
||||
# The file containing the ip adresses to work with.
|
||||
# One address per line.
|
||||
hostsFile="./hosts.txt"
|
||||
|
||||
sshTimeout=30
|
||||
sshUser=ansible
|
||||
scpDestinationFolder=/home/$sshUser
|
||||
|
||||
# Loop until notDoneFile is empty. Checked in the end of loop.
|
||||
while true; do
|
||||
touch $notDoneFile
|
||||
|
||||
# Read from the hosts.txt file one line at a time
|
||||
# and execute..
|
||||
while IFS=, read -r ipAddress name; do
|
||||
if [[ -z "$name" ]]; then
|
||||
echo "error: missing name for ip $ipAddress in hosts.txt. Should be <ip address>,<node name>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo working on :"$ipAddress","$name"
|
||||
|
||||
# Check if host is available
|
||||
if ping "$ipAddress" -c 1 -t $pingTimeout; then
|
||||
echo ok info:ping ok:"$name", "$ipAddress" >>$statusLog
|
||||
## Put whatever to execute here...
|
||||
## copy files&scripts to run on host.
|
||||
## Execute the copied files/scripts on host.
|
||||
# ----------------------------------------------
|
||||
# scp script file.
|
||||
if scp -o ConnectTimeout=$sshTimeout -o StrictHostKeyChecking=no -i $idRsaFile "$scriptSourcePath$scriptName" "$sshUser"@"$ipAddress":; then
|
||||
# Execute script file copied via ssh.
|
||||
sshOut=$(ssh -o ConnectTimeout=$sshTimeout -n -i $idRsaFile "$sshUser"@"$ipAddress" "sudo bash -c 'export NODENAME=$name; $scpDestinationFolder/$scriptName'" 2>&1)
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
echo ok info:succesfully executing ssh command: "$name", "$ipAddress"
|
||||
echo ok info:succesfully executing ssh command: "$name", "$ipAddress" >>$statusLog
|
||||
else
|
||||
echo error:failed executing ssh command: "$sshOut", "$ipAddress", "$name"
|
||||
echo error:failed executing ssh command: "$sshOut","$ipAddress", "$name" >>$statusLog
|
||||
echo "$ipAddress","$name" >>$notDoneFile
|
||||
continue
|
||||
fi
|
||||
else
|
||||
echo error:failed scp copying, not running ssh command:"$ipAddress", "$name"
|
||||
echo error:failed scp copying, not running ssh command:"$ipAddress", "$name" >>$statusLog
|
||||
echo "$ipAddress","$name" >>$notDoneFile
|
||||
continue
|
||||
|
||||
fi
|
||||
# ----------------------------------------------
|
||||
|
||||
echo "info: all done for host: " "$ipAddress", "$name"
|
||||
echo "info: all done for host: " "$ipAddress", "$name" >>$statusLog
|
||||
|
||||
echo "$ipAddress","$name","$sshOut" >>$doneFile
|
||||
else
|
||||
echo error: no ping reply: "$ipAddress", "$name"
|
||||
echo error: no ping reply: "$ipAddress", "$name" >>$statusLog
|
||||
|
||||
echo "$ipAddress","$name" >>$notDoneFile
|
||||
continue
|
||||
fi
|
||||
|
||||
done <./hosts.txt
|
||||
|
||||
# Check if notdone file is empty, loop if not empty,
|
||||
# and break out and exit if empty.
|
||||
if [ -s "$notDoneFile" ]; then
|
||||
# The file is not-empty.
|
||||
echo "the notDone file is not-empty, so we're looping"
|
||||
cp $notDoneFile "$hostsFile"
|
||||
rm $notDoneFile
|
||||
else
|
||||
# The file is empty, meaning.. we're done.
|
||||
echo "info: all done for all hosts, exiting: "
|
||||
echo "info: all done for all hosts, exiting: " >>$statusLog
|
||||
|
||||
cp $notDoneFile "$hostsFile"
|
||||
rm $notDoneFile
|
||||
break
|
||||
fi
|
||||
|
||||
sleep 2
|
||||
|
||||
done
|
111
scripts/mini-steward/test.sh
Executable file
111
scripts/mini-steward/test.sh
Executable file
|
@ -0,0 +1,111 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Script to be copied over to the host, and executed.
|
||||
# The script should exit with a line echoing out the
|
||||
# error or success message, and should then be followed
|
||||
# by an error code 0 if ok, and >0 if not ok.
|
||||
##
|
||||
# The HOSTNAME environmental variable is passed on to
|
||||
# the host when the ssh session are initiated within
|
||||
# the wrapper script. It is read from the hosts.txt
|
||||
# file which should be in the format:
|
||||
# 10.10.10.1,myhostnamehere
|
||||
|
||||
workdir=/usr/local/steward
|
||||
|
||||
# ------- Generate steward config
|
||||
|
||||
mkdir -p $workdir/etc
|
||||
touch $workdir/etc/config.toml
|
||||
|
||||
# The ${NODENAME} is exported directly in the ssh command in the loop-wrapper script
|
||||
cat >$workdir/etc/config.toml <<EOF
|
||||
BrokerAddress = "<INSERT_BROKER-ADDRESS-HERE>:40223"
|
||||
CentralNodeName = "central"
|
||||
ConfigFolder = "${workdir}/etc/"
|
||||
DatabaseFolder = "${workdir}/lib"
|
||||
DefaultMessageRetries = 1
|
||||
DefaultMessageTimeout = 10
|
||||
ExposeDataFolder = ""
|
||||
NatsConnectRetryInterval = 10
|
||||
NkeySeedFile = "${workdir}/seed.txt"
|
||||
NodeName = "${NODENAME}"
|
||||
ProfilingPort = "localhost:8090"
|
||||
PromHostAndPort = "localhost:2111"
|
||||
RootCAPath = ""
|
||||
SocketFolder = "/usr/local/steward/tmp"
|
||||
StartPubREQHello = 60
|
||||
SubscribersDataFolder = "/usr/local/steward/data"
|
||||
TCPListener = ""
|
||||
EOF
|
||||
|
||||
# ------- create systemctl
|
||||
progName="steward"
|
||||
systemctlFile=/etc/systemd/system/$progName.service
|
||||
|
||||
if test -f "$systemctlFile"; then
|
||||
if ! systemctl disable $progName.service >/dev/null 2>&1; then
|
||||
echo "*" error: systemctl disable progName.service
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! systemctl stop $progName.service >/dev/null 2>&1; then
|
||||
echo "*" error: systemctl stop $progName.service
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! rm $systemctlFile >/dev/null 2>&1; then
|
||||
echo "*" error: removing $systemctlFile service file
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
#echo "*" creating systemd $progName.service
|
||||
cat >$systemctlFile <<EOF
|
||||
[Unit]
|
||||
Description=http->${progName} service
|
||||
Documentation=https://github.com/RaaLabs/steward
|
||||
After=network-online.target nss-lookup.target
|
||||
Requires=network-online.target nss-lookup.target
|
||||
|
||||
[Service]
|
||||
ExecStart=env CONFIG_FOLDER=/usr/local/steward/etc /usr/local/steward/steward
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
# ------- generate nats keys
|
||||
|
||||
errorMessage=$(
|
||||
# Redirect stderr to stdout for all command with the closure.
|
||||
{
|
||||
# Generate private nk key
|
||||
/usr/local/bin/nk -gen user >$workdir/seed.txt &&
|
||||
# Generate public nk key
|
||||
/usr/local/bin/nk -inkey $workdir/seed.txt -pubout >$workdir/user.txt &&
|
||||
chmod 600 $workdir/seed.txt &&
|
||||
chmod 600 $workdir/user.txt &&
|
||||
systemctl enable $progName.service &&
|
||||
systemctl start $progName.service
|
||||
} 2>&1
|
||||
)
|
||||
|
||||
# ------- We're done, send output back to ssh client
|
||||
|
||||
# Check if all went ok with the previous command sequence, or if any errors happened.
|
||||
# We return any result back to the ssh sessions which called this script by echoing
|
||||
# the result, and do an exit <error code>.
|
||||
# We can return one line back, so if more values are needed to be returned, they have
|
||||
# to be formated into the same line.
|
||||
#
|
||||
# All went ok.
|
||||
if [ $? -eq 0 ]; then
|
||||
user=$(cat $workdir/user.txt)
|
||||
echo "nkey-user=$user"
|
||||
exit 0
|
||||
# An error happened.
|
||||
else
|
||||
echo "failed executing script: $errorMessage"
|
||||
exit 1
|
||||
fi
|
Loading…
Reference in a new issue