zabbix_agent.sh
· 3.8 KiB · Bash
Raw
#!/bin/sh
# zbx-agent2-bootstrap.sh
# Installs and configures Zabbix Agent2 on Debian/Ubuntu with ACTIVE checks (no inbound port needed).
# Usage:
# sudo sh zbx-agent2-bootstrap.sh --server 192.168.1.10 [--branch 7.0] [--hostname myvm] [--metadata "linux,docker"] [--docker]
set -eu
SERVER=""
BRANCH="7.0"
HOSTNAME_OVERRIDE=""
METADATA="linux"
ENABLE_DOCKER=0
die() { echo "ERROR: $*" >&2; exit 1; }
while [ $# -gt 0 ]; do
case "$1" in
--server) SERVER="${2:-}"; shift 2 ;;
--branch) BRANCH="${2:-}"; shift 2 ;;
--hostname) HOSTNAME_OVERRIDE="${2:-}"; shift 2 ;;
--metadata) METADATA="${2:-}"; shift 2 ;;
--docker) ENABLE_DOCKER=1; shift 1 ;;
-h|--help)
cat <<EOF
Usage: sudo sh $0 --server <zabbix_server_ip_or_dns> [options]
Options:
--branch <7.0|6.0|6.4> Zabbix repo branch (default: 7.0)
--hostname <name> Hostname shown in Zabbix (default: system hostname)
--metadata <string> HostMetadata for auto-registration (default: linux)
--docker Add user 'zabbix' to docker group (optional)
EOF
exit 0
;;
*) die "Unknown argument: $1" ;;
esac
done
[ -n "$SERVER" ] || die "--server is required"
# Must be root
if [ "$(id -u)" != "0" ]; then
die "Run as root (use sudo)"
fi
# Detect OS
[ -r /etc/os-release ] || die "/etc/os-release not found"
# shellcheck disable=SC1091
. /etc/os-release
CODENAME="${VERSION_CODENAME:-}"
[ -n "$CODENAME" ] || die "VERSION_CODENAME is empty (unsupported OS?)"
case "${ID:-}" in
debian) REPO_BASE="https://repo.zabbix.com/zabbix/${BRANCH}/debian" ;;
ubuntu) REPO_BASE="https://repo.zabbix.com/zabbix/${BRANCH}/ubuntu" ;;
*)
echo "${ID_LIKE:-}" | grep -qi debian || die "Only Debian/Ubuntu are supported (ID=${ID:-unknown})"
REPO_BASE="https://repo.zabbix.com/zabbix/${BRANCH}/debian"
;;
esac
# Determine hostname for Zabbix
if [ -n "$HOSTNAME_OVERRIDE" ]; then
ZBX_HOSTNAME="$HOSTNAME_OVERRIDE"
else
ZBX_HOSTNAME="$(hostname -s 2>/dev/null || hostname || echo "unknown-host")"
fi
echo "[*] Installing prerequisites..."
export DEBIAN_FRONTEND=noninteractive
apt-get update -y
apt-get install -y --no-install-recommends ca-certificates curl gnupg
echo "[*] Adding Zabbix repo key..."
install -d -m 0755 /usr/share/keyrings
curl -fsSL "https://repo.zabbix.com/zabbix-official-repo.key" | gpg --dearmor -o /usr/share/keyrings/zabbix.gpg
echo "[*] Adding Zabbix repo list..."
cat >/etc/apt/sources.list.d/zabbix.list <<EOF
deb [signed-by=/usr/share/keyrings/zabbix.gpg] ${REPO_BASE} ${CODENAME} main
EOF
apt-get update -y
echo "[*] Installing zabbix-agent2..."
apt-get install -y zabbix-agent2
echo "[*] Writing Agent2 config (active-only)..."
install -d -m 0755 /etc/zabbix/zabbix_agent2.d
cat >/etc/zabbix/zabbix_agent2.d/99-bootstrap.conf <<EOF
### Managed by zbx-agent2-bootstrap.sh
Server=${SERVER}
ServerActive=${SERVER}
Hostname=${ZBX_HOSTNAME}
HostMetadata=${METADATA}
EOF
echo "[*] Enabling and restarting zabbix-agent2..."
systemctl enable --now zabbix-agent2
systemctl restart zabbix-agent2
if [ "$ENABLE_DOCKER" -eq 1 ]; then
if getent group docker >/dev/null 2>&1; then
echo "[*] Adding user 'zabbix' to docker group..."
usermod -aG docker zabbix || true
echo "[!] NOTE: docker.sock access is powerful. Prefer docker-socket-proxy if you want safer Docker monitoring."
else
echo "[!] docker group not found; skipping --docker"
fi
fi
echo "[*] Agent status (first lines):"
systemctl --no-pager --full status zabbix-agent2 | sed -n '1,12p'
echo
echo "[OK] Installed and configured Zabbix Agent2 (active-only)."
echo " Hostname: ${ZBX_HOSTNAME}"
echo " ServerActive: ${SERVER}"
echo " HostMetadata: ${METADATA}"
echo
echo "Next step on Zabbix Server: create an Autoregistration Action that matches HostMetadata='${METADATA}'"
echo "and links the appropriate template (e.g., 'Linux by Zabbix agent active')."
| 1 | #!/bin/sh |
| 2 | # zbx-agent2-bootstrap.sh |
| 3 | # Installs and configures Zabbix Agent2 on Debian/Ubuntu with ACTIVE checks (no inbound port needed). |
| 4 | # Usage: |
| 5 | # sudo sh zbx-agent2-bootstrap.sh --server 192.168.1.10 [--branch 7.0] [--hostname myvm] [--metadata "linux,docker"] [--docker] |
| 6 | set -eu |
| 7 | |
| 8 | SERVER="" |
| 9 | BRANCH="7.0" |
| 10 | HOSTNAME_OVERRIDE="" |
| 11 | METADATA="linux" |
| 12 | ENABLE_DOCKER=0 |
| 13 | |
| 14 | die() { echo "ERROR: $*" >&2; exit 1; } |
| 15 | |
| 16 | while [ $# -gt 0 ]; do |
| 17 | case "$1" in |
| 18 | --server) SERVER="${2:-}"; shift 2 ;; |
| 19 | --branch) BRANCH="${2:-}"; shift 2 ;; |
| 20 | --hostname) HOSTNAME_OVERRIDE="${2:-}"; shift 2 ;; |
| 21 | --metadata) METADATA="${2:-}"; shift 2 ;; |
| 22 | --docker) ENABLE_DOCKER=1; shift 1 ;; |
| 23 | -h|--help) |
| 24 | cat <<EOF |
| 25 | Usage: sudo sh $0 --server <zabbix_server_ip_or_dns> [options] |
| 26 | Options: |
| 27 | --branch <7.0|6.0|6.4> Zabbix repo branch (default: 7.0) |
| 28 | --hostname <name> Hostname shown in Zabbix (default: system hostname) |
| 29 | --metadata <string> HostMetadata for auto-registration (default: linux) |
| 30 | --docker Add user 'zabbix' to docker group (optional) |
| 31 | EOF |
| 32 | exit 0 |
| 33 | ;; |
| 34 | *) die "Unknown argument: $1" ;; |
| 35 | esac |
| 36 | done |
| 37 | |
| 38 | [ -n "$SERVER" ] || die "--server is required" |
| 39 | |
| 40 | # Must be root |
| 41 | if [ "$(id -u)" != "0" ]; then |
| 42 | die "Run as root (use sudo)" |
| 43 | fi |
| 44 | |
| 45 | # Detect OS |
| 46 | [ -r /etc/os-release ] || die "/etc/os-release not found" |
| 47 | # shellcheck disable=SC1091 |
| 48 | . /etc/os-release |
| 49 | |
| 50 | CODENAME="${VERSION_CODENAME:-}" |
| 51 | [ -n "$CODENAME" ] || die "VERSION_CODENAME is empty (unsupported OS?)" |
| 52 | |
| 53 | case "${ID:-}" in |
| 54 | debian) REPO_BASE="https://repo.zabbix.com/zabbix/${BRANCH}/debian" ;; |
| 55 | ubuntu) REPO_BASE="https://repo.zabbix.com/zabbix/${BRANCH}/ubuntu" ;; |
| 56 | *) |
| 57 | echo "${ID_LIKE:-}" | grep -qi debian || die "Only Debian/Ubuntu are supported (ID=${ID:-unknown})" |
| 58 | REPO_BASE="https://repo.zabbix.com/zabbix/${BRANCH}/debian" |
| 59 | ;; |
| 60 | esac |
| 61 | |
| 62 | # Determine hostname for Zabbix |
| 63 | if [ -n "$HOSTNAME_OVERRIDE" ]; then |
| 64 | ZBX_HOSTNAME="$HOSTNAME_OVERRIDE" |
| 65 | else |
| 66 | ZBX_HOSTNAME="$(hostname -s 2>/dev/null || hostname || echo "unknown-host")" |
| 67 | fi |
| 68 | |
| 69 | echo "[*] Installing prerequisites..." |
| 70 | export DEBIAN_FRONTEND=noninteractive |
| 71 | apt-get update -y |
| 72 | apt-get install -y --no-install-recommends ca-certificates curl gnupg |
| 73 | |
| 74 | echo "[*] Adding Zabbix repo key..." |
| 75 | install -d -m 0755 /usr/share/keyrings |
| 76 | curl -fsSL "https://repo.zabbix.com/zabbix-official-repo.key" | gpg --dearmor -o /usr/share/keyrings/zabbix.gpg |
| 77 | |
| 78 | echo "[*] Adding Zabbix repo list..." |
| 79 | cat >/etc/apt/sources.list.d/zabbix.list <<EOF |
| 80 | deb [signed-by=/usr/share/keyrings/zabbix.gpg] ${REPO_BASE} ${CODENAME} main |
| 81 | EOF |
| 82 | |
| 83 | apt-get update -y |
| 84 | |
| 85 | echo "[*] Installing zabbix-agent2..." |
| 86 | apt-get install -y zabbix-agent2 |
| 87 | |
| 88 | echo "[*] Writing Agent2 config (active-only)..." |
| 89 | install -d -m 0755 /etc/zabbix/zabbix_agent2.d |
| 90 | cat >/etc/zabbix/zabbix_agent2.d/99-bootstrap.conf <<EOF |
| 91 | ### Managed by zbx-agent2-bootstrap.sh |
| 92 | Server=${SERVER} |
| 93 | ServerActive=${SERVER} |
| 94 | Hostname=${ZBX_HOSTNAME} |
| 95 | HostMetadata=${METADATA} |
| 96 | EOF |
| 97 | |
| 98 | echo "[*] Enabling and restarting zabbix-agent2..." |
| 99 | systemctl enable --now zabbix-agent2 |
| 100 | systemctl restart zabbix-agent2 |
| 101 | |
| 102 | if [ "$ENABLE_DOCKER" -eq 1 ]; then |
| 103 | if getent group docker >/dev/null 2>&1; then |
| 104 | echo "[*] Adding user 'zabbix' to docker group..." |
| 105 | usermod -aG docker zabbix || true |
| 106 | echo "[!] NOTE: docker.sock access is powerful. Prefer docker-socket-proxy if you want safer Docker monitoring." |
| 107 | else |
| 108 | echo "[!] docker group not found; skipping --docker" |
| 109 | fi |
| 110 | fi |
| 111 | |
| 112 | echo "[*] Agent status (first lines):" |
| 113 | systemctl --no-pager --full status zabbix-agent2 | sed -n '1,12p' |
| 114 | |
| 115 | echo |
| 116 | echo "[OK] Installed and configured Zabbix Agent2 (active-only)." |
| 117 | echo " Hostname: ${ZBX_HOSTNAME}" |
| 118 | echo " ServerActive: ${SERVER}" |
| 119 | echo " HostMetadata: ${METADATA}" |
| 120 | echo |
| 121 | echo "Next step on Zabbix Server: create an Autoregistration Action that matches HostMetadata='${METADATA}'" |
| 122 | echo "and links the appropriate template (e.g., 'Linux by Zabbix agent active')." |
| 123 |