ESPO-01 (Grundeinrichtung) und ESPO-02 (Docker) als versionierte Task-Skripte
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
f5da6fd3b3
commit
9c812fcac5
75
rmm-tasks/ESPO-01-Grundeinrichtung.sh
Executable file
75
rmm-tasks/ESPO-01-Grundeinrichtung.sh
Executable file
@ -0,0 +1,75 @@
|
||||
#!/bin/bash
|
||||
# ESPO-01-Grundeinrichtung – schliesst die Basis-VM ab.
|
||||
# Laeuft als root ueber einen RMM-Bash-Task, ist idempotent und kann jederzeit wiederholt werden.
|
||||
# %companyname% wird vom RMM vor der Ausfuehrung durch den Kundennamen ersetzt.
|
||||
# Quelle: EspoCRM_Public/espo-deploy, rmm-tasks/ – Aenderungen dort, danach in den Task kopieren.
|
||||
set -u
|
||||
FEHLER=0
|
||||
|
||||
# 1. Hostname aus dem Kundennamen ableiten (klein, nur a-z 0-9 und Bindestrich), damit die
|
||||
# Flotte im RMM und in Logs eindeutig benannt ist.
|
||||
KUNDE=$(printf '%s' "%companyname%" | tr '[:upper:]' '[:lower:]' | tr -c 'a-z0-9' '-' | sed 's/-\+/-/g; s/^-//; s/-$//')
|
||||
SOLL="crm-${KUNDE}"
|
||||
IST=$(hostnamectl --static)
|
||||
if [ -z "$KUNDE" ]; then
|
||||
echo "FEHLER: Kundenname leer - Hostname nicht gesetzt"; FEHLER=1
|
||||
elif [ "$IST" != "$SOLL" ]; then
|
||||
hostnamectl set-hostname "$SOLL" && sed -i "s/\b${IST}\b/${SOLL}/g" /etc/hosts
|
||||
echo "Hostname: $IST -> $SOLL"
|
||||
else
|
||||
echo "Hostname: $SOLL (unveraendert)"
|
||||
fi
|
||||
|
||||
# 2. Hinweis auf das Initialpasswort aus dem Konsolen-Login entfernen - er hat nach der
|
||||
# Erstanmeldung keinen Zweck mehr und steht sonst dauerhaft am Anmeldebildschirm.
|
||||
if grep -q "Initialpasswort" /etc/issue; then
|
||||
sed -i '/Initialpasswort/d; /beim ersten Anmelden/d' /etc/issue
|
||||
echo "/etc/issue: Hinweis auf das Initialpasswort entfernt"
|
||||
else
|
||||
echo "/etc/issue: kein Hinweis vorhanden"
|
||||
fi
|
||||
|
||||
# 3. Pruefen, dass das Konto ein gueltiges Passwort hat (Status P) - sonst ist die
|
||||
# Erstinbetriebnahme unvollstaendig.
|
||||
if [ "$(passwd -S administrator | awk '{print $2}')" = "P" ]; then
|
||||
echo "Konto administrator: Passwort gesetzt"
|
||||
else
|
||||
echo "FEHLER: Konto administrator hat kein gueltiges Passwort"; FEHLER=1
|
||||
fi
|
||||
|
||||
# 4. SSH haerten: keine Root-Anmeldung, wenige Fehlversuche, kurze Anmeldefrist.
|
||||
install -d -m 755 /etc/ssh/sshd_config.d
|
||||
cat > /etc/ssh/sshd_config.d/10-espo.conf <<'CONF'
|
||||
PermitRootLogin no
|
||||
MaxAuthTries 3
|
||||
LoginGraceTime 20
|
||||
CONF
|
||||
if sshd -t; then systemctl reload ssh && echo "SSH: PermitRootLogin no, MaxAuthTries 3"; else echo "FEHLER: sshd-Konfiguration ungueltig"; FEHLER=1; fi
|
||||
|
||||
# 5. Journal begrenzen, damit Logs das Wurzeldateisystem nicht fuellen koennen.
|
||||
install -d -m 755 /etc/systemd/journald.conf.d
|
||||
printf '[Journal]\nSystemMaxUse=500M\n' > /etc/systemd/journald.conf.d/10-espo.conf
|
||||
systemctl restart systemd-journald && echo "journald: SystemMaxUse=500M"
|
||||
|
||||
# 6. needrestart daran hindern, containerd automatisch neu zu starten - das wuerde die
|
||||
# laufenden Container mitreissen. docker ist ab Werk schon ausgenommen.
|
||||
install -d -m 755 /etc/needrestart/conf.d
|
||||
printf '# containerd nicht automatisch neu starten (Container haengen daran).\n$nrconf{override_rc}{qr(^containerd)} = 0;\n' > /etc/needrestart/conf.d/10-espo.conf
|
||||
echo "needrestart: containerd ausgenommen"
|
||||
|
||||
# 7. Zeitzone sicherstellen.
|
||||
if [ "$(timedatectl show -p Timezone --value)" != "Europe/Berlin" ]; then
|
||||
timedatectl set-timezone Europe/Berlin && echo "Zeitzone auf Europe/Berlin gesetzt"
|
||||
else
|
||||
echo "Zeitzone: Europe/Berlin"
|
||||
fi
|
||||
|
||||
# 8. Automatische Sicherheitsupdates nur pruefen, nicht aendern - sie sind Ubuntu-Standard.
|
||||
if grep -qs '"1"' /etc/apt/apt.conf.d/20auto-upgrades; then
|
||||
echo "unattended-upgrades: aktiv"
|
||||
else
|
||||
echo "WARNUNG: unattended-upgrades nicht aktiv"; FEHLER=1
|
||||
fi
|
||||
|
||||
# 9. Ergebniszeile fuer Monitor und Custom Field.
|
||||
if [ "$FEHLER" -eq 0 ]; then echo "ESPO01_ERGEBNIS: OK"; exit 0; else echo "ESPO01_ERGEBNIS: FEHLER"; exit 1; fi
|
||||
57
rmm-tasks/ESPO-02-Docker.sh
Executable file
57
rmm-tasks/ESPO-02-Docker.sh
Executable file
@ -0,0 +1,57 @@
|
||||
#!/bin/bash
|
||||
# ESPO-02-Docker – installiert Docker in gepinnter Version und setzt die Daemon-Grundlagen.
|
||||
# Laeuft als root ueber einen RMM-Bash-Task, idempotent.
|
||||
# Firewallregeln (ufw, DOCKER-USER) kommen in einem eigenen Task, weil dafuer die Adresse
|
||||
# der OPNsense als Parameter gebraucht wird.
|
||||
set -u
|
||||
FEHLER=0
|
||||
|
||||
# Gepinnte Staende - hier wird der Flottenstand gesetzt, nicht auf der VM entschieden.
|
||||
DOCKER_VERSION="5:29.8.1-1~ubuntu.24.04~noble"
|
||||
CONTAINERD_VERSION="2.3.5-1~ubuntu.24.04~noble"
|
||||
COMPOSE_VERSION="5.5.1-1~ubuntu.24.04~noble"
|
||||
BUILDX_VERSION="0.37.1-1~ubuntu.24.04~noble"
|
||||
|
||||
# 1. Paketquelle von Docker einrichten (Schluessel und deb822-Quelle), falls noch nicht vorhanden.
|
||||
install -m 0755 -d /etc/apt/keyrings
|
||||
if [ ! -s /etc/apt/keyrings/docker.asc ]; then
|
||||
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc || { echo "FEHLER: Schluessel nicht ladbar"; exit 1; }
|
||||
chmod a+r /etc/apt/keyrings/docker.asc
|
||||
fi
|
||||
cat > /etc/apt/sources.list.d/docker.sources <<CONF
|
||||
Types: deb
|
||||
URIs: https://download.docker.com/linux/ubuntu
|
||||
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
|
||||
Components: stable
|
||||
Architectures: $(dpkg --print-architecture)
|
||||
Signed-By: /etc/apt/keyrings/docker.asc
|
||||
CONF
|
||||
apt-get update -qq || { echo "FEHLER: apt-get update"; exit 1; }
|
||||
|
||||
# 2. Genau diese Versionen installieren und auf Hold setzen, damit nichts unbemerkt nachzieht.
|
||||
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq \
|
||||
docker-ce="$DOCKER_VERSION" docker-ce-cli="$DOCKER_VERSION" containerd.io="$CONTAINERD_VERSION" \
|
||||
docker-compose-plugin="$COMPOSE_VERSION" docker-buildx-plugin="$BUILDX_VERSION" || { echo "FEHLER: Installation"; exit 1; }
|
||||
apt-mark hold docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-buildx-plugin >/dev/null
|
||||
|
||||
# 3. Daemon-Grundlagen: Logrotation (der Standardtreiber rotiert nicht) und veroeffentlichte
|
||||
# Ports ohne Adressangabe nur auf die Loopback-Adresse binden.
|
||||
install -d -m 755 /etc/docker
|
||||
cat > /etc/docker/daemon.json <<'CONF'
|
||||
{
|
||||
"log-driver": "local",
|
||||
"log-opts": { "max-size": "20m", "max-file": "5" },
|
||||
"ip": "127.0.0.1",
|
||||
"live-restore": true
|
||||
}
|
||||
CONF
|
||||
systemctl enable --now docker >/dev/null 2>&1
|
||||
systemctl restart docker || { echo "FEHLER: docker startet nicht"; exit 1; }
|
||||
|
||||
# 4. Ergebnis zeigen und pruefen.
|
||||
docker --version
|
||||
docker compose version
|
||||
docker info --format 'Logtreiber: {{.LoggingDriver}} Live-Restore: {{.LiveRestoreEnabled}}'
|
||||
[ "$(docker info --format '{{.LoggingDriver}}')" = "local" ] || { echo "FEHLER: Logtreiber nicht gesetzt"; FEHLER=1; }
|
||||
|
||||
if [ "$FEHLER" -eq 0 ]; then echo "ESPO02_ERGEBNIS: OK"; exit 0; else echo "ESPO02_ERGEBNIS: FEHLER"; exit 1; fi
|
||||
Loading…
x
Reference in New Issue
Block a user