Skip to content

Instalador do Zabbix Agent Automático

Script interativo (CLI) projetado para simplificar e padronizar o deploy de monitoramento em servidores Linux. Ele automatiza a adição de repositórios oficiais, instalação do pacote e configuração do arquivo .conf em poucos passos.

Pré-requisitos

Para que o script faça a comunicação externa e baixe os pacotes necessários, os seguintes binários devem estar presentes no sistema:

  • curl
  • wget

Nota: A execução deve ser feita obrigatoriamente com usuário root ou permissão de sudo integral.

Como Funciona

O assistente guiará a instalação em etapas lógicas para evitar configurações incorretas:

  1. Checagem de Privilégios: Bloqueia a execução imediatamente se não for root.
  2. Versão do Zabbix: Seleção da versão do repositório oficial (5.0, 6.0, 6.4, 7.0 ou 7.2).
  3. Distribuição do SO: Suporte mapeado para Ubuntu, Debian, RHEL (CentOS/Rocky/Alma) e SUSE/SLES.
  4. Versão do SO: Opções filtradas de acordo com a distribuição escolhida no passo anterior.
  5. Tipo de Agente: Escolha entre Zabbix Agent Clássico (em C) ou Zabbix Agent 2 (em Go).
  6. Confirmação: Apresenta o resumo das variáveis escolhidas antes de realizar qualquer alteração no sistema.
  7. Instalação: Download silencioso do zabbix-release (curl+dpkg ou rpm -Uvh), atualização dos índices e instalação do agente.
  8. Configuração do .conf: Solicita interativamente os parâmetros Server, ServerActive e Hostname. Faz backup automático do arquivo original e injeta as novas configurações.
  9. Gerenciamento de Serviço: Executa o systemctl enable --now para garantir que o agente suba com o boot do sistema e exibe o status final (systemctl status).
#!/usr/bin/env bash
#
# install-zabbix-agent.sh
# Menu-driven installer for Zabbix Agent / Zabbix Agent 2 on Linux.
# Supports Debian, Ubuntu, RHEL/CentOS/Rocky/AlmaLinux and SLES.

set -euo pipefail

# ---------------------------------------------------------------------------
# Helpers
# ---------------------------------------------------------------------------

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'

info()  { echo -e "${CYAN}[INFO]${NC} $*"; }
ok()    { echo -e "${GREEN}[ OK ]${NC} $*"; }
warn()  { echo -e "${YELLOW}[WARN]${NC} $*"; }
error() { echo -e "${RED}[FAIL]${NC} $*" >&2; }

require_root() {
    if [[ "${EUID}" -ne 0 ]]; then
        error "Este script precisa ser executado como root (use sudo)."
        exit 1
    fi
}

pause() {
    read -rp "Pressione ENTER para continuar..." _
}

# ---------------------------------------------------------------------------
# Menu: Versao do Zabbix
# ---------------------------------------------------------------------------

choose_zabbix_version() {
    local options=("5.0 (LTS)" "6.0 (LTS)" "6.4" "7.0 (LTS)" "7.2")
    local values=("5.0" "6.0" "6.4" "7.0" "7.2")

    echo ""
    echo "=== Selecione a versao do Zabbix ==="
    local i
    for i in "${!options[@]}"; do
        printf "  %d) %s\n" "$((i + 1))" "${options[$i]}"
    done
    read -rp "Opcao: " choice

    if [[ ! "${choice}" =~ ^[0-9]+$ ]] || (( choice < 1 || choice > ${#values[@]} )); then
        error "Opcao invalida."
        exit 1
    fi

    ZBX_VERSION="${values[$((choice - 1))]}"
}

# ---------------------------------------------------------------------------
# Menu: Distribuicao
# ---------------------------------------------------------------------------

choose_distro() {
    local options=("Ubuntu" "Debian" "RHEL / CentOS / Rocky / AlmaLinux" "SUSE / SLES")
    local values=("ubuntu" "debian" "rhel" "sles")

    echo ""
    echo "=== Selecione a distribuicao ==="
    local i
    for i in "${!options[@]}"; do
        printf "  %d) %s\n" "$((i + 1))" "${options[$i]}"
    done
    read -rp "Opcao: " choice

    if [[ ! "${choice}" =~ ^[0-9]+$ ]] || (( choice < 1 || choice > ${#values[@]} )); then
        error "Opcao invalida."
        exit 1
    fi

    DISTRO="${values[$((choice - 1))]}"
}

# ---------------------------------------------------------------------------
# Menu: Versao do SO (depende da distro escolhida)
# ---------------------------------------------------------------------------

choose_os_version() {
    local options=()
    local values=()

    case "${DISTRO}" in
        ubuntu)
            options=("20.04 (Focal)" "22.04 (Jammy)" "24.04 (Noble)")
            values=("20.04" "22.04" "24.04")
            ;;
        debian)
            options=("10 (Buster)" "11 (Bullseye)" "12 (Bookworm)" "13 (Trixie)")
            values=("10" "11" "12" "13")
            ;;
        rhel)
            options=("7" "8" "9")
            values=("7" "8" "9")
            ;;
        sles)
            options=("15")
            values=("15")
            ;;
    esac

    echo ""
    echo "=== Selecione a versao do SO ==="
    local i
    for i in "${!options[@]}"; do
        printf "  %d) %s\n" "$((i + 1))" "${options[$i]}"
    done
    read -rp "Opcao: " choice

    if [[ ! "${choice}" =~ ^[0-9]+$ ]] || (( choice < 1 || choice > ${#values[@]} )); then
        error "Opcao invalida."
        exit 1
    fi

    OS_VERSION="${values[$((choice - 1))]}"
}

# ---------------------------------------------------------------------------
# Menu: Agent ou Agent2
# ---------------------------------------------------------------------------

choose_agent_type() {
    echo ""
    echo "=== Selecione o pacote a instalar ==="
    echo "  1) Zabbix Agent (classico)"
    echo "  2) Zabbix Agent 2"
    read -rp "Opcao: " choice

    case "${choice}" in
        1) AGENT_PKG_BASENAME="zabbix-agent" ;;
        2) AGENT_PKG_BASENAME="zabbix-agent2" ;;
        *) error "Opcao invalida."; exit 1 ;;
    esac
}

# ---------------------------------------------------------------------------
# Instalacao do repositorio oficial Zabbix
# ---------------------------------------------------------------------------

install_repo_deb() {
    local os_tag="$1"       # ubuntu | debian
    local release_deb="zabbix-release_latest+${os_tag}${OS_VERSION}_all.deb"
    local url="https://repo.zabbix.com/zabbix/${ZBX_VERSION}/${os_tag}/pool/main/z/zabbix-release/${release_deb}"

    info "Baixando repositorio Zabbix: ${url}"
    wget -O "/tmp/${release_deb}" "${url}"
    dpkg -i "/tmp/${release_deb}"
    apt-get update -y
}

install_repo_rhel() {
    local el_ver="${OS_VERSION}"
    local rpm_name="zabbix-release-${ZBX_VERSION}-1.el${el_ver}.noarch.rpm"
    local url="https://repo.zabbix.com/zabbix/${ZBX_VERSION}/rhel/${el_ver}/x86_64/${rpm_name}"

    info "Baixando repositorio Zabbix: ${url}"
    rpm -Uvh "${url}"

    if command -v dnf >/dev/null 2>&1; then
        dnf clean all
    else
        yum clean all
    fi
}

install_repo_sles() {
    local url="https://repo.zabbix.com/zabbix/${ZBX_VERSION}/sles/${OS_VERSION}/x86_64/zabbix-release-${ZBX_VERSION}-1.sles${OS_VERSION}.noarch.rpm"

    info "Baixando repositorio Zabbix: ${url}"
    rpm -Uvh "${url}"
    zypper --gpg-auto-import-keys refresh
}

# ---------------------------------------------------------------------------
# Instalacao do pacote do agente
# ---------------------------------------------------------------------------

install_agent_package() {
    case "${DISTRO}" in
        ubuntu|debian)
            apt-get install -y "${AGENT_PKG_BASENAME}"
            ;;
        rhel)
            if command -v dnf >/dev/null 2>&1; then
                dnf install -y "${AGENT_PKG_BASENAME}"
            else
                yum install -y "${AGENT_PKG_BASENAME}"
            fi
            ;;
        sles)
            zypper install -y "${AGENT_PKG_BASENAME}"
            ;;
    esac
}

# ---------------------------------------------------------------------------
# Configuracao basica (Server / Hostname) e start do servico
# ---------------------------------------------------------------------------

configure_agent() {
    local conf_file="/etc/zabbix/${AGENT_PKG_BASENAME}.conf"

    if [[ ! -f "${conf_file}" ]]; then
        warn "Arquivo de configuracao ${conf_file} nao encontrado, pulando configuracao automatica."
        return
    fi

    echo ""
    read -rp "IP/Hostname do Zabbix Server (Server=): " ZBX_SERVER
    read -rp "IP/Hostname do Zabbix Server para ativo (ServerActive=) [ENTER = mesmo valor acima]: " ZBX_SERVER_ACTIVE
    read -rp "Hostname deste agente (Hostname=) [ENTER = $(hostname)]: " ZBX_HOSTNAME

    ZBX_SERVER_ACTIVE="${ZBX_SERVER_ACTIVE:-${ZBX_SERVER}}"
    ZBX_HOSTNAME="${ZBX_HOSTNAME:-$(hostname)}"

    cp "${conf_file}" "${conf_file}.bak.$(date +%s)"

    sed -i \
        -e "s/^Server=.*/Server=${ZBX_SERVER}/" \
        -e "s/^ServerActive=.*/ServerActive=${ZBX_SERVER_ACTIVE}/" \
        -e "s/^Hostname=.*/Hostname=${ZBX_HOSTNAME}/" \
        "${conf_file}"

    ok "Configuracao aplicada em ${conf_file} (backup salvo ao lado)."
}

enable_and_start_service() {
    systemctl enable "${AGENT_PKG_BASENAME}"
    systemctl restart "${AGENT_PKG_BASENAME}"
    systemctl --no-pager status "${AGENT_PKG_BASENAME}" || true
}

# ---------------------------------------------------------------------------
# Main
# ---------------------------------------------------------------------------

main() {
    require_root

    echo "======================================="
    echo "  Instalador Zabbix Agent / Agent 2"
    echo "======================================="

    choose_zabbix_version
    choose_distro
    choose_os_version
    choose_agent_type

    echo ""
    echo "Resumo:"
    echo "  Zabbix versao : ${ZBX_VERSION}"
    echo "  Distribuicao  : ${DISTRO}"
    echo "  Versao do SO  : ${OS_VERSION}"
    echo "  Pacote        : ${AGENT_PKG_BASENAME}"
    echo ""
    read -rp "Confirmar instalacao? [s/N] " confirm
    if [[ ! "${confirm}" =~ ^[sSyY]$ ]]; then
        warn "Instalacao cancelada pelo usuario."
        exit 0
    fi

    case "${DISTRO}" in
        ubuntu) install_repo_deb "ubuntu" ;;
        debian) install_repo_deb "debian" ;;
        rhel)   install_repo_rhel ;;
        sles)   install_repo_sles ;;
    esac

    install_agent_package
    configure_agent
    enable_and_start_service

    ok "Instalacao do ${AGENT_PKG_BASENAME} concluida com sucesso."
}

main "$@"