Thursday, November 21, 2024

[Zabbix] Hướng dẫn sử dụng tính năng Userparameter trong Zabbix

-

Tính năng Userparameter trong Zabbix là một tính năng mình đánh giá rất hay mà ai sử dụng Zabbix cũng nên biết. Nó giúp mình có thể biến các dòng code thành 1 template để giám sát được hệ thống. Nói nhiều không bằng thực hành. Bài viết này mình sẽ hướng dẫn các bạn cách thực hiện điều đó nhé.

Yêu cầu để thực hiện được tính năng này thì các bạn phải biết 1 chút về lập trình nhé, python, bash shell,… hay gì gì cũng được, chỉ cần biết cơ bản thôi.

Phần tiếp theo mình sẽ hướng dẫn các bạn dùng bash shell để viết 1 template cho zabbix monitor trạng thái của service trong hệ điều hành linux. Chúng ta đi lần lượt từng bước như sau:

1. Phân tích tình huống.

Như mọi người biết, muốn xem trạng thái của 1 service nào đó chúng ta thường sử dụng lệnh systemctl status <service name>, ví dụ mình kiểm tra trạng thái của ufw hệ thống sẽ trả về kết quả như dưới.

root@zabbix-server:~# systemctl status ufw
● ufw.service - Uncomplicated firewall
   Loaded: loaded (/lib/systemd/system/ufw.service; disabled; vendor preset: enabled)
   Active: active (exited) since Tue 2022-09-20 13:42:53 UTC; 2s ago
     Docs: man:ufw(8)
  Process: 18244 ExecStart=/lib/ufw/ufw-init start quiet (code=exited, status=0/SUCCESS)
 Main PID: 18244 (code=exited, status=0/SUCCESS)

Sep 20 13:42:53 zabbix-server systemd[1]: Starting Uncomplicated firewall...
Sep 20 13:42:53 zabbix-server systemd[1]: Started Uncomplicated firewall.

Nhìn vào kết quả trên ta biết server ufw có trạng thái là active (tức là đang hoạt động) để ý dòng có nội dung dưới có chữ Active: active (với Active là key và active là value), bỏ qua chuỗi phía sau chữ active vì nó chẳng có ý nghĩa gì trong tình huống này.

Active: active (exited) since Tue 2022-09-20 13:42:53 UTC; 2s ago

Vậy ta thử stop ufw xem kết quả trả về là gì nhé.

