|
#!/bin/bash
|
|
|
|
# Salt Master/Minion preconfiguration script
|
|
# Copyright (C) 2018 Pekka Helenius
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
###########################################################
|
|
|
|
# This script sets up default environment for basic Salt Master & Minion configuration
|
|
# for one computer
|
|
|
|
# Supported distributions: Ubuntu
|
|
|
|
###########################################################
|
|
# Check for command dependencies
|
|
|
|
function checkCommands() {
|
|
if [[ $(which --help 2>/dev/null) ]] && [[ $(echo --help 2>/dev/null) ]]; then
|
|
|
|
COMMANDS=(grep mkdir systemctl id wget cat tee awk sed chmod)
|
|
|
|
a=0
|
|
for command in ${COMMANDS[@]}; do
|
|
if [[ ! $(which $command 2>/dev/null) ]]; then
|
|
COMMANDS_NOTFOUND[$a]=$command
|
|
let a++
|
|
fi
|
|
done
|
|
|
|
if [[ -v COMMANDS_NOTFOUND ]]; then
|
|
echo -e "\n${bash_red}Error:${bash_color_default} The following commands could not be found: ${COMMANDS_NOTFOUND[*]}\nAborting\n"
|
|
exit 1
|
|
fi
|
|
else
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
checkCommands
|
|
|
|
###########################################################
|
|
# Check root
|
|
|
|
function checkRoot() {
|
|
if [ $(id -u) -ne 0 ]; then
|
|
echo "Run the script with root permissions (sudo or root)."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
checkRoot
|
|
|
|
###########################################################
|
|
# Check network connection
|
|
|
|
function checkInternet() {
|
|
if [[ $(echo $(wget --delete-after -q -T 5 github.com -o -)$?) -ne 0 ]]; then
|
|
echo -e "\nInternet connection failed (GitHub). Please check your connection and try again.\n"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
checkInternet
|
|
|
|
###########################################################
|
|
# Welcome message
|
|
|
|
function welcomeMessage() {
|
|
|
|
read -r -p "This script will install Salt Master/Minion test environment. Continue? [y/N] " answer
|
|
|
|
if [[ ! $(echo $answer | sed 's/ //g') =~ ^([yY][eE][sS]|[yY])$ ]]; then
|
|
echo -e "Aborting.\n"
|
|
exit 1
|
|
fi
|
|
|
|
unset answer
|
|
|
|
}
|
|
|
|
welcomeMessage
|
|
|
|
###########################################################
|
|
# Run package database updates?
|
|
|
|
function packageUpdateQ() {
|
|
|
|
read -r -p "Refresh package databases before Salt installation? [y/N] " answer
|
|
|
|
if [[ $(echo $answer | sed 's/ //g') =~ ^([yY][eE][sS]|[yY])$ ]]; then
|
|
UPDATES=""
|
|
fi
|
|
|
|
unset answer
|
|
|
|
}
|
|
|
|
packageUpdateQ
|
|
|
|
###########################################################
|
|
|
|
if [[ -f /etc/os-release ]]; then
|
|
|
|
DISTRO=$(grep ^PRETTY_NAME /etc/os-release | grep -oP '(?<=")[^\s]*')
|
|
|
|
function installPackages() {
|
|
|
|
case "${DISTRO}" in
|
|
|
|
#Arch*)
|
|
# pkgmgr_cmd() {
|
|
# if [[ -z UPDATES ]]; then
|
|
# pacman -Suy && pacman -Fy
|
|
# fi
|
|
# pacman -S $1
|
|
# }
|
|
|
|
# PKGS=(salt openssh vagrant virtualbox)
|
|
# ;;
|
|
Ubuntu*)
|
|
pkgmgr_cmd() {
|
|
if [[ -v UPDATES ]]; then
|
|
apt-get update
|
|
fi
|
|
apt-get -y install $1
|
|
}
|
|
|
|
PKGS=(salt-master salt-minion)
|
|
;;
|
|
default)
|
|
echo -e "Can't recognize your Linux distribution. Aborting.\n"
|
|
exit 1
|
|
esac
|
|
|
|
pkgmgr_cmd "${PKGS[*]}"
|
|
systemctl enable salt-master.service &> /dev/null
|
|
systemctl restart salt-master.service &> /dev/null
|
|
|
|
}
|
|
|
|
installPackages
|
|
unset UPDATES
|
|
|
|
else
|
|
echo -e "Can't recognize your Linux distribution. Aborting.\n"
|
|
exit 1
|
|
fi
|
|
|
|
###########################################################
|
|
|
|
function saltEnvironment() {
|
|
|
|
if [[ ! -d /srv/salt/apache/{data,scripts} ]]; then
|
|
mkdir -p /srv/salt/apache/{data,scripts}
|
|
fi
|
|
|
|
function defaultMinionConf() {
|
|
|
|
MINION_NAME="defaultMinion"
|
|
|
|
if [[ -d /etc/salt ]]; then
|
|
echo -e "\nWriting default Salt minion configuration '${MINION_NAME}' to /etc/salt/minion\n"
|
|
echo -e "master: localhost\nid: ${MINION_NAME}" > /etc/salt/minion
|
|
systemctl enable salt-minion.service &> /dev/null
|
|
systemctl restart salt-minion.service &> /dev/null
|
|
|
|
salt-key -y -a ${MINION_NAME} > /dev/null
|
|
|
|
# Adding this sleep timer may reduce chance to failed connection tests in some cases
|
|
sleep 5
|
|
|
|
echo -e "Testing default Salt minion connection with the Salt master\n"
|
|
|
|
if [[ $(echo $(salt "${MINION_NAME}" test.ping &> /dev/null)$?) -ne 0 ]]; then
|
|
echo -e "Salt master can't connect to the default Salt minion. Aborting.\n"
|
|
exit 1
|
|
else
|
|
echo -e "Connection OK!\n"
|
|
fi
|
|
|
|
else
|
|
echo -e "Missing Salt configuration directory /etc/salt. Aborting.\n"
|
|
exit 1
|
|
fi
|
|
|
|
}
|
|
|
|
defaultMinionConf
|
|
|
|
}
|
|
|
|
if [ $? -eq 0 ]; then
|
|
saltEnvironment
|
|
else
|
|
echo -e "Unknown error. Aborting.\n"
|
|
exit 1
|
|
fi
|
|
|
|
###########################################################
|
|
|
|
function getFiles() {
|
|
echo -e "Downloading additional files\n"
|
|
|
|
wget -q https://raw.githubusercontent.com/Fincer/salt_testrun/master/scripts/salt_pillar_apache_sample.sh \
|
|
-O /srv/salt/apache/scripts/salt_pillar_apache_sample.sh
|
|
|
|
wget -q https://raw.githubusercontent.com/Fincer/salt_testrun/master/data/sampleindex.html \
|
|
-O /srv/salt/apache/data/sampleindex.html
|
|
|
|
wget -q https://raw.githubusercontent.com/Fincer/salt_testrun/master/data/sampleindex_functions.js \
|
|
-O /srv/salt/apache/data/sampleindex_functions.js
|
|
|
|
chmod -R u+rw,go+r /srv/salt/apache
|
|
}
|
|
|
|
getFiles
|
|
|
|
cd /srv/salt/apache/scripts
|
|
bash ./salt_pillar_apache_sample.sh
|
|
|
|
sudo -u \#1000 xdg-open $(echo "http://${DISTRO}.${MINION_NAME}.com" | awk '{print tolower($0)}') &
|