mirror of
https://github.com/flatcar/scripts.git
synced 2025-08-07 13:06:59 +02:00
196 lines
5.2 KiB
Bash
Executable File
196 lines
5.2 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
DEFAULT_ETCD_DISCOVERY="https://discovery.etcd.io/TOKEN"
|
|
DEFAULT_ETCD_ADDR="http://\$public_ipv4:2379"
|
|
DEFAULT_ETCD_PEER_URLS="http://\$private_ipv4:2380"
|
|
DEFAULT_ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
|
|
DEFAULT_ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"
|
|
|
|
USAGE="Usage: $0 -H HOSTNAME -S SSH_FILE [-p /target/path] [-d|-e|-i|-n|-t|-h]
|
|
Options:
|
|
-d URL Full URL path to discovery endpoint.
|
|
-e http://IP:PORT Adviertise URL for client communication.
|
|
-H HOSTNAME Machine hostname.
|
|
-i http://IP:PORT URL for server communication.
|
|
-l http://IP:PORT Listen URL for client communication.
|
|
-u http://IP:PORT Listen URL for server communication.
|
|
-n NAME etcd node name.
|
|
-c FILE cloud-config template to use, instead of the default.
|
|
-p DEST Create config-drive ISO image to the given path.
|
|
-S FILE SSH keys file.
|
|
-t TOKEN Token ID from https://discovery.etcd.io.
|
|
-h This help
|
|
|
|
This tool creates a basic config-drive ISO image.
|
|
"
|
|
|
|
CLOUD_CONFIG="#cloud-config
|
|
|
|
coreos:
|
|
etcd2:
|
|
name: <ETCD_NAME>
|
|
advertise-client-urls: <ETCD_ADDR>
|
|
initial-advertise-peer-urls: <ETCD_PEER_URLS>
|
|
discovery: <ETCD_DISCOVERY>
|
|
listen-peer-urls: <ETCD_LISTEN_PEER_URLS>
|
|
listen-client-urls: <ETCD_LISTEN_CLIENT_URLS>
|
|
units:
|
|
- name: etcd2.service
|
|
command: start
|
|
- name: fleet.service
|
|
command: start
|
|
ssh_authorized_keys:
|
|
- <SSH_KEY>
|
|
hostname: <HOSTNAME>
|
|
"
|
|
REGEX_SSH_FILE="^(ssh-(rsa|dss|ed25519)|ecdsa-sha2-nistp521) [-A-Za-z0-9+\/]+[=]{0,2} .+"
|
|
|
|
while getopts "d:e:c:H:i:n:p:S:t:l:u:h" OPTION
|
|
do
|
|
case $OPTION in
|
|
d) ETCD_DISCOVERY="$OPTARG" ;;
|
|
e) ETCD_ADDR="$OPTARG" ;;
|
|
c) CLOUD_CONFIG_FILE="${OPTARG}" ;;
|
|
H) HNAME="$OPTARG" ;;
|
|
i) ETCD_PEER_URLS="$OPTARG" ;;
|
|
n) ETCD_NAME="$OPTARG" ;;
|
|
p) DEST="$OPTARG" ;;
|
|
S) SSH_FILE="$OPTARG" ;;
|
|
t) TOKEN="$OPTARG" ;;
|
|
u) ETCD_LISTEN_PEER_URLS="$OPTARG" ;;
|
|
l) ETCD_LISTEN_CLIENT_URLS="$OPTARG" ;;
|
|
h) echo "$USAGE"; exit;;
|
|
*) exit 1;;
|
|
esac
|
|
done
|
|
|
|
# root user forbidden
|
|
if [ "$(id -u)" -eq 0 ]; then
|
|
echo "$0: This script should not be run as root." >&2
|
|
exit 1
|
|
fi
|
|
|
|
# mkisofs/genisoimage tool check
|
|
if command -v mkisofs &>/dev/null; then
|
|
mkisofs=$(command -v mkisofs)
|
|
elif command -v genisoimage &>/dev/null; then
|
|
mkisofs=$(command -v genisoimage)
|
|
else
|
|
echo "$0: mkisofs or genisoimage tool is required to create image." >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [ -z "$HNAME" ]; then
|
|
echo "$0: The hostname parameter '-H' is required." >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [ -z "$SSH_FILE" ]; then
|
|
echo "$0: The SSH filename parameter '-S' is required." >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ ! -r "$SSH_FILE" ]]; then
|
|
echo "$0: The SSH file (${SSH_FILE}) was not found." >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [ "$(wc -l < "$SSH_FILE")" -eq 0 ]; then
|
|
echo "$0: The SSH file (${SSH_FILE}) is empty." >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [ "$(grep -c -v -E "$REGEX_SSH_FILE" "$SSH_FILE")" -gt 0 ]; then
|
|
echo "$0: The SSH file (${SSH_FILE}) content is invalid." >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [ -z "$DEST" ]; then
|
|
DEST=$PWD
|
|
fi
|
|
|
|
if [[ ! -d "$DEST" ]]; then
|
|
echo "$0: Target path (${DEST}) do not exists." >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [ -n "$ETCD_DISCOVERY" ] && [ -n "$TOKEN" ]; then
|
|
echo "$0: You cannot specify both discovery token and discovery URL." >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [ -n "$TOKEN" ]; then
|
|
ETCD_DISCOVERY="${DEFAULT_ETCD_DISCOVERY//TOKEN/$TOKEN}"
|
|
fi
|
|
|
|
if [ -z "$ETCD_DISCOVERY" ]; then
|
|
ETCD_DISCOVERY=$DEFAULT_ETCD_DISCOVERY
|
|
fi
|
|
|
|
if [ -z "$ETCD_NAME" ]; then
|
|
ETCD_NAME=$HNAME
|
|
fi
|
|
|
|
if [ -z "$ETCD_ADDR" ]; then
|
|
ETCD_ADDR=$DEFAULT_ETCD_ADDR
|
|
fi
|
|
|
|
if [ -z "$ETCD_PEER_URLS" ]; then
|
|
ETCD_PEER_URLS=$DEFAULT_ETCD_PEER_URLS
|
|
fi
|
|
|
|
if [ -z "$ETCD_LISTEN_PEER_URLS" ]; then
|
|
ETCD_LISTEN_PEER_URLS=$DEFAULT_ETCD_LISTEN_PEER_URLS
|
|
fi
|
|
|
|
if [ -z "$ETCD_LISTEN_CLIENT_URLS" ]; then
|
|
ETCD_LISTEN_CLIENT_URLS=$DEFAULT_ETCD_LISTEN_CLIENT_URLS
|
|
fi
|
|
|
|
if [ -n "${CLOUD_CONFIG_FILE}" ]; then
|
|
CLOUD_CONFIG="$(cat "${CLOUD_CONFIG_FILE}")"
|
|
fi
|
|
|
|
WORKDIR="${DEST}/tmp.${RANDOM}"
|
|
mkdir "$WORKDIR"
|
|
trap 'rm -rf "${WORKDIR}"' EXIT
|
|
|
|
CONFIG_DIR="${WORKDIR}/openstack/latest"
|
|
CONFIG_FILE="${CONFIG_DIR}/user_data"
|
|
CONFIGDRIVE_FILE="${DEST}/${HNAME}.iso"
|
|
|
|
mkdir -p "$CONFIG_DIR"
|
|
|
|
while read -r l; do
|
|
if [ -z "$SSH_KEY" ]; then
|
|
SSH_KEY="$l"
|
|
else
|
|
SSH_KEY="$SSH_KEY
|
|
- $l"
|
|
fi
|
|
done < "$SSH_FILE"
|
|
|
|
CLOUD_CONFIG="${CLOUD_CONFIG/<ETCD_NAME>/${ETCD_NAME}}"
|
|
CLOUD_CONFIG="${CLOUD_CONFIG/<ETCD_DISCOVERY>/${ETCD_DISCOVERY}}"
|
|
CLOUD_CONFIG="${CLOUD_CONFIG/<ETCD_ADDR>/${ETCD_ADDR}}"
|
|
CLOUD_CONFIG="${CLOUD_CONFIG/<ETCD_PEER_URLS>/${ETCD_PEER_URLS}}"
|
|
CLOUD_CONFIG="${CLOUD_CONFIG/<ETCD_LISTEN_PEER_URLS>/${ETCD_LISTEN_PEER_URLS}}"
|
|
CLOUD_CONFIG="${CLOUD_CONFIG/<ETCD_LISTEN_CLIENT_URLS>/${ETCD_LISTEN_CLIENT_URLS}}"
|
|
CLOUD_CONFIG="${CLOUD_CONFIG/<SSH_KEY>/${SSH_KEY}}"
|
|
CLOUD_CONFIG="${CLOUD_CONFIG/<HOSTNAME>/${HNAME}}"
|
|
|
|
echo "$CLOUD_CONFIG" > "$CONFIG_FILE"
|
|
|
|
$mkisofs -R -V config-2 -o "$CONFIGDRIVE_FILE" "$WORKDIR"
|
|
ret="$?"
|
|
if [ "${ret}" -eq 0 ] ; then
|
|
echo
|
|
echo
|
|
echo "Success! The config-drive image was created on ${CONFIGDRIVE_FILE}"
|
|
else
|
|
echo
|
|
echo
|
|
echo "Failure! The config-drive image was not created on ${CONFIGDRIVE_FILE}"
|
|
fi
|
|
# vim: ts=4 et
|