
Da gibt es leider nichts fertiges. Im Checkmk Forum bin ich auf diesen älteren Beitrag gestossen. CheckMK Agent on Alpine Linux
Die einzelnen Schritte hab ich alle mal in ein installscript gepackt. Damit ist der Agent in einem Rutsch installiert.
mein Setup:
- Checkmk CRE 2.2.0p20
- Raspberry Pi mit Alpine Linux
- Proxmox LXC Container mit Alpine Linux
Variante A mit socat
install-checkmk-agent-alpinelinux_socat.sh
#!/bin/ash
#
# use curl --insecure for self signed certificates
#
#
# ADJUST THESE VARIABLES!
#
cmk_server="192.168.50.153" # CHANGE - checkmk server ip or fqdn
cmk_site="test" # CHANGE - checkmk site
#
# check if we are root
#
if [[ ! $USER = root ]]; then
echo " This script must be run as root!" ; echo ; exit 1
fi
#
# check if we are running Alpine Linux
#
if [ -f "/etc/alpine-release" ]; then
# install needed packages
apk add socat ethtool curl
# create directories
mkdir /etc/check_mk
mkdir -p /var/lib/check_mk_agent/spool
mkdir /var/lib/check_mk_agent/cache
mkdir -p /usr/lib/check_mk_agent/plugins
mkdir /usr/lib/check_mk_agent/local
# download check_mk agent from our cmk server
curl -s -L http://$cmk_server/$cmk_site/check_mk/agents/check_mk_agent.openwrt -o /usr/local/bin/check_mk_agent
chmod 755 /usr/local/bin/check_mk_agent
# download waitmax binary from our checkmk server
curl -s -L http://$cmk_server/$cmk_site/check_mk/agents/waitmax -o /usr/local/bin/waitmax
chmod 755 /usr/local/bin/waitmax
# create init script
cat > /etc/init.d/checkmk_agent << EOF
#!/sbin/openrc-run
description="Check_MK Agent on Alpine Linux"
name=check_mk_agent
command="/usr/bin/socat"
command_args="-U TCP-LISTEN:6556,fork,reuseaddr EXEC:/usr/local/bin/check_mk_agent"
command_user="root"
pidfile="/run/$RC_SVCNAME.pid"
command_background="yes"
depend() {
need net
}
EOF
# make script executable
chmod 755 /etc/init.d/checkmk_agent
# modify check_mk_agent <<<check_mk>> section
sed -i 's/openwrt/alpine linux/' /usr/local/bin/check_mk_agent
# modify check_mk_agent <<<df>>> section
sed -i s"/df -kPT.*/df -kPT | egrep -v '(Filesystem|none|udev|tmpfs)'/" /usr/local/bin/check_mk_agent
sed -i s"/df -PTi.*/df -PTi | egrep -v '(Filesystem|none|udev|tmpfs)'/" /usr/local/bin/check_mk_agent
#
# create cronjob
#
cat > /etc/periodic/hourly/get.alpinelinux.online.version << EOF
#!/bin/ash
curl -s https://www.alpinelinux.org/downloads/ | grep "Current Alpine Version" | sed 's/>/ /g;s/</ /g' | awk '{print \$6}' > /var/lib/check_mk_agent/cache/alpinelinux.version
EOF
# make script executable
chmod 755 /etc/periodic/hourly/get.alpinelinux.online.version
# get current version for check_os script
/etc/periodic/hourly/get.alpinelinux.online.version
#
# create check_os script
#
cat > /usr/lib/check_mk_agent/local/check_os << EOF
#!/bin/ash
# get versions
version_online=\$(cat /var/lib/check_mk_agent/cache/alpinelinux.version)
version_installed=\$(cat /etc/alpine-release)
# check if newer version is online available
if [[ \$version_online = \$version_installed ]]; then
echo "0 Check_os" - "Alpine Linux \$(cat /etc/alpine-release) - \$(uname -rvm)"
exit 0
else
echo "1 Check_os" - Alpine Linux \$version_installed - update to \$version_online available'\n'"https://www.alpinelinux.org/downloads/" "Alpine Linux downloads"
exit 1
fi
EOF
#
# create check_apk script
#
cat > /usr/lib/check_mk_agent/local/check_apk << EOF
#!/bin/ash
UPDATES=\$(apk -uU list | wc -l)
if [[ \$UPDATES -gt 0 ]]; then
LIST=\$(apk -u list | sed 's/\$/\\\n/' >/var/lib/check_mk_agent/cache/alpinelinux.packages)
echo "1 Check_apk" - \$UPDATES packages available for upgrade'\n'Package List:'\n'\$(cat /var/lib/check_mk_agent/cache/alpinelinux.packages)
exit 1
else
echo "0 Check_apk" - no packages available for upgrade
fi
EOF
# make these scripts executable
chmod +x /usr/lib/check_mk_agent/local/*
# enable autostart and start checkmk_agent
rc-update add checkmk_agent
/etc/init.d/checkmk_agent start
# status
/etc/init.d/checkmk_agent status
else
echo "ERROR - Your are not running Alpine Linux!"
fi
Variante B mit inetd
install-checkmk-agent-alpinelinux_inetd.sh
#!/bin/ash
#
# use curl --insecure for self signed certificates
#
#
# ADJUST THESE VARIABLES!
#
cmk_server="192.168.50.153" # CHANGE - checkmk server ip or fqdn
cmk_site="test" # CHANGE - checkmk site
#
# check if we are root
#
if [[ ! $USER = root ]]; then
echo " This script must be run as root!" ; echo ; exit 1
fi
#
# check if we are running Alpine Linux
#
if [ -f "/etc/alpine-release" ]; then
# install needed packages
apk add busybox-extras ethtool curl
# create directories
mkdir /etc/check_mk
mkdir -p /var/lib/check_mk_agent/spool
mkdir /var/lib/check_mk_agent/cache
mkdir -p /usr/lib/check_mk_agent/plugins
mkdir /usr/lib/check_mk_agent/local
# download check_mk agent from our cmk server
curl -s -L http://$cmk_server/$cmk_site/check_mk/agents/check_mk_agent.openwrt -o /usr/local/bin/check_mk_agent
chmod 755 /usr/local/bin/check_mk_agent
# download waitmax binary from our checkmk server
curl -s -L http://$cmk_server/$cmk_site/check_mk/agents/waitmax -o /usr/local/bin/waitmax
chmod 755 /usr/local/bin/waitmax
# register checkmk as a service
echo "checkmk-agent 6556/tcp # Checkmk monitoring agent" >> /etc/services
# create inetd.conf
cat > /etc/inetd.conf << EOF
checkmk-agent stream tcp nowait root /usr/local/bin/check_mk_agent
#checkmk-agent stream tcp6 nowait root /usr/local/bin/check_mk_agent
EOF
# create inetd init script
cat > /etc/init.d/inetd << EOF
#!/sbin/openrc-run
name="busybox \$SVCNAME"
command="/usr/sbin/\$SVCNAME"
command_args="-f \$INETD_OPTS"
pidfile="/var/run/\$SVCNAME.pid"
command_background=true
depend() {
need net localmount
after firewall
}
EOF
# make script executable
chmod 755 /etc/init.d/inetd
# modify check_mk_agent <<<check_mk>> section
sed -i 's/openwrt/alpine linux/' /usr/local/bin/check_mk_agent
# modify check_mk_agent <<<df>>> section
sed -i s"/df -kPT.*/df -kPT | egrep -v '(Filesystem|none|udev|tmpfs)'/" /usr/local/bin/check_mk_agent
sed -i s"/df -PTi.*/df -PTi | egrep -v '(Filesystem|none|udev|tmpfs)'/" /usr/local/bin/check_mk_agent
#
# create cronjob
#
cat > /etc/periodic/hourly/get.alpinelinux.online.version << EOF
#!/bin/ash
curl -s https://www.alpinelinux.org/downloads/ | grep "Current Alpine Version" | sed 's/>/ /g;s/</ /g' | awk '{print \$6}' > /var/lib/check_mk_agent/cache/alpinelinux.version
EOF
# make script executable
chmod 755 /etc/periodic/hourly/get.alpinelinux.online.version
# get current version for check_os script
/etc/periodic/hourly/get.alpinelinux.online.version
#
# create check_os script
#
cat > /usr/lib/check_mk_agent/local/check_os << EOF
#!/bin/ash
# get versions
version_online=\$(cat /var/lib/check_mk_agent/cache/alpinelinux.version)
version_installed=\$(cat /etc/alpine-release)
# check if newer version is online available
if [[ \$version_online = \$version_installed ]]; then
echo "0 Check_os" - "Alpine Linux \$version_installed - \$(uname -rvm)"
exit 0
else
echo "1 Check_os" - Alpine Linux \$version_installed - update to \$version_online available'\n'"https://www.alpinelinux.org/downloads/" "Alpine Linux downloads"
exit 1
fi
EOF
#
# create check_apk script
#
cat > /usr/lib/check_mk_agent/local/check_apk << EOF
#!/bin/ash
UPDATES=\$(apk -uU list | wc -l)
if [[ \$UPDATES -gt 0 ]]; then
LIST=\$(apk -u list | sed 's/\$/\\\n/' >/var/lib/check_mk_agent/cache/alpinelinux.packages)
echo "1 Check_apk" - \$UPDATES packages available for upgrade'\n'Package List:'\n'\$(cat /var/lib/check_mk_agent/cache/alpinelinux.packages)
exit 1
else
echo "0 Check_apk" - no packages available for upgrade
fi
EOF
# make these scripts executable
chmod +x /usr/lib/check_mk_agent/local/*
# enable autostart and start inetd
rc-update add inetd
/etc/init.d/inetd start
# status
/etc/init.d/inetd status
else
echo "ERROR - Your are not running Alpine Linux!"
fi
Installation
### socat wget https://codeberg.org/blan/checkmk-agent-alpinelinux/raw/branch/main/install-checkmk-agent-alpinelinux_socat.sh chmod +x install-checkmk-agent-alpinelinux_socat.sh # Variablen anpassen! ./install-checkmk-agent-alpinelinux_socat.sh ### inetd wget https://codeberg.org/blan/checkmk-agent-alpinelinux/raw/branch/main/install-checkmk-agent-alpinelinux_inetd.sh chmod +x install-checkmk-agent-alpinelinux_inetd.sh # Variablen anpassen! ./install-checkmk-agent-alpinelinux_inetd.sh
Host hinzufügen
Check Intervall
Lässt sich mit dem Agent nicht anpassen. Als Workaround hole ich mir die Daten über einen cronjob, speichere sie in eine Datei und werte diese dann aus. (cache)
Mein check_os script muss z.B. nicht alle 60 Sekunden die online verfügbare Alpine Version abfragen.
Ja, kann man auch alles in Checkmk in den Parametern für einen Service einstellen.
Check_os
Check_apk
Uninstall
Lässt sich auch alles wieder deinstallieren.
remove-checkmk-agent-alpinelinux_socat.sh
#!/bin/ash clear echo echo removing checkmk-agent echo service checkmk_agent stop rc-update del checkmk_agent rm /etc/init.d/checkmk_agent rm -r /etc/check_mk rm -r /var/lib/check_mk_agent rm -r /usr/lib/check_mk_agent rm /usr/local/bin/check_mk_agent rm /usr/local/bin/waitmax rm /etc/periodic/hourly/get.alpinelinux.online.version apk del socat echo echo done - reboot the machine
remove-checkmk-agent-alpinelinux_inetd.sh
#!/bin/ash clear echo echo removing checkmk-agent echo service inetd stop rc-update del inetd rm /etc/init.d/inetd rm /etc/inetd.conf rm -r /etc/check_mk rm -r /var/lib/check_mk_agent rm -r /usr/lib/check_mk_agent rm /usr/local/bin/check_mk_agent rm /usr/local/bin/waitmax rm /etc/periodic/hourly/get.alpinelinux.online.version sed -i '/6556/d' /etc/services apk del busybox-extras echo echo done - reboot the machine






Hi !
Ich hatte gerade das Web durchsucht und bin auf Deine Quelle gestoßen anhand dessen Du diese Anleitung gebaut hast.
Auf diesem Wege wiederum habe ich hier Dein Skript gefunden, welches mir quasi die ganze Arbeit (alles zu Fuß) abnimmt !
Funktioniert auf anhieb !
Vielen Dank dafür !!!
Frohes Fest und einen guten Rutsch !
Didi
Vielen Dank!
Wünsche ich Dir auch.
Ein paar Ergänzungen aus meiner Version des Scripts:
1. Das Paket busybox-extras-openrc bringt ein Initscript für inetd mit, muss man also nicht selbst schreiben:
apk add busybox-extras-openrc
rc-update add inetd default
rc-service inetd start
2. tcp6 in der inetd.conf, wenn man IPv6 verwenden möchte, bei mir haben alle Container eine öffentliche IPv6-Adresse, IPv4 nur mit NAT.
3. Auf die anzupassenden Variablen kann ganz verzichtet werden, wenn man stattdessen die Dateien vom checkmk Repository auf Github runterlädt:
curl -s -L https://raw.githubusercontent.com/Checkmk/checkmk/refs/heads/master/agents/check_mk_agent.openwrt -o /usr/local/bin/check_mk_agent
curl -s -L https://github.com/Checkmk/checkmk/raw/refs/heads/master/agents/waitmax -o /usr/local/bin/waitmax
4. Ich patche den Agent weitergehend noch dahin, dass /usr/local/lib statt /usr/lib verwendet wird:
sed -i s”/MK_LIBDIR:=\”\/usr\/lib\/check_mk_agent\”/MK_LIBDIR:=\”\/usr\/local\/lib\/check_mk_agent\”/” /usr/local/bin/check_mk_agent
sed -i s”/MK_VARDIR:=\”\/var\/lib\/check_mk_agent\”/MK_VARDIR:=\”\/var\/local\/lib\/check_mk_agent\”/” /usr/local/bin/check_mk_agent
sed -i s”/MK_BIN:=\”\/usr\/bin\”/MK_BIN:=\”\/usr\/local\/bin\”/” /usr/local/bin/check_mk_agent
Anlegen der Verzeichnisse dann auch leicht abweichend:
mkdir -p /etc/check_mk /var/local/lib/check_mk_agent/spool /var/local/lib/check_mk_agent/cache /usr/local/lib/check_mk_agent/plugins /usr/local/lib/check_mk_agent/local
Danke für deine Infos!
Hi,
ich hatte den Agent eigentlich mal in ein APK paket getan und nach -testing submitted. Leider hab ich keine Ahnung mehr, was daraus wurde. die naheliegendste Vermutung ist, dass ich es in irgendeinem Branch vergessen hab :(
Der APK check oben ist vermutlich noch von mir? Hihi. Es ist leider ewig her.
Wenn ich wieder mehr fuer Alpine mache, versuch ich das nochmal neu zu starten.
Mein letztes Setup piped den Agent zum spass via base64 durch ssh in eine Shell am anderen ende ;-)
Falls Ihr eine Meinung dazu habt – der 2.3er Agent ist ja wesentlich komplexer bzw. ausgefeilter, aber in der Form auch ohne installierte Shell kaum mehr zu gebrauchen.
Das betrifft viele OS, Alpine, FreeBSD, pfSense etc.
Wie wichtig ist Euch ein Agent im alten Stil mit nahezu keinen Dependencies? Weil das ist beim Paketieren mehrfach relevant.
a) abuild kann den agent direkt aus dem upstream git holen
b) die dependencies muessen im paket stehen. dinge wie ethtool finde ich klar vertretbar, aber was ist mit bash, procps und diversen anderen Stolperteilchen?