320 lines
9.7 KiB
Bash
320 lines
9.7 KiB
Bash
#!/bin/bash -e
|
|
|
|
#
|
|
# ENVIRONMENT
|
|
#
|
|
|
|
OS_DISTRIBUTION=${OS_DISTRIBUTION:-ubuntu}
|
|
OS_NETWORKING=${OS_NETWORKING:-opencontrail}
|
|
OS_VERSION=${OS_VERSION:-mitaka}
|
|
OS_DEPLOYMENT=${OS_DEPLOYMENT:-single}
|
|
OS_SYSTEM="${OS_VERSION}_${OS_DISTRIBUTION}_${OS_NETWORKING}_${OS_DEPLOYMENT}"
|
|
|
|
SALT_SOURCE=${SALT_SOURCE:-pkg}
|
|
SALT_VERSION=${SALT_VERSION:-latest}
|
|
|
|
FORMULA_SOURCE=${FORMULA_SOURCE:-git}
|
|
FORMULA_PATH=${FORMULA_PATH:-/usr/share/salt-formulas}
|
|
FORMULA_BRANCH=${FORMULA_BRANCH:-master}
|
|
FORMULA_REPOSITORY=${FORMULA_REPOSITORY:-deb [arch=amd64] http://apt.tcpcloud.eu/nightly/ trusty tcp-salt}
|
|
FORMULA_GPG=${FORMULA_GPG:-http://apt.tcpcloud.eu/public.gpg}
|
|
|
|
if [ "$FORMULA_SOURCE" == "git" ]; then
|
|
SALT_ENV="dev"
|
|
elif [ "$FORMULA_SOURCE" == "pkg" ]; then
|
|
SALT_ENV="prd"
|
|
fi
|
|
|
|
RECLASS_ADDRESS=${RECLASS_ADDRESS:-https://github.com/tcpcloud/openstack-salt-model.git}
|
|
RECLASS_BRANCH=${RECLASS_BRANCH:-master}
|
|
RECLASS_SYSTEM=${RECLASS_SYSTEM:-$OS_SYSTEM}
|
|
|
|
CONFIG_HOSTNAME=${CONFIG_HOSTNAME:-config}
|
|
CONFIG_DOMAIN=${CONFIG_DOMAIN:-openstack.local}
|
|
CONFIG_HOST=${CONFIG_HOSTNAME}.${CONFIG_DOMAIN}
|
|
CONFIG_ADDRESS=${CONFIG_ADDRESS:-10.10.10.200}
|
|
|
|
MINION_MASTER=${MINION_MASTER:-$CONFIG_ADDRESS}
|
|
MINION_HOSTNAME=${MINION_HOSTNAME:-minion}
|
|
MINION_ID=${MINION_HOSTNAME}.${CONFIG_DOMAIN}
|
|
|
|
install_salt_master_pkg()
|
|
{
|
|
echo -e "\nPreparing base OS repository ...\n"
|
|
|
|
echo -e "deb [arch=amd64] http://apt.tcpcloud.eu/nightly/ trusty main security extra tcp" > /etc/apt/sources.list
|
|
wget -O - http://apt.tcpcloud.eu/public.gpg | apt-key add -
|
|
|
|
apt-get clean
|
|
apt-get update
|
|
|
|
echo -e "\nInstalling salt master ...\n"
|
|
|
|
apt-get install reclass git -y
|
|
|
|
if [ "$SALT_VERSION" == "latest" ]; then
|
|
apt-get install -y salt-common salt-master salt-minion
|
|
else
|
|
apt-get install -y --force-yes salt-common=$SALT_VERSION salt-master=$SALT_VERSION salt-minion=$SALT_VERSION
|
|
fi
|
|
|
|
configure_salt_master
|
|
|
|
install_salt_minion_pkg "master"
|
|
|
|
echo -e "\nRestarting services ...\n"
|
|
service salt-master restart
|
|
[ -f /etc/salt/pki/minion/minion_master.pub ] && rm -f /etc/salt/pki/minion/minion_master.pub
|
|
service salt-minion restart
|
|
salt-call pillar.data > /dev/null 2>&1
|
|
}
|
|
|
|
install_salt_master_pip()
|
|
{
|
|
echo -e "\nPreparing base OS repository ...\n"
|
|
|
|
echo -e "deb [arch=amd64] http://apt.tcpcloud.eu/nightly/ trusty main security extra tcp" > /etc/apt/sources.list
|
|
wget -O - http://apt.tcpcloud.eu/public.gpg | apt-key add -
|
|
|
|
apt-get clean
|
|
apt-get update
|
|
|
|
echo -e "\nInstalling salt master ...\n"
|
|
|
|
if [ -x "`which invoke-rc.d 2>/dev/null`" -a -x "/etc/init.d/salt-minion" ] ; then
|
|
apt-get purge -y salt-minion salt-common && apt-get autoremove -y
|
|
fi
|
|
|
|
apt-get install -y python-pip python-dev zlib1g-dev reclass git
|
|
|
|
if [ "$SALT_VERSION" == "latest" ]; then
|
|
pip install salt
|
|
else
|
|
pip install salt==$SALT_VERSION
|
|
fi
|
|
|
|
wget -O /etc/init.d/salt-master https://anonscm.debian.org/cgit/pkg-salt/salt.git/plain/debian/salt-master.init && chmod 755 /etc/init.d/salt-master
|
|
ln -s /usr/local/bin/salt-master /usr/bin/salt-master
|
|
|
|
configure_salt_master
|
|
|
|
install_salt_minion_pkg "master"
|
|
|
|
echo -e "\nRestarting services ...\n"
|
|
service salt-master restart
|
|
[ -f /etc/salt/pki/minion/minion_master.pub ] && rm -f /etc/salt/pki/minion/minion_master.pub
|
|
service salt-minion restart
|
|
salt-call pillar.data > /dev/null 2>&1
|
|
}
|
|
|
|
configure_salt_master()
|
|
{
|
|
|
|
[ ! -d /etc/salt/master.d ] && mkdir -p /etc/salt/master.d
|
|
|
|
cat << 'EOF' > /etc/salt/master.d/master.conf
|
|
file_roots:
|
|
base:
|
|
- /usr/share/salt-formulas/env
|
|
pillar_opts: False
|
|
open_mode: True
|
|
reclass: &reclass
|
|
storage_type: yaml_fs
|
|
inventory_base_uri: /srv/salt/reclass
|
|
ext_pillar:
|
|
- reclass: *reclass
|
|
master_tops:
|
|
reclass: *reclass
|
|
EOF
|
|
|
|
echo "Configuring reclass ..."
|
|
|
|
[ ! -d /etc/reclass ] && mkdir /etc/reclass
|
|
cat << 'EOF' > /etc/reclass/reclass-config.yml
|
|
storage_type: yaml_fs
|
|
pretty_print: True
|
|
output: yaml
|
|
inventory_base_uri: /srv/salt/reclass
|
|
EOF
|
|
|
|
git clone ${RECLASS_ADDRESS} /srv/salt/reclass -b ${RECLASS_BRANCH}
|
|
|
|
if [ ! -f "/srv/salt/reclass/nodes/${CONFIG_HOST}.yml" ]; then
|
|
|
|
cat << EOF > /srv/salt/reclass/nodes/${CONFIG_HOST}.yml
|
|
classes:
|
|
- service.git.client
|
|
- system.linux.system.single
|
|
- system.openssh.client.workshop
|
|
- system.salt.master.single
|
|
- system.salt.master.formula.$FORMULA_SOURCE
|
|
- system.reclass.storage.salt
|
|
- system.reclass.storage.system.$RECLASS_SYSTEM
|
|
parameters:
|
|
_param:
|
|
reclass_data_repository: "$RECLASS_ADDRESS"
|
|
reclass_data_revision: $RECLASS_BRANCH
|
|
salt_formula_branch: $FORMULA_BRANCH
|
|
reclass_config_master: $CONFIG_ADDRESS
|
|
single_address: $CONFIG_ADDRESS
|
|
salt_master_host: 127.0.0.1
|
|
salt_master_base_environment: $SALT_ENV
|
|
linux:
|
|
system:
|
|
name: $CONFIG_HOSTNAME
|
|
domain: $CONFIG_DOMAIN
|
|
EOF
|
|
|
|
if [ "$SALT_VERSION" == "latest" ]; then
|
|
|
|
cat << EOF >> /srv/salt/reclass/nodes/${CONFIG_HOST}.yml
|
|
salt:
|
|
master:
|
|
accept_policy: open_mode
|
|
source:
|
|
engine: $SALT_SOURCE
|
|
minion:
|
|
source:
|
|
engine: $SALT_SOURCE
|
|
EOF
|
|
|
|
else
|
|
|
|
cat << EOF >> /srv/salt/reclass/nodes/${CONFIG_HOST}.yml
|
|
salt:
|
|
master:
|
|
accept_policy: open_mode
|
|
source:
|
|
engine: $SALT_SOURCE
|
|
version: $SALT_VERSION
|
|
minion:
|
|
source:
|
|
engine: $SALT_SOURCE
|
|
version: $SALT_VERSION
|
|
EOF
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
service salt-master restart
|
|
}
|
|
|
|
install_salt_minion_pkg()
|
|
{
|
|
echo -e "\nInstalling salt minion ...\n"
|
|
|
|
if [ "$SALT_VERSION" == "latest" ]; then
|
|
apt-get install -y salt-common salt-minion
|
|
else
|
|
apt-get install -y --force-yes salt-common=$SALT_VERSION salt-minion=$SALT_VERSION
|
|
fi
|
|
|
|
if [ "$SALT_VERSION" == "latest" ]; then
|
|
apt-get install -y salt-common salt-minion
|
|
else
|
|
apt-get install -y --force-yes salt-common=$SALT_VERSION salt-minion=$SALT_VERSION
|
|
fi
|
|
|
|
[ ! -d /etc/salt/minion.d ] && mkdir -p /etc/salt/minion.d
|
|
echo -e "master: 127.0.0.1\nid: $CONFIG_HOST" > /etc/salt/minion.d/minion.conf
|
|
|
|
service salt-minion restart
|
|
}
|
|
|
|
install_salt_minion_pip()
|
|
{
|
|
echo -e "\nInstalling salt minion ...\n"
|
|
|
|
[ ! -d /etc/salt/minion.d ] && mkdir -p /etc/salt/minion.d
|
|
echo -e "master: 127.0.0.1\nid: $CONFIG_HOST" > /etc/salt/minion.d/minion.conf
|
|
|
|
wget -O /etc/init.d/salt-minion https://anonscm.debian.org/cgit/pkg-salt/salt.git/plain/debian/salt-minion.init && chmod 755 /etc/init.d/salt-minion
|
|
ln -s /usr/local/bin/salt-minion /usr/bin/salt-minion
|
|
|
|
service salt-minion restart
|
|
}
|
|
|
|
install_salt_formula_pkg()
|
|
{
|
|
echo "Configuring necessary formulas ..."
|
|
which wget > /dev/null || (apt-get update; apt-get install -y wget)
|
|
|
|
echo "${FORMULA_REPOSITORY}" > /etc/apt/sources.list.d/salt-formulas.list
|
|
wget -O - "${FORMULA_GPG}" | apt-key add -
|
|
|
|
apt-get clean
|
|
apt-get update
|
|
|
|
[ ! -d /srv/salt/reclass/classes/service ] && mkdir -p /srv/salt/reclass/classes/service
|
|
|
|
declare -a formula_services=("linux" "reclass" "salt" "openssh" "ntp" "git" "nginx" "collectd" "sensu" "heka" "sphinx")
|
|
|
|
for formula_service in "${formula_services[@]}"; do
|
|
echo -e "\nConfiguring salt formula ${formula_service} ...\n"
|
|
[ ! -d "${FORMULA_PATH}/env/${formula_service}" ] && \
|
|
apt-get install -y salt-formula-${formula_service}
|
|
[ ! -L "/srv/salt/reclass/classes/service/${formula_service}" ] && \
|
|
ln -s ${FORMULA_PATH}/reclass/service/${formula_service} /srv/salt/reclass/classes/service/${formula_service}
|
|
done
|
|
|
|
[ ! -d /srv/salt/env ] && mkdir -p /srv/salt/env
|
|
[ ! -L /srv/salt/env/prd ] && ln -s ${FORMULA_PATH}/env /srv/salt/env/prd
|
|
}
|
|
|
|
install_salt_formula_git()
|
|
{
|
|
echo "Configuring necessary formulas ..."
|
|
|
|
[ ! -d /srv/salt/reclass/classes/service ] && mkdir -p /srv/salt/reclass/classes/service
|
|
|
|
declare -a formula_services=("linux" "reclass" "salt" "openssh" "ntp" "git" "nginx" "collectd" "sensu" "heka" "sphinx")
|
|
|
|
for formula_service in "${formula_services[@]}"; do
|
|
echo -e "\nConfiguring salt formula ${formula_service} ...\n"
|
|
[ ! -d "${FORMULA_PATH}/env/_formulas/${formula_service}" ] && \
|
|
git clone https://github.com/tcpcloud/salt-formula-${formula_service}.git ${FORMULA_PATH}/env/_formulas/${formula_service} -b ${FORMULA_BRANCH}
|
|
[ ! -L "/usr/share/salt-formulas/env/${formula_service}" ] && \
|
|
ln -s ${FORMULA_PATH}/env/_formulas/${formula_service}/${formula_service} /usr/share/salt-formulas/env/${formula_service}
|
|
[ ! -L "/srv/salt/reclass/classes/service/${formula_service}" ] && \
|
|
ln -s ${FORMULA_PATH}/env/_formulas/${formula_service}/metadata/service /srv/salt/reclass/classes/service/${formula_service}
|
|
done
|
|
|
|
[ ! -d /srv/salt/env ] && mkdir -p /srv/salt/env
|
|
[ ! -L /srv/salt/env/dev ] && ln -s /usr/share/salt-formulas/env /srv/salt/env/dev
|
|
}
|
|
|
|
run_salt_states()
|
|
{
|
|
echo -e "\nReclass metadata ...\n"
|
|
reclass --nodeinfo ${CONFIG_HOST}
|
|
|
|
echo -e "\nSalt grains metadata ...\n"
|
|
salt-call grains.items --no-color
|
|
|
|
echo -e "\nSalt pillar metadata ...\n"
|
|
salt-call pillar.data --no-color
|
|
|
|
echo -e "\nRunning necessary base states ...\n"
|
|
salt-call --retcode-passthrough state.sls linux,salt.minion,salt --no-color
|
|
|
|
echo -e "\nRunning complete state ...\n"
|
|
salt-call --retcode-passthrough state.highstate --no-color
|
|
}
|
|
|
|
if [ "$SALT_SOURCE" == "pkg" ]; then
|
|
install_salt_master_pkg
|
|
install_salt_minion_pkg
|
|
elif [ "$SALT_SOURCE" == "pip" ]; then
|
|
install_salt_master_pip
|
|
install_salt_minion_pip
|
|
fi
|
|
|
|
if [ "$FORMULA_SOURCE" == "pkg" ]; then
|
|
install_salt_formula_pkg
|
|
elif [ "$FORMULA_SOURCE" == "git" ]; then
|
|
install_salt_formula_git
|
|
fi
|
|
|
|
run_salt_states
|