root@zabbix-server:~# systemctl stop ufw
root@zabbix-server:~# systemctl status ufw
● ufw.service - Uncomplicated firewall
   Loaded: loaded (/lib/systemd/system/ufw.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:ufw(8)

Sep 20 13:15:09 zabbix-server systemd[1]: Stopping Uncomplicated firewall...
Sep 20 13:15:09 zabbix-server ufw-init[17841]: Skip stopping firewall: ufw (not enabled)

Sau 2 lần thử mở và tắt ufw và nhìn kết quả trả về rõ ràng chỉ có sự thay đổi ở dòng có chữ Active đầu như dưới:

Active: active (exited) since Tue 2022-09-20 13:42:53 UTC; 2s ago -> khi start ufw
Active: inactive (dead) -> khi stop ufw

Bỏ phần rườm ra phía sau chúng ta sẽ căn cứ vào Active: <trạng thái> với trạng thái là active (bật) và inactive (tắt) để nhận diện 1 service đang tắt hay mở.

2. Làm ngắn gọn kết quả.

Để rút gọn được kết quả, chúng ta có thể lọc bằng nhiều cách, cách dưới đây mình sử dụng grep có sẵn trong linux.

root@zabbix-server:~# systemctl status ufw | grep 'Active: '
   Active: inactive (dead)

Kết quả trả về đã ngắn hơn rồi, bây giờ mình chỉ muốn lấy chữ inactive mà thôi, mình sử dụng awk có sẵn trong linux như sau

root@zabbix-server:~# systemctl status ufw | grep ‘Active: ‘ | awk ‘{print $2}’
inactive

Kết quả trả về là inactive, nếu mình mở lại ufw thì kết quả sẽ là active. Vậy là xong, đó là cái mình cần lấy để xác định status của 1 dịch vụ (active/inactive).

3. Cách viết script.

#!/bin/bash
result=$(systemctl status $1 | grep 'Active: ' | awk '{print $2}')
if [[ $result == 'active' ]];then
     echo 1
else
     echo 0
fi

Ở script trên mình sử dụng if else của bash shell để chuyển đổi giá trị từ chữ sang số với active sẽ trả về giá trị là 1, ngược lại inactive sẽ trả về giá trị là 0.

Mình sẽ tạo file này với tên file là svc-status trong thư mục /usr/local/bin và phân quyền thực thi cho nó.

chmod +x /usr/local/bin/svc-status

Và bây giờ mình chạy thử với cú pháp <tên file> <tên service> nó cho kết quả như dưới, với ufw kết quả là 0 (dịch vụ đang tắt), mariadb kết quả là 1 (dịch vụ đang mở).

root@zabbix-server:/usr/local/bin# ll
total 12
drwxr-xr-x  2 root root 4096 Sep 20 14:04 ./
drwxr-xr-x 10 root root 4096 Apr 26  2018 ../
-rwxr-xr-x  1 root root  145 Sep 20 14:01 svc-status*
root@zabbix-server:/usr/local/bin# svc-status ufw
0
root@zabbix-server:/usr/local/bin# svc-status mariadb
1
root@zabbix-server:/usr/local/bin#

Vậy là xong phần viết script.

4. Đưa script vào Zabbix monitor.

Chúng ta mở file /etc/zabbix/zabbix_agentd.conf tìm đến đoạn include xem Zabbix agent đang trỏ file .*conf tới thư mục nào, như kết quả dưới thì đang được trỏ tới thư mục etc/zabbix/zabbix_agentd.d/*.conf, chúng ta có thể thay đổi thư mục này nếu muốn nhé. Ở phần này mình sẽ giữ nguyên thư mục mặc định này.

### Option: Include
#       You may include individual files or all files in a directory in the configuration file.
#       Installing Zabbix will create include directory in /usr/local/etc, unless modified during the compile time.
#
# Mandatory: no
# Default:
# Include=

Include=/etc/zabbix/zabbix_agentd.d/*.conf

# Include=/usr/local/etc/zabbix_agentd.userparams.conf
# Include=/usr/local/etc/zabbix_agentd.conf.d/
# Include=/usr/local/etc/zabbix_agentd.conf.d/*.conf

Tạo 1 file /etc/zabbix/zabbix_agentd.d/svc-status.conf có nội dung như sau:

UserParameter=<tên userparameter>[*],<tên file tại /usr/local/bin/svc-status> <các đối số nếu có>

Ví dụ:

UserParameter=svc.status[*],svc-status $1

svc.status: tên userparameter

svc-status: tên file tại /usr/local/bin/svc-status

[*]: Nếu có đối số thì truyền thêm trường này vào

$1: đối số (đối số chính là các service name mình cần truyền vào)

Khởi động lại Zabbix agent

systemctl restart zabbix-agent

Đăng nhập vào Zabbix web interface và vào mục items của Zabbix Server (ở đây mình test trên server luôn, nếu các bạn muốn monitor các server khác thì làm tương tự nhé).

Vào Create Item

Lần lượt điền các thông tin như sau:

  1. Tên tùy chọn đặt cho item
  2. Chọn loại cần monitor là zabbix agent
  3. Tên của userparameter đã khai báo trong file /etc/zabbix/zabbix_agentd.d/svc-status.conf
  4. Chọn host cần monitor, ở đây mình monitor luôn zabbix server
  5. Chọn thời gian mà item sẽ check
  6. Bấm vào test để verify kết quả trước khi add hoặc nếu bạn đã chắc chắn item mình hoạt động rồi thì bấm add luôn. Bảng verify kết quả được thể hiện dưới đây.

Kết quả cho thấy ufw trả về giá trị 0 tức là dịch vụ ufw đang tắt

Vì script của mình dùng đối số để truyền tên service nên đối với các service khác các bạn chỉ cần truyền đối số vào là có thể monitor được rồi, ví dụ mình áp dụng cho 1 dịch vụ khác là ntp.

Các bạn thấy đó, chỉ 1 script mình có thể monitor nhiều service khác nhau chỉ cần truyền đối số là tên service vào là được.

Mình đã có 2 item monitor 2 service như trên.

Thử kiểm tra last value nhé

Các bạn vào kiểm tra last value của 2 item sẽ cho kết quả ufw trạng thái là 0, và ntp là 1. Bây giờ chúng ta đặt trigger cho chúng và kiểm tra kết quả.

Để cài đặt trigger các bạn vào theo thứ tự như trên.

Bấm vào Create Trigger

  1. Đặt tên cho cảnh báo
  2. Chọn mức độ nghiêm trọng của cảnh báo
  3. Bấm add để tiếp tục

Sau khi bấm add sẽ có 1 list các item hiện hữu sẽ xuất hiện, bạn chọn đúng item mình cần đặt trigger, ở đây mình đang ví dụ cho item check trạng thái ntp

Sau khi chọn xong item cần đặt trigger thì ta được kết quả như mục 1, ở mục 2 ta đặt result bằng 0 tức là nếu item này cho kết quả bằng 0 thì sẽ cảnh báo. Bấm insert để hoàn tất.

Ở hình dưới, tại mục 1 sau khi bấm insert ở bước trên sẽ xuất hiện 1 đoạn mã như vậy

Tiến hành copy đoạn mã ở mục 1 và paste xuống mục 2, sửa giá trị cuối 0 thành 1. Đoạn này có ý nghĩa là nếu kết quả là 0 ở mực 1 sẽ gửi cảnh báo và nếu bằng 1 ở mục 2 thì cảnh báo sẽ bị tắt.

Khi thiết lập hoàn tất, bấm add để thêm trigger này.

Mình tiến hành thêm 1 trigger nữa cho dịch vụ ufw luôn nên mình sẽ có 2 trigger tự thêm như dưới.

Vào dashboard chúng ta thấy có 1 cảnh báo dịch vụ ufw bị dừng, còn dịch vụ ntp không xuất hiện lý do là nó đang được bật và kết quả last value trả về 1 nên nó không hiện cảnh báo.

Bây giờ mình vào server tiến hành tắt dịch vụ ntp và xem kết quả nhé.

root@zabbix-server:~# systemctl stop ntp
root@zabbix-server:~# systemctl status ntp
● ntp.service - Network Time Service
   Loaded: loaded (/lib/systemd/system/ntp.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Tue 2022-09-20 15:14:39 UTC; 3s ago
     Docs: man:ntpd(8)
 Main PID: 20748 (code=exited, status=0/SUCCESS)

Sep 20 15:14:39 zabbix-server systemd[1]: Stopping Network Time Service...
Sep 20 15:14:39 zabbix-server ntpd[20748]: ntpd exiting on signal 15 (Terminated)

Dịch vụ NTP đã được tắt và kết quả như hình dưới.

Trên đây mình đã giới thiệu cho các bạn cách viết 1 script để monitor hệ thống, đây là 1 ví dụ rất cơ bản, sau này mình sẽ trình bày các ví dụ phức tạp hơn và hay ho hơn nhưng với điều kiện các bạn phải hiểu bài này nhé.

Bài viết hơi dài vì mình giải thích khá kỹ, các bạn cố gắng đọc để theo tiếp các phần sau.

Chúc các bạn may mắn.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories