Skip to content

Instantly share code, notes, and snippets.

@naumvd95
Last active May 21, 2018 08:05
Show Gist options
  • Save naumvd95/a3da126575c167a28d7cf2d6c2248d23 to your computer and use it in GitHub Desktop.
Save naumvd95/a3da126575c167a28d7cf2d6c2248d23 to your computer and use it in GitHub Desktop.
saltmaster_install.sh
# Required variables:
# nodes_os - operating system (centos7, trusty, xenial)
# node_hostname - hostname of this node (mynode)
# node_domain - domainname of this node (mydomain)
# node_cluster - clustername, used to classify this node (virtual_mcp11_k8s)
# config_host - IP/hostname of salt-master (192.168.0.1)
#
# private_key - SSH private key, used to clone reclass model
# reclass_address - address of reclass model (https://github.com/user/repo.git)
# reclass_branch - branch of reclass model (master)
echo "Installing salt master ..."
aptget_wrapper install -y reclass git
aptget_wrapper install -y salt-master
[ ! -d /root/.ssh ] && mkdir -p /root/.ssh
if [ "$private_key" != "" ]; then
cat << EOF > /root/.ssh/id_rsa
$private_key
EOF
chmod 400 /root/.ssh/id_rsa
fi
[ ! -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 ..."
ssh-keyscan -H github.com >> ~/.ssh/known_hosts || wait_condition_send "FAILURE" "Failed to scan github.com key."
set -e
if echo $reclass_branch | egrep -q "^refs"; then
git clone $reclass_address /srv/salt/reclass
cd /srv/salt/reclass
git fetch $reclass_address $reclass_branch && git checkout FETCH_HEAD
git submodule init
git submodule update --recursive
cd -
else
git clone -b $reclass_branch --recurse-submodules $reclass_address /srv/salt/reclass
fi
set +e
mkdir -p /srv/salt/reclass/classes/service
mkdir -p /srv/salt/reclass/nodes/_generated
cat << EOF > /srv/salt/reclass/nodes/_generated/$node_hostname.$node_domain.yml
classes:
- cluster.$cluster_name.infra.config
parameters:
_param:
linux_system_codename: xenial
reclass_data_revision: $reclass_branch
reclass_data_repository: $reclass_address
cluster_name: $cluster_name
cluster_domain: $node_domain
linux:
system:
name: $node_hostname
domain: $node_domain
reclass:
storage:
data_source:
engine: local
EOF
node_ip="$(ip a | awk -v prefix="^ inet $network01_prefix[.]" '$0 ~ prefix {split($2, a, "/"); print a[1]}')"
node_control_ip="$(ip a | awk -v prefix="^ inet $network02_prefix[.]" '$0 ~ prefix {split($2, a, "/"); print a[1]}')"
cat << EOF > /srv/salt/reclass/classes/cluster/overrides.yml
parameters:
_param:
infra_config_address: $node_control_ip
infra_config_deploy_address: $node_ip
EOF
FORMULA_PATH=${FORMULA_PATH:-/usr/share/salt-formulas}
FORMULA_REPOSITORY=${FORMULA_REPOSITORY:-deb [arch=amd64] http://apt-mk.mirantis.com/xenial testing salt}
FORMULA_GPG=${FORMULA_GPG:-http://apt-mk.mirantis.com/public.gpg}
echo "Configuring salt master formulas ..."
which wget > /dev/null || (aptget_wrapper update; aptget_wrapper install -y wget)
echo "${FORMULA_REPOSITORY}" > /etc/apt/sources.list.d/mcp_salt.list
wget -O - "${FORMULA_GPG}" | apt-key add - || wait_condition_send "FAILURE" "Failed to add formula key."
aptget_wrapper clean
aptget_wrapper update
[ ! -d /srv/salt/reclass/classes/service ] && mkdir -p /srv/salt/reclass/classes/service
declare -a FORMULAS_SALT_MASTER=("linux" "reclass" "salt" "openssh" "ntp" "git" "nginx" "collectd" "sensu" "heka" "sphinx" "keystone" "mysql" "grafana" "haproxy" "rsyslog" "memcached" "horizon" "telegraf" "prometheus" "rabbitmq")
# Source bootstrap_vars for specific cluster if specified.
for cluster in /srv/salt/reclass/classes/cluster/*/; do
if [[ -f "$cluster/bootstrap_vars" ]]; then
echo "Sourcing bootstrap_vars for cluster $cluster"
source $cluster/bootstrap_vars
fi
done
if [[ -f /srv/salt/reclass/classes/cluster/$cluster_name/.env ]]; then
source /srv/salt/reclass/classes/cluster/$cluster_name/.env
fi
# Patch name of the package for services with _ in name
FORMULA_PACKAGES=(`echo ${FORMULAS_SALT_MASTER[@]//_/-}`)
echo -e "\nInstalling all required salt formulas\n"
aptget_wrapper install -y "${FORMULA_PACKAGES[@]/#/salt-formula-}"
for formula_service in "${FORMULAS_SALT_MASTER[@]}"; do
echo -e "\nLink service metadata for formula ${formula_service} ...\n"
[ ! -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
[ ! -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
echo "Restarting salt-master service ..."
systemctl restart salt-master || wait_condition_send "FAILURE" "Failed to restart salt-master service."
echo "Running salt master states ..."
run_states=("linux,openssh" "reclass" "salt.master.service" "salt")
for state in "${run_states[@]}"
do
salt-call --no-color state.apply "$state" -l info || wait_condition_send "FAILURE" "Salt state $state run failed."
done
echo "Showing known models ..."
reclass-salt --top || wait_condition_send "FAILURE" "Reclass-salt command run failed."
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment