150 lines
4.8 KiB
Bash
150 lines
4.8 KiB
Bash
![]() |
#!/bin/bash
|
||
|
# Info: Script to install/create/delete/update etcd from file settings
|
||
|
# Author: JesusPerezLorenzo
|
||
|
# Release: 1.0
|
||
|
# Date: 12-11-2024
|
||
|
|
||
|
USAGE="install-etcd.sh install | update | remvoe"
|
||
|
[ "$1" == "-h" ] && echo "$USAGE" && exit 1
|
||
|
|
||
|
[ -r "env-etcd" ] && . ./env-etcd
|
||
|
|
||
|
ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')"
|
||
|
CMD_TSK=${1:-install}
|
||
|
|
||
|
#[ -z "$ETCD_VERSION" ] && echo "No ETCD_VERSION found " && exit
|
||
|
HOSTNAME=$(hostname)
|
||
|
export LC_CTYPE=C.UTF-8
|
||
|
export LANG=C.UTF-8
|
||
|
|
||
|
[ ! -d "/etc/etcd" ] && sudo mkdir /etc/etcd
|
||
|
|
||
|
_init() {
|
||
|
[ -z "$ETCD_VERSION" ] || [ -z "$ARCH" ] && exit 1
|
||
|
local curr_vers
|
||
|
local has_etcd
|
||
|
has_etcd=$(type etcd 2>/dev/null)
|
||
|
[ -n "$has_etcd" ] && curr_vers="v"$(etcd -version 2>/dev/null | grep etcd | cut -f2 -d":" | sed 's/ //g')
|
||
|
[ "$curr_vers" == "$ETCD_VERSION" ] && return
|
||
|
# choose either URL
|
||
|
GOOGLE_URL=https://storage.googleapis.com/etcd
|
||
|
GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
|
||
|
case "$SOURCE_URL" in
|
||
|
google) DOWNLOAD_URL=${GOOGLE_URL} ;;
|
||
|
github) DOWNLOAD_URL=${GITHUB_URL} ;;
|
||
|
esac
|
||
|
rm -f "/tmp/etcd-${ETCD_VERSION}-${ARCH}.tar.gz"
|
||
|
[ -d "/tmp/etcd-download" ] && rm -rf /tmp/etcd-download
|
||
|
mkdir -p /tmp/etcd-download
|
||
|
|
||
|
if ! curl -fsSL "${DOWNLOAD_URL}/${ETCD_VERSION}/etcd-${ETCD_VERSION}-linux-${ARCH}.tar.gz" -o "/tmp/etcd-${ETCD_VERSION}-${ARCH}.tar.gz" ; then
|
||
|
echo "Error downloading etcd-${ETCD_VERSION}-${ARCH}.tar.gz"
|
||
|
exit 1
|
||
|
fi
|
||
|
if ! tar xzf "/tmp/etcd-${ETCD_VERSION}-${ARCH}.tar.gz" -C /tmp/etcd-download --strip-components=1 ; then
|
||
|
echo "Error extracting etcd-${ETCD_VERSION}-${ARCH}.tar.gz"
|
||
|
exit 1
|
||
|
fi
|
||
|
rm -f "/tmp/etcd-${ETCD_VERSION}-${ARCH}.tar.gz"
|
||
|
|
||
|
chmod +x /tmp/etcd-download/etcd
|
||
|
chmod +x /tmp/etcd-download/etcdctl
|
||
|
|
||
|
sudo mv /tmp/etcd-download/etcd /usr/local/bin
|
||
|
sudo mv /tmp/etcd-download/etcdctl /usr/local/bin
|
||
|
sudo mv /tmp/etcd-download/etcdutl /usr/local/bin
|
||
|
sudo mv /tmp/etcd-download /etc/etcd/"${ETCD_VERSION}"
|
||
|
|
||
|
# start a local etcd server
|
||
|
# /tmp/etcd-download/etcd
|
||
|
# write,read to etcd
|
||
|
# /tmp/etcd-download/etcdctl --endpoints=localhost:2379 put foo bar
|
||
|
# /tmp/etcd-download/etcdctl --endpoints=localhost:2379 get foo
|
||
|
}
|
||
|
_config_etcd() {
|
||
|
[ ! -d "/etc/etcd" ] && sudo mkdir /etc/etcd
|
||
|
|
||
|
has_user=$(sudo grep etcd /etc/passwd)
|
||
|
[ -z "$has_user" ] && sudo useradd -d /home/etcd -m etcd
|
||
|
|
||
|
[ ! -d "/etc/ssl/etcd" ] && sudo mkdir -p /etc/ssl/etcd
|
||
|
sudo cp certs/* /etc/ssl/etcd
|
||
|
sudo chown -R etcd:etcd /etc/ssl/etcd
|
||
|
|
||
|
[ ! -d "${ETCD_DATA}" ] && sudo mkdir -p "${ETCD_DATA}"
|
||
|
sudo chown -R etcd:etcd "${ETCD_DATA}"
|
||
|
sudo chmod 700 "${ETCD_DATA}"
|
||
|
|
||
|
#[ -r "etcd-sysusers.conf" ] && sudo cp etcd-sysusers.conf /usr/lib/sysusers.d
|
||
|
#[ -r "etcd-tmpfile.conf" ] && sudo cp etcd-tmpfiles.conf /usr/lib/tmpfiles.d
|
||
|
|
||
|
sudo cp etcdctl.sh /etc/etcd/etcdctl.sh
|
||
|
sed 's/, / /g' < etcdctl.sh | sudo tee /etc/etcd/etcdctl.sh &>/dev/null
|
||
|
sudo chmod +x /etc/etcd/etcdctl.sh
|
||
|
|
||
|
sudo cp cert-show.sh /etc/etcd/cert-show.sh
|
||
|
# sudo cp setup.sh /etc/etcd/etcd_setup.sh
|
||
|
|
||
|
sudo cp env-etcd /etc/etcd/env
|
||
|
# [ ! -r "/etc/etcd/config.yaml" ] &&
|
||
|
sed 's/,"/"/g' < etcd.yaml | sudo tee /etc/etcd/config.yaml &>/dev/null
|
||
|
|
||
|
sudo cp etcd.service /lib/systemd/system/etcd.service
|
||
|
#[ ! -L "/etc/systemd/system/etcd.service" ] && sudo ln -s /lib/systemd/system/etcd.service /etc/systemd/system
|
||
|
sudo timeout -k 10 20 systemctl daemon-reload >/dev/null 2>&1
|
||
|
|
||
|
sudo timeout -k 10 20 systemctl enable --now etcd >/dev/null 2>&1
|
||
|
# sudo timeout -k 10 20 systemctl restart etcd >/dev/null 2>&1
|
||
|
|
||
|
# This command sets the cluster to existing for the next start
|
||
|
#sudo sed -i s"/initial-cluster-state: 'new'/initial-cluster-state: 'existing'/"g /etc/etcd/config.yaml
|
||
|
#sudo sed -i s"/ETCD_INITIAL_CLUSTER_STATE=\"new\"/ETCD_INITIAL_CLUSTER_STATE=\"existing\"/"g /etc/etcd/env
|
||
|
|
||
|
}
|
||
|
_stop_resolved() {
|
||
|
sudo timeout -k 10 20 systemctl stop etcd >/dev/null 2>&1
|
||
|
sudo timeout -k 10 20 systemctl disable etcd >/dev/null 2>&1
|
||
|
}
|
||
|
_remove_etcd() {
|
||
|
sudo timeout -k 10 20 systemctl stop etcd >/dev/null 2>&1
|
||
|
sudo timeout -k 10 20 systemctl disable etcd >/dev/null 2>&1
|
||
|
}
|
||
|
_start_etcd() {
|
||
|
sudo timeout -k 10 20 systemctl enable etcd >/dev/null 2>&1
|
||
|
sudo timeout -k 10 20 systemctl start etcd >/dev/null 2>&1
|
||
|
}
|
||
|
_restart_etcd() {
|
||
|
sudo timeout -k 10 20 systemctl restart etcd >/dev/null 2>&1
|
||
|
}
|
||
|
if [ "$CMD_TSK" == "install" ] ; then
|
||
|
if ! _init ; then
|
||
|
echo "error etcd init"
|
||
|
exit 1
|
||
|
fi
|
||
|
# _make_certs
|
||
|
_config_etcd
|
||
|
exit 0
|
||
|
fi
|
||
|
if [ "$CMD_TSK" == "config" ] ; then
|
||
|
if ! _config_etcd ; then
|
||
|
echo "error etcd config"
|
||
|
exit 1
|
||
|
fi
|
||
|
exit
|
||
|
fi
|
||
|
if [ "$CMD_TSK" == "remove" ] ; then
|
||
|
_remove_etcd
|
||
|
exit
|
||
|
fi
|
||
|
if [ "$CMD_TSK" == "update" ] ; then
|
||
|
_restart_etcd && exit 0
|
||
|
fi
|
||
|
if ! _stop_resolved ; then
|
||
|
echo "error etcd stop"
|
||
|
exit 1
|
||
|
fi
|
||
|
if ! _start_etcd ; then
|
||
|
echo "error etcd start"
|
||
|
exit 1
|
||
|
fi
|