본문 바로가기

인프라/MW

zabbix(server)

많은 서버들을 관리하기 위해서는 그 서버들의 상태를 알필요가 있다.

 

하지만, 많은 서버들의 상태를 실시간적으로 확인하기란 시간적/물리적으로도 무리수가 있다.

 

이런 고민과 문제를 해결하기 위해 많은 리소스를 사용하지 않고 많은 서버들을 관리 할 수 있는 오픈소스 네트워크 관제툴(Zabbx)을 간단하게 소개하겠다.

 

Zabbix는 수많은 종류의 네트워크 서비스, 서버 등 네트워크를 통해 하드웨어를 관제하여 관리자에게 장애 발생을 실시간으로 알 수있게 만들어진 네트워크 관리 시스템이다. 

 

저자가 Zabbix 설치시에 사용되었던 OS.Spec 및 MW.Spec 정보는 아래와 같다. 

#--------------------------------------------------------------------------------------------------------
#- OS Spec : Red Hat Enterprise Linux version 8 (HVM), EBS General Purpose (SSD) Volume Type
#- Os Detail : Red Hat Enterprise Linux release 8.2 (Ootpa)
#- MiddleWare Spec
#- PHP : PHP 7.2.24 (cli) (built: Oct 22 2019 08:28:36) ( NTS )
#- MariaDB : Ver 9.1 Distrib 10.4.13-MariaDB, for Linux on x86_64
#- Nginx : nginx/1.16.1(Stable) + OpenSSL 1.1.1c
#- Zabbix : Zabbix 5.0 LTS
#--------------------------------------------------------------------------------------------------------

소개는 여기 까지하며, 본론으로 들어가서 설치 방법(Source)에 대해 기재한다.

 

설치 방법이 다소 복잡 할 수 있으나, 순서대로 진행한다면 클리어 할 수 있을 것이다.

 


Previous Setting(mariadb/php/nginx) 

더보기

0. Selinux Firewall Daemon Service Disable & Stop & Policy Setting(root)

  > 권한문제로 발생될 소지 사전에 예외처리진행(필수)

$ systemctl stop firewalld
$ systemctl disable firewalld
$ setsebool -P httpd_can_connect_zabbix on
$ setsebool -P httpd_can_network_connect_db on
$ setsebool -P httpd_read_user_content on

 

0-1. Account Create(root)

  > DB(Maria)/PHP 제외한 실제 Frontend에서 동작하는 프로그램 권한/설치분리(보안)

>> nginx account create
$ export ID=nginx; export PASS=nginx1234;
$ useradd $ID -m -s /bin/bash
$ echo $PASS | passwd --stdin $ID

>> zabbix account create
$ export ID=zabbix; export PASS=zabbix1234;
$ useradd $ID -m -s /bin/bash
$ echo $PASS | passwd --stdin $ID

 

0-2. Account Profile Setting(nginx/zabbix)

  > 경로 공통화 및 스크립트 간소화를 위한 파라메터 정의 

$ su - nginx
$ su - zabbix
$ vi .bash_profile

################################################################################
#- nginx & zabbix account profile same setting
################################################################################
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH

## Edit Server Env Setting
export ID=`whoami`
export BASE_DIR=`cat /etc/passwd|grep ${ID}|cut -f6 -d ':'`
export PS1='[`id -nu`@`hostname`:$PWD]# '
export LANG=ko_KR.utf-8

stty erase "^H" kill "^U" intr "^C" eof "^D" susp "^Z" cs8 -ixany -parenb -istrip

## directory paths
export SCRIPT_DIR=${BASE_DIR}/scripts
export APP_DIR=${BASE_DIR}/appsw
################################################################################

 

0-3. Account Sudoers Set(root)

  > zabbix/nginx 설치 시, sudo 권한 사용을 위한 권한 부여

$ vi /etc/sudoers

root    ALL=(ALL)       ALL
zabbix  ALL=(ALL)       NOPASSWD:ALL
nginx   ALL=(ALL)       NOPASSWD:ALL

 

0-4. Require Lib Install(root)

  > ZABBIX / PHP / NGINX 설치 SO(Shared Object) 사용을 위한 필수 라이브러리 설치(필수)

@@zabbix required libraries(make wget gcc gcc-c++ libpcre libevent libpthread zlib OpenIPMI libssh2 fping libcurl libxml2 ldap mysqli net-snmp)
$ yum install -y make wget gcc gcc-c++ net-snmp-devel libevent-devel libcurl-devel OpenIPMI pcre-devel zlib zlib-devel libssh2 libxml2-devel curl curl-devel pcre-devel pcre2-devel

@@php required libraries(php php-gd php-bcmath php-ctype php-xml php-xmlreader php-xmlwriter php-session php-net-socket php-mbstring php-gettext php-ldap php-mysql)
$ yum install -y php php-gd php-bcmath php-ctype php-xml php-xmlreader php-xmlwriter php-mbstring php-gettext php-ldap php-json php-mysqlnd

@@nginx required libraries(perl perl-ExtUtils-Embed libxslt libxml2 gd GeoIP)
$ yum install -y perl perl-devel perl-ExtUtils-Embed libxslt libxslt-devel libxml2 libxml2-devel gd-devel 

$ yum -y update

 

0-5. Install & Setting MariaDB(latest_version)(root)

  > MARIADB 설치 및 ZABBIX Compile Header 사용을 위한 필수 라이브러리 설치(필수)

  > DB 다운대비 헬스체크 스크립트작성/스케쥴러등록

$ curl -LsS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
$ yum install MariaDB-client MariaDB-server mariadb-devel

 

>> if dosen't work(lower version install)

$ vi /etc/yum.repos.d/mariadb.repo
[mariadb]
name = MariaDB Server
baseurl = http://yum.mariadb.org/5.5/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
$ yum install MariaDB-client MariaDB-server mariadb-devel

 

>> if dependency error

$ yum install --allowerasing mariadb-devel

 

>>Another Way DB(mysql)

@@mysql required libraries 
$ yum -y install mysql mysql-server mysql-devel 
$ service mysqld start

 

>> 계속진행(MariaDB)

$ systemctl start mariadb
$ systemctl enable mariadb
$ '/usr/bin/mysqladmin' -u root password 'maria1234'
$ '/usr/bin/mysql_secure_installation'
  > Enter current password for root (enter for none): maria1234
  > Switch to unix_socket authentication [Y/n] n
  > Change the root password? [Y/n] n
  > Remove anonymous users? [Y/n] Y
  > Disallow root login remotely? [Y/n] Y
  > Remove test database and access to it? [Y/n] Y
  > Reload privilege tables now? [Y/n] Y
$ vi /etc/my.cnf.d/client.cnf
[client]
port		= 3306
socket		= /var/lib/mysql/mysql.sock
default-character-set=utf8
$ vi /etc/my.cnf.d/server.cnf
[mysqld]
character_set_server=utf8
collation-server=utf8_bin
init_connect="SET NAMES utf8 collate utf8_bin"
port		= 3306
socket		= /var/lib/mysql/mysql.sock

innodb_file_per_table=1
innodb_buffer_pool_size = 768M # attention to the parameter! set about 2 times less than the amount of server RAM
innodb_buffer_pool_instances=1 # increase by 1 each GB innodb_buffer_pool_size
innodb_flush_log_at_trx_commit = 0
innodb_log_file_size = 512M
innodb_log_files_in_group = 3
$ systemctl restart mariadb
$ systemctl status mariadb.service
$ '/usr/bin/mysqld_safe' --datadir=/var/lib/mysql
$ mysql -uroot -pmaria1234
  mysql>  show grants for 'root'@'localhost';
  +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  | Grants for root@localhost                                                                                                                                                 |
  +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  | GRANT ALL PRIVILEGES ON *.* TO `root`@`localhost` IDENTIFIED VIA mysql_native_password USING '*078BB33244157DC3D5DB501F7814342A3648A216' OR unix_socket WITH GRANT OPTION |
  | GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION                                                                                                             |
  +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  mysql> create user 'zabbix'@'localhost' identified BY 'zabbix';
  mysql> grant all privileges on zabbix.* to 'zabbix'@'localhost';
  mysql> grant proxy on ''@'%' to 'zabbix'@'localhost' with grant option;
  mysql> show grants for 'zabbix'@'localhost';
  +---------------------------------------------------------------------------------------------------------------------------------+
  | Grants for zabbix@localhost                                                                                                     |
  +---------------------------------------------------------------------------------------------------------------------------------+
  | GRANT USAGE ON *.* TO `zabbix`@`localhost` IDENTIFIED BY PASSWORD '*DEEF4D7D88CD046ECA02A80393B7780A63E7E789' WITH GRANT OPTION |
  | GRANT ALL PRIVILEGES ON `zabbix`.* TO `zabbix`@`localhost`                                                                      |
  | GRANT PROXY ON ''@'%' TO 'zabbix'@'localhost' WITH GRANT OPTION                                                                 |
  +---------------------------------------------------------------------------------------------------------------------------------+
  mysql> flush privileges;
  mysql> create database zabbix character set utf8 collate utf8_bin;
  mysql> show databases;
  mysql> use zabbix;
  mysql> show tables;
  mysql> quit
$ sudo mysqladmin --version
$ netstat -an | grep LISTEN
$ ps -ef | grep mysql
$ mkdir /root/scripts
$ vi /root/scripts/maria_db_health_chk.sh

#!/bin/bash

#---------------------------------------
#-- Set Error if Variable is Not Set
#-- Set Exit if Error is Occured
#---------------------------------------

set -o nounset
set -o errexit

#---------------------------------------
# // Check Parameter & Define Variable
#---------------------------------------

daemon_name="mysqld"
valid_name="mysqld_safe|grep"
ps_chk=`ps -ef | grep "${daemon_name}" | egrep -v "${valid_name}" | wc -l`

#---------------------------------------
# // Action Scripts 
#---------------------------------------

if [[ ${ps_chk} -eq 1 ]]; then
    echo "[ INFO ] ${daemon_name} is working."
else
    echo "[ ERROR ] ${daemon_name} is dead."
    echo "[ ERROR ] ${daemon_name} will start."
    systemctl start mariadb
fi
$ crontab -e
# MariaDB Health Check Script
*/5 * * * * sh /root/scripts/maria_db_health_chk.sh

 

0-6. Setting PHP-FPM(root)

  > WEB을 통해 실행되는 PHP 파일로딩을 위한 PHP-FPM 설정 및 기동

  > PHP-FPM 다운대비 헬스체크 스크립트 작성/스케쥴러등록

$ systemctl start php-fpm
$ systemctl enable php-fpm
$ ps -ef | grep php
$ vi /etc/php-fpm.d/www.conf
  ########################################
  #- Modify Parameters
  ########################################
  user = nginx
  group = nginx

  listen = /var/run/php-fpm/php-fpm.sock
  listen.owner = nginx
  listen.group = nginx
  ##########################################
$ systemctl restart php-fpm
$ ls -lrt /var/run/php-fpm/php-fpm.sock
$ chown -R nginx:nginx /var/lib/php/session
$ vi /root/scripts/php-fpm_health_chk.sh

#!/bin/bash

#---------------------------------------
#-- Set Error if Variable is Not Set
#-- Set Exit if Error is Occured
#---------------------------------------

set -o nounset
set -o errexit

#---------------------------------------
# // Check Parameter & Define Variable
#---------------------------------------

daemon_name="php-fpm: master"
valid_name="www|grep"
ps_chk=`ps -ef | grep "${daemon_name}" | egrep -v "${valid_name}" | wc -l`

#---------------------------------------
# // Action Scripts 
#---------------------------------------

if [[ ${ps_chk} -eq 1 ]]; then
    echo "[ INFO ] ${daemon_name} is working."
else
    echo "[ ERROR ] ${daemon_name} is dead."
    echo "[ ERROR ] ${daemon_name} will start."
    systemctl start php-fpm
fi
$ crontab -e
# php-fpm Health Check Script
*/5 * * * * sh /root/scripts/php-fpm_health_chk.sh

 

0-7. Install & Setting Nginx

  > 와부 브라우저 호출/접근 수용을 위한 WEB서버 설치 및 PHP-FPM 바인딩설정

  > NGINX 컨트롤을 위한 스크립트작성(기동/정지/재기동/리로드/상태확인)

$ su - nginx
$ mkdir ${APP_DIR}
$ export SERV_DIR=${BASE_DIR}/nginx
$ cd ${APP_DIR}; wget https://nginx.org/download/nginx-1.16.1.tar.gz
$ tar zxf nginx-1.16.1.tar.gz
$ cd ${APP_DIR}/nginx-1.16.1
$ sudo cp ${APP_DIR}/nginx-1.16.1/man/nginx.8 /usr/share/man/man8
$ sudo gzip /usr/share/man/man8/nginx.8
$ man nginx
$ ./configure \
  --prefix=${SERV_DIR} \
  --with-pcre \
  --with-http_ssl_module \
  --with-stream \
  --with-http_stub_status_module \
  --with-mail
$ sudo make install
$ sudo mkdir -p ${SERV_DIR}/html/zabbix
$ sudo chown -R nginx:nginx ${SERV_DIR}
$ sudo chown root:nginx ${SERV_DIR}/sbin/nginx
$ sudo chmod +s ${SERV_DIR}/sbin/nginx
$ cp ${SERV_DIR}/conf/nginx.conf ${SERV_DIR}/conf/nginx.conf_ori
$ vi ${SERV_DIR}/conf/nginx.conf

user  nginx;
worker_processes  4;

error_log  logs/error.log info;
pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
		      '$status $body_bytes_sent "$http_referer" '
		      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;
    autoindex       off;
    server_tokens   off;

    include conf.d/*.conf;
}
$ mkdir ${SERV_DIR}/conf/conf.d
$ vi ${SERV_DIR}/conf/conf.d/default.conf

server {
    listen       80 default_server;
    listen [::]:80 default_server;
    server_name  localhost;
    client_max_body_size 5m;
    client_body_buffer_size 128k;

    location = /stub_status {
        stub_status on;
        access_log off;
        #allow 127.0.0.1;
        #deny all;
        allow all;
    }

    location / {
        root      /home/nginx/nginx/html/zabbix;
        index     index.php index.html index.htm;
        location ~ \.php$ {
            fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
            fastcgi_index index.php;
	    fastcgi_param SCRIPT_NAME $fastcgi_script_name;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
            fastcgi_param PHP_VALUE "
                max_execution_time = 300
                 memory_limit = 128M
                post_max_size = 16M
                upload_max_filesize = 2M
                max_input_time = 300
                date.timezone = Asia/Seoul
                ";
            fastcgi_buffers 8 256k;
            fastcgi_buffer_size 128k;
            fastcgi_intercept_errors on;
            fastcgi_busy_buffers_size 256k;
            fastcgi_temp_file_write_size 256k;
        }

        location ~*  \.(jpg|jpeg|png|gif|css|js|ico)$ {
            expires max;
            log_not_found off;
        }

        location ~ /\.ht {
            deny all;
		allow all;
        }

        location ~ /\. {
            deny all;
		allow all;
        }

	proxy_intercept_errors on;
        error_page 404 500 502 503 504 /50x.html;
        location = /50x.html {
            root /nginx/nginx/html;
            internal;
        }

        if ($request_method !~ ^(GET|POST|HEAD)$) {
            return 444;
        }
    }
}
$ cd ${SERV_DIR}/sbin; ./nginx -t
$ cd ${SERV_DIR}/sbin; ./nginx
$ netstat -tulpn | grep nginx
$ mkdir ${SCRIPT_DIR}
$ vi ${SCRIPT_DIR}/nginx_ctrl.sh
#!/bin/bash

#--------------------------------------------------------------------------
#-- Set Error if Variable is Not Set
#-- Set Exit if Error is Occured
#--------------------------------------------------------------------------

#set -o nounset
#set -o errexit

#--------------------------------------------------------------------------
# // Check Parameter & Define Variable
#--------------------------------------------------------------------------

source /home/nginx/.bash_profile

if [[ $# -lt 1 ]]; then
    if [[ $# != $1 ]]; then
        echo
        echo "[ ERROR ] NOT FOUND CMD : ($1)"
        echo "[ INFO ] ex ) ./nginx_ctrl.sh {start|stop|restart|reload}"
        echo
        exit 1
    fi
fi

ARGS1=$1

#- PATHS
APP_NAME=nginx_ctrl
ID=`id -u -n`
SCT_DIR=`cat /etc/passwd|grep ${ID}|cut -f6 -d ':'`/scripts
APP_DIR=/home/nginx/nginx
LOG_DIR=${SCT_DIR}/logs

#- ETC
TIMESTAMP=`date +%Y%m%d-%H%M%S`
CHECK_DATE=`date +%Y-%m-%d`
DATE=`date +%Y%m%d`

#- CMD_LIST
CMD_LIST=("start" "stop" "restart" "reload" "pscheck")

#- PID COUNT
PIC=`ps -ef | egrep -i "master process|worker process" | grep -v "grep" | wc -l`

#---------------------------------------------------------------
# // Validate Parameter & Run Script
#---------------------------------------------------------------

func_main() {
    echo
    echo "[ INFO ] func_main"
    func_chk_dir ${LOG_DIR}
    export CMD=$(func_chk_parm ${ARGS1} CMD_LIST)
    if [[ -z ${CMD} ]]; then
        echo
        echo "[ ERROR ] PLEASE CHECK YOUR CMD ARGUMENT_1 : ${ARGS1}"
        echo "[ INFO ] ex ) ./${APP_NAME}.sh {start|stop|restart|reload}"
        echo
        exit 1
    fi
    func_remove ${LOG_DIR}
    func_cmd ${APP_DIR}/sbin ${APP_NAME} ${CMD} CMD_LIST ${PIC} 2>&1 | tee "${LOG_DIR}/${APP_NAME}_${CMD}_${TIMESTAMP}".log
}

func_remove() {
    local VAL1=$1
    echo
    echo "[ INFO ] func_remove"
    echo "[ INFO ] cd ${VAL1}; find ./* -name '*.log' -mtime +7 | xargs -n1 rm -f"
    cd ${VAL1}; find ./* -name "*.log" -mtime +7 | xargs -n1 rm -f
}

func_cmd() {
    local VAL1=$1
    local VAL2=${2%%_*}
    local VAL3=$3
    local VAL4=$4[@]
    local VAL4=("${!VAL4}")
    local VAL5=$5

    echo
    echo "[ INFO ] func_cmd"
    if [[ ${VAL3} == ${VAL4[0]} ]]; then
        func_valid_proc ${VAL5} ${VAL3} $4
        echo "[ INFO ] cd ${VAL1}; ${VAL2}"
        cd ${VAL1}; ${VAL2}
        func_chk_proc ${VAL2} $2
    elif [[ ${VAL3} == ${VAL4[1]} ]]; then
        func_valid_proc ${VAL5} ${VAL3} $4
        echo "[ INFO ] cd ${VAL1}; ${VAL2} -s ${VAL3}"
        cd ${VAL1}; ${VAL2} -s ${VAL3}
        func_chk_proc ${VAL2} $2
    elif [[ ${VAL3} == ${VAL4[4]} ]]; then
        func_chk_proc ${VAL2} $2
    else
        echo "[ INFO ] cd ${VAL1}; ${VAL2} -s ${VAL3}"
        cd ${VAL1}; ${VAL2} -s ${VAL3}
        func_chk_proc ${VAL2} $2
    fi
}

func_valid_proc() {
    local VAL1=$1
    local VAL2=$2
    local VAL3=$3[@]
    local VAL3=("${!VAL3}")
    if [[ ${VAL2} == ${VAL3[0]} ]]; then
        if [[ ${VAL1} -gt 1 ]]; then
            echo "[ INFO ] NGINX is Already ${VAL2}ed."
            echo "[ INFO ] exit."
            exit 0
        fi
    elif [[ ${VAL2} == ${VAL3[1]} ]]; then
        if [[ ${VAL1} -lt 1 ]]; then
            echo "[ INFO ] NGINX is Already ${VAL2}ed."
            echo "[ INFO ] exit."
            exit 0
        fi
    fi
}

func_chk_proc() {
    local VAL1=$1
    local VAL2=$2
    echo
    echo "[ INFO ] func_chk_proc"
    echo "ps -ef | grep ${VAL1} | grep -v grep | grep -v ${VAL2}"
    ps -ef | grep ${VAL1} | grep -v "grep" | grep -v "${VAL2}"
}

func_chk_parm() {
    local VAL1=$1
    local VAL2=$2[@]
    local VAL2=("${!VAL2}")
    for VALID in ${VAL2[@]} ;do
        if [[ ${VAL1} == ${VALID%/*} ]]; then
            echo "${VAL1}"
        else
            continue
        fi
    done
}

func_chk_dir() {
    local VAL1=$1
    echo
    echo "[ INFO ] func_chk_dir"
    if [[ ! -d ${VAL1} ]]; then
        echo "[ INFO ] mkdir -p ${VAL1}"
        mkdir -p ${VAL1}
    fi
}

func_main

 

$ chmod 755 ${SCRIPT_DIR}/nginx_ctrl.sh
$ vi /home/nginx/.bash_profile

#- user log alias
alias webstart='sh ${SCT_DIR}/nginx_ctrl.sh start'
alias webstop='sh ${SCT_DIR}/nginx_ctrl.sh stop'
alias webreload='sh ${SCT_DIR}/nginx_ctrl.sh reload'
alias pscheck='sh ${SCT_DIR}/nginx_ctrl.sh pscheck'
$ source /home/nginx/.bash_profile
$ pscheck

 

 


Main Setting(zabbix) 

더보기

 0. Install & Setting Zabbix(Server)

  > 모니터링 및 관제 수용을 위한 메인 컨트롤 관리서버 설치

$ su - zabbix
$ export SERV_DIR=${BASE_DIR}/server
$ mkdir ${SERV_DIR} ${SERV_DIR}/logs ${APP_DIR} ${SCRIPT_DIR}; ls -lrt ${BASE_DIR}
$ cd ${APP_DIR}
$ wget https://cdn.zabbix.com/zabbix/sources/stable/5.0/zabbix-5.0.0.tar.gz
$ tar -zxvf zabbix-5.0.0.tar.gz
#! If you are installing Zabbix from sources, proceed to import the data into the database. 
   For a Zabbix proxy database, only schema.sql should be imported (no images.sql nor data.sql):
$ cd ${APP_DIR}/zabbix-5.0.0/database/mysql
$ sudo mysql -uzabbix -pzabbix zabbix < schema.sql

#! stop here if you are creating database for Zabbix proxy
$ sudo mysql -uzabbix -pzabbix zabbix < images.sql
$ sudo mysql -uzabbix -pzabbix zabbix < data.sql
$ cd ${APP_DIR}/zabbix-5.0.0; ./configure --help
$ ./configure --prefix=${SERV_DIR} \
  --enable-server \
  --enable-agent \
  --with-mysql \
  --enable-ipv6 \
  --with-net-snmp \
  --with-libcurl \
  --with-libxml2
$ sudo make install
$ sudo chown -R zabbix:zabbix ${SERV_DIR}
$ sudo cp -Rf ${APP_DIR}/zabbix-5.0.0/ui/* /home/nginx/nginx/html/zabbix/
$ sudo chown -R nginx:nginx /home/nginx/nginx/html/zabbix
$ sudo chcon -R -t httpd_sys_rw_content_t /home/nginx/nginx/html/zabbix
$ sudo ls -alZ /home/nginx/nginx/html/zabbix
$ vi ${SERV_DIR}/etc/zabbix_server.conf
  ########################################
  #- Modify Parameters
  ########################################
  LogFile=/home/zabbix/server/logs/zabbix_server.log
  DBHost=localhost
  DBPassword=zabbix
  ListenIP=127.0.0.1
  Timeout=10
  ########################################
$ vi ${SERV_DIR}/etc/zabbix_agentd.conf
  ########################################
  #- Modify Parameters
  ########################################
  LogFile=/home/zabbix/server/logs/zabbix_agentd.log
  Server=127.0.0.1
  ServerActive=127.0.0.1
  Hostname=Zabbix server
  ########################################
$ vi ${SCRIPT_DIR}/zabbix_ctrl.sh

#!/bin/bash

#--------------------------------------------------------------------------
#-- Set Error if Variable is Not Set
#-- Set Exit if Error is Occured
#--------------------------------------------------------------------------

#set -o nounset
set -o errexit

#--------------------------------------------------------------------------
# // Check Parameter & Define Variable
#--------------------------------------------------------------------------

if [[ $# -lt 2 ]]; then
    if [[ $# != $1 && $# != $2 ]]; then
        echo
        echo "[ ERROR ] NOT FOUND PLF & CMD : ($1) ($2)"
        echo "[ INFO ] ex ) ./zabbix_ctrl.sh (server or agentd)(start or stop or log)"
        echo
        exit 1
    fi
fi

PLF=$1
CMD=$2
LOG_DIR=${SCRIPT_DIR}/logs
APP_DIR=${BASE_DIR}/server
APP_LOG_DIR=${APP_DIR}/logs
PLF_LIST=("server" "agentd")
CMD_LIST=("log" "start" "stop")
DIR_LIST=("${LOG_DIR}")
DATE=`date +%Y%m%d-%H%M%S`
UNAME=`id -u -n`
APP_USER="zabbix"

#---------------------------------------------------------------
# // Validate Parameter & Run Script
#---------------------------------------------------------------

func_main() {
    func_dir_chk DIR_LIST
    export MW=$(func_parm_chk ${PLF} PLF_LIST)
    export ACT=$(func_parm_chk ${CMD} CMD_LIST)
    if [[ -z ${MW} ]]; then
        echo
        echo "[ ERROR ] PLEASE CHECK PARAMETER PLF: ${MW}"
        echo "[ INFO ] ex ) ./zabbix_ctrl.sh (server or agentd)(start or stop or log)"
        echo
        exit 1
    fi
    if [[ -z ${ACT} ]]; then
        echo
        echo "[ ERROR ] PLEASE CHECK PARAMETER CMD : ${ACT}"
        echo "[ INFO ] ex ) ./zabbix_ctrl.sh (${MW})(start or stop or log)"
        echo
        exit 1
    fi
    export LOG_NM=${APP_LOG_DIR}/${APP_USER}_${MW}.log
    export PID=$(func_pid_chk "${APP_USER}_${MW}.conf")
    func_user_chk ${APP_USER} ${UNAME}
    func_ctrl CMD_LIST ${ACT} ${LOG_NM} ${APP_DIR} ${APP_USER}_${MW} ${PID}
}

func_dir_chk() {
    local VALS=$1[@]
    local VALS=("${!VALS}")
    for VAL in "${VALS[@]}"; do
        func_make_dir ${VAL}
    done
}

func_make_dir() {
    local VAL1=$1
    if [[ ! -d ${VAL1} ]]; then
        echo "[ INFO ] mkdir -p ${VAL1}"
        mkdir -p ${VAL1}
    fi
}

func_parm_chk() {
    local VAL1=$1
    local VAL2=$2[@]
    local VAL2=("${!VAL2}")
    for VALID in ${VAL2[@]} ;do
        if [[ ${VAL1} == ${VALID%/*} ]]; then
            echo "${VAL1}"
        else
            continue
        fi
    done
}

func_user_chk() {
    local VAL1=$1
    local VAL2=$2
    if [[ ${VAL1} != ${VAL2} ]]; then
        echo "[ INFO ] CAN BE START (${VAL2}) USER ONLY."
        exit 1;
    fi
}

func_pid_chk() {
    local VAL1=$1
    local VAL2=`ps -ef | grep ${VAL1} | grep -v "grep" | awk '{print $2}'`
    if [[ ! -z ${VAL2} ]]; then
        echo "${VAL2}"
    fi
}

func_ctrl() {
    local VAL1=$1[@]
    local VAL1=("${!VAL1}")
    local VAL2=$2
    local VAL3=$3
    local VAL4=$4
    local VAL5=$5
    local VAL6=$6

    if [[ ${VAL2} = "${VAL1[0]}" ]]; then
        echo "[ INFO ] tail -f ${VAL3}"
	    tail -f ${VAL3}
    elif [[ ${VAL2} = "${VAL1[1]}" ]]; then
        if [[ -z ${VAL6} ]]; then
            echo "[ INFO ] ${VAL5} process is ${VAL2}."
            ${VAL4}/sbin/${VAL5} -c ${VAL4}/etc/${VAL5}.conf
	    func_pid_chk ${VAL5}.conf
	else
            echo "[ INFO ] ${VAL5} process is already ${VAL2}ed."
	    exit 0;
	fi
    elif [[ ${VAL2} = "${VAL1[2]}" ]]; then
        if [[ -z ${VAL6} ]]; then
            echo "[ INFO ] ${VAL5} process is already ${VAL2}ed."
	    exit 0;
	else
            echo "[ INFO ] ${VAL5} process is ${VAL2}."
            killall -9 ${VAL5}
	    func_pid_chk ${VAL5}.conf
	fi
    fi
}

func_main

 

$ chmod 755 ${SCRIPT_DIR}/zabbix_ctrl.sh
$ vi /home/zabbix/.bash_profile

## user alias
alias zs_start='sh ${SCRIPT_DIR}/zabbix_ctrl.sh server start'
alias zs_stop='sh ${SCRIPT_DIR}/zabbix_ctrl.sh server stop'
alias zs_log='sh ${SCRIPT_DIR}/zabbix_ctrl.sh server log'
alias za_log='sh ${SCRIPT_DIR}/zabbix_ctrl.sh agentd log'
alias za_start='sh ${SCRIPT_DIR}/zabbix_ctrl.sh agentd start'
alias za_stop='sh ${SCRIPT_DIR}/zabbix_ctrl.sh agentd stop'
$ source /home/zabbix/.bash_profile
$ zs_start
$ za_start

 

 

※ 추후, Agent 설치가이드 기재(일정미정)

 

#- References

[wiki_ko]zabbix

[wiki_en]zabbix

[mariadb]downloads

[mariadb]mysql_install_db_options

[mariadb]configuring-mariadb-with-option-files

[zabbix]download_sources

[zabbix]requirements_installation_libraries

[zabbix]manual_install

[zabbix]db_scripts

[zabbix]integrations_nginx

[zabbix]running-zabbix-web-ui-with-nginx-and-php-fpm

[sysadminwork]Configuring_Zabbix4-0_Frontend

[caingwiz_tistory]nginx