กลุ่มชุมชนแลกเปลี่ยนความรู้แบ่งปั่น และช่วยเหลือ ต่อการใช้งาน OpenSource Zabbix เพราะการแบ่งปัน นั้นยิ่งใหญ่กว่า.

แสดงบทความที่มีป้ายกำกับ database แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ database แสดงบทความทั้งหมด

TimescaleDB + PostgreSQL + Zabbix Installation on CentOS7 - ความท้าทายด้านประสิทธิภาพที่มากับการเก็บข้อมูลขนาดใหญ่

การติดตั้ง TimescaleDB + PostgreSQL + Zabbix บน CentOS7 - ความท้าทายด้านประสิทธิภาพที่มากับการเก็บข้อมูลขนาดใหญ่
(TimescaleDB + PostgreSQL + Zabbix Installation on CentOS7 - Performance-related challenge with big history and trend data.)

   ได้ยินข่าวมาซักพักแล้ว สำหรับ TimescaleDB (TSDB) ที่นำมาใช้งานกับ Zabbix โดยที่ TimescaleDB คือ เป็นส่วนเสริมของ PostgreSQL (PG) ที่มีการทำงานซึ่งเพิ่มประสิทธิภาพตามอนุกรมเวลาและการเพิ่มประสิทธิภาพการจัดการข้อมูลให้กับ PostgreSQL หรือ อีกนัยนึงก็คือมีการออกแบบมาพิเศษเพื่อให้มีประสิทธิภาพการทำงานสูงสุดสำหรับข้อมูลที่มีเวลามาเกี่ยวข้อง
   (Heard the news for a while for TimescaleDB that is used with Zabbix. TimescaleDB (TSDB) is a PostgreSQL (PG)  extension, which adds time series based performance and data management optimizations to a regular PostgreSQL database. In other words, it is specially designed to provide maximum performance for time series data.)

   ซึ่งใน Zabbix นั้น ตารางในฐานข้อมูลที่เกี่ยวข้องอย่างยิ่งยวดที่เกี่ยวข้องกับเวลาคือ history, history_uint, history_str, history_log, history_text, trends and trends_uint
   (The Zabbix's database tables that related with time series data are history, history_uint, history_str, history_log, history_text, trends and trends_uint.)

   โดย TSDB นั้นจะคล้ายคลึงกับ Table Partitioning (แต่ไม่ได้เหมือนกันทั้งหมด) สำหรับ TSDB จะมีการแบ่งข้อมูลในตารางซึ่งข้อมูลที่แบ่งดังกล่าวจะเรียกว่า chunks ตามที่ได้กำหนดเวลาไว้ว่าในแต่ละอันนั้นคือเวลาช่วงละเท่าใด ซึ่งการแบ่งดังกล่าวจะดำเนินการโดยฐานข้อมูลโดยอัตโนมัติตามช่าวงเวลาที่ได้กำหนดไว้
   (In TSDB is similar to Table Partitioning (but quit difference). TSDB splits this table into so-called chunks in accordance with conditions you specify. This think of chunks as of automatically managed table partitions. Every chunk has an associated time range.)

   ในการทำ Partitioning นั้น โดยทั่วไปใน Zabbix จะมีโพรเซสที่ดำเนินการคือ Housekeeper ทำจะมี batch กำเนินการทำ partitioning ของข้อมูล เพื่อแยกข้อมูลตามช่วงเวลาที่ได้กำหนดไว้ ซึ่งในช่วงเวลาที่ housekeeper ทำการ partitioning นั้น เมื่อมีการ insert/update/delete ในช่วงเวลาดังกล่าวโดย database syncer ก็อาจเกิดการ lock ตามการทำงานของ database อีกทั้งถ้าข้อมูลมีขนาดใหญ่ ก็ยิ่งทำให้การทำงานดังกล่าวยิ่งช้าลง
   (In partitioning process, the Zabbix has batch process named "Housekeeper" that partitioning the table by time condition. Then when the database transaction such as insert/update/delete to perform operation via database synced, it may cause of database lock. In case of big table data, it have more longer process time.)

   ข้อได้เปรียบของการใช้งาน TSDB ที่สำคัญหนึ่งในหลายๆ ข้อ คือ จะช่วยเพิ่มประสิทธิภาพของ history syncer และ housekeeper
   (The one of manybenefit of TSDB is it brings considerable performance improvements for Zabbix history syncer and housekeeper.)


ขั้นตอนการติดตั้ง Zabbix 4.2 + PostgreSQL 11 + TimescaleDB 1.3 บน CentOS 7 (แถมการติดตั้ง PHP 7.2)
(Step for install Zabbix 4.2 + PostgreSQL 11 + TimescaleDB 1.3 on CentOS 7 plus PHP 7.2)

1. Install required yum related package.
   # yum install yum-utils


2. Preparing for PHP 7.2 installation (The PHP 7.2 will be installing with Zabbix frontend installation step.)
   # yum install epel-release
   # yum-config-manager --enable remi-php72

------ PostgreSQL and TimescaleDB Section ------
3. Preparing for PostgreSQL and TimescaleDB installation
   # yum install -y https://download.postgresql.org/pub/repos/yum/11/redhat/rhel-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
 
   - Add following line into file named /etc/yum.repos.d/CentOS-Base.repo, [base] and [updates] sections
      exclude=postgresql*

   - Add TimescaleDB's third party repository and install TimescaleDB, which will download any dependencies it needs from the PostgreSQL repo
   # cat > /etc/yum.repos.d/timescale_timescaledb.repo <<EOL
[timescale_timescaledb]
name=timescale_timescaledb
baseurl=https://packagecloud.io/timescale/timescaledb/el/7/\$basearch
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://packagecloud.io/timescale/timescaledb/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
EOL

   # yum update


4. Installing PostgreSQL + TimescaleDB
   # yum install timescaledb-postgresql-11


5. Setting PG data directory to other location (other disk/partition for increasing performance and reliability management) e.g. target directory named is /data/pgsql

   - Create target directory
   # mkdir -p /data/pgsql
   # chown -R postgres:postgres /data/pgsql

   - Setting target directory in daemon
   # systemctl edit postgresql-10.service
      [Service]
      Environment=PGDATA=/data/pgsql/11/data

   - Crosscheck this file will be created
   # cat /etc/systemd/system/postgresql-11.service.d/override.conf
      [Service]
      Environment=PGDATA=/data/pgsql/11/data

   - Reload this setting
   # systemctl daemon-reload


6. Initial PostgreSQL database
    # /usr/pgsql-11/bin/postgresql-11-setup initdb
      Initializing database ... OK


7. Tuning databs
   # timescaledb-tune --pg-config=/usr/pgsql-11/bin/pg_config --conf-path=/data/pgsql/11/data/postgresql.conf
   Using postgresql.conf at this path:
      /data/pgsql/11/data/postgresql.conf

   --> Answer yes for all questions.


8. Enable and Start PostgreSQL database
   # systemctl enable postgresql-11
   # systemctl start postgresql-11
   # systemctl status postgresql-11


------ Zabbix Section ------
9. Preparing for Zabbix installation
   # rpm -ivh https://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4.2-1.el7.noarch.rpm
   # yum-config-manager --enable rhel-7-server-optional-rpms
   # yum update


10. Installing Zabbix server
   # yum install zabbix-server-pgsql


11. Installing Zabbix frontend (PHP 7.2 will be installing with this step)
   # yum install zabbix-web-pgsql


12. Database preparation
   - Create PG database user name zabbixdbusr
   # sudo -u postgres createuser --pwprompt zabbixdbusr

   - Create database in PG named zabbix
   # sudo -u postgres createdb -O zabbixdbusr -E Unicode -T template0 zabbix

   - Import schema to database
   # zcat /usr/share/doc/zabbix-server-pgsql*/create.sql.gz | sudo -u zabbixdbusr psql zabbix

   - Enable TimescaleDB extension for zabbix database
   # echo "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;" | sudo -u postgres psql zabbix

   - Create TimescaleDB related table (Hypertable)
   # zcat /usr/share/doc/zabbix-server-pgsql*/timescaledb.sql.gz | sudo -u zabbixdbusr psql zabbix


13. Setting database credentials to related configuration
   # vi /etc/zabbix/zabbix_server.conf
      DBHost=127.0.0.1
      DBName=zabbix
      DBUser=zabbixdbusr
      DBPassword=<password>


14. Setting PG authentication
   # vi /data/pgsql/11/data/pg_hba.conf
      host zabbix zabbixdbusr 127.0.0.1/32 password


15. Restarting PostgreSQL for reloading above configuration
   # systemctl stop postgresql-11
   # systemctl start postgresql-11
   # systemctl status postgresql-11


16. Enable and Start Zabbix server
   # systemctl enable zabbix-server
   # systemctl start zabbix-server
   # systemctl status zabbix-server


17. Setting PHP configuration that requires Zabbix
   # vi /etc/php.ini
   max_execution_time 300
   memory_limit 128M
   post_max_size 16M
   upload_max_filesize 2M
   max_input_time 300
   max_input_vars 10000
   #always_populate_raw_post_data -1
   date.timezone Asia/Bangkok


18. Enable and Start HTPD web server
   # systemctl enable httpd
   # systemctl start httpd
   #systemctl status httpd


19. Goto URL http://YOURZABBIXIP/zabbix for completing frontend installation and following installed step.
   Database type: PostgreSQL
   Database host: 127.0.0.1
   Database port: 5432
   Database name: zabbix
   User: zabbixdbusr
   Password: <password>


*** Please considering SELinux ***

Reference:
[1] https://blog.zabbix.com/zabbix-time-series-data-and-timescaledb/6642/
[2] https://www.zabbix.com/documentation/4.2/manual/installation
[3] https://docs.timescale.com/v1.3/getting-started/installation/rhel-centos/installation-yum

Share:

การตรวจสอบการทำงานผ่านพอร์ทให้บริการของเซอร์วิสโดยไม่ต้องใช้ Zabbix Agent (Monitoring everything service ports with agent less)

   ในการตรวจสอบการทำงาน (Monitoring) บนระบบ Production ในหลายๆ ครั้งนั้น สิ่งที่ผู้ดูแลระบบมักจะกลัว และไม่ค่อยมักจะอยากให้ทำบนระบบคือ การติดตั้งโปรแกรมใดๆ ลงบนเครื่องนั้น โดยเฉพาะกับเครื่องที่มีการทำงานโหลดสูงๆ (High utilization) มีการทำงานที่สำคัญ (Critical function) รวมไปถึงขอปิดระบบยากๆ  (Less down time)

   ดังนั้นทางเลือกหนึ่งที่จะสามารถทำการตรวจสอบการทำงานเกี่ยวกับการให้บริการแต่ละเซอร์วิสผ่านทางพอร์ท (Port) ได้ คือการ connect เข้าไปผ่านช่องทางของพอร์ทการทำงานในเซอร์วิสเหล่านั้น

   ข้อดี:

  1. ไม่ต้องติดตั้งโปรแกรมใดๆ ลงบนเครื่องนั้นๆ ใช้ช่องทางปกติที่เซอร์วิสนั้นเปิดให้บริการอยู่แล้ว
  2. สามารถทำงานได้เกือบเทียบเท่า Agent โดยสามารถทำได้เท่าที่พอร์ทนั้นให้บริการ
  3. เวลาระบบมีปัญหา เราจะไม่เป็น แพะ!!!
   ข้อเสีย:
  1. อาจจะทำงานได้ไม่เทียบเท่ากับการติดตั้ง Agent ในบางกรณีที่รันบางคำสั่งไม่สามารถใช้งานผ่านพอร์ทนั้นได้
  2. ต้องเขียนโปรแกรมนึดนึง
  3. อาจจะมีการติดตั้งบาง Module บน Zabbix Server(Proxy) ในกรณีที่เป็นเซอร์วิสแปลกๆ

   สิ่งที่ต้องเตรียม
  • การกำหนด Zabbix Item, Macro และ External Script
  • การเขียนโปรแกรม (Python, Shell Script)

   ทำความรู้จักกับ Zabbix Item
      สำหรับ Item ใน Zabbix นั้น คือการสร้างการ monitor หนึ่งอย่าง เช่นต้องการสร้างการ monitor ระบบ MSSQL เราสามารถสร้าง Item ที่ Host ได้ดังนี้ (ปกติควรสร้าง Item ที่ Template แต่เพื่อความเข้าใจที่ง่าน และลดขั้นตอน จึงของแสดงตัวอย่างในการสร้าง Item ที่ Host)

Configuration -> Hosts -> Items -> Create item

โดยจะปรากฏหน้าจอ Create item  โดยใส่ข้อมูลดังนี้
  • Name: MSSQL_mon  => คือชื่อของ Item นี้
  • Type: External check  => คือการเลือกรูปแบบในการตรวจสอบ ในที่นี้เลือก External check เพื่อให้ Zabbix ใช้ script ที่เราจะสร้างขึ้นในขั้นตอนต่อไปมาใช้งาน
  • *Key: mssqlchk.py["{HOST.CONN}","{DBQUERY}","{DBUSER}","{DBPASS}","{DBNAME}"]  => คือการกำหนด script ที่จะใช้งานในการตรวจสอบ โดยมีพารามิเตอร์ภายใน [] ซึ่งพารามิเตอร์นั้นจะใช้การนำ Macro มาใช้งานเพื่อความสะดวกในการกำหนดค่าปรับแต่ง (Configuration)
    • รูปแบบของ script คือ scriptname[<parameter1>,<parameter2>,...]  => โดยที่ script อยู่ที่ /etc/zabbix/externalscripts ใน Zabbix Server/Proxy
    • *Macro คือสิ่งที่เปรียนเสมือนตัวแปรที่สามารถกำหนดได้ในระบบ Zabbix ซึ่งมี macro อยู่สามแบบคือ System (supported) macro, Function macro และ User macro (ดูรายละเอียดเพิ่มเติมที่ https://www.zabbix.com/documentation/4.0/manual/config/macros)
  • Host interface: IPADDR  => คือหมายเลขไอพีของเครื่องที่จะต้องการตรวจสอบการทำงาน
  • Type of information: Numeric (float)  => คือชนิดข้อมูลที่จะต้องการเก็บ กำหนดเป็น Numeric (float) คือทศนิยม ที่เป็นได้ทั้งค่าบวก และลบ (พิจารณาสิ่งที่ script ได้ return ผลมา ณ ที่นี้คือ เวลา response time  เป็นวินาที)
  • Units: s  => คือหน่วยของค่าที่ต้องการกำหนดของ Item นี้ เช่น ms คือ มิลลิวินาที
  • Update interval: 300s  => คือเวลาทุกๆ ที่ต้องการให้ตรวจสอบ Item นี้ เช่น 300s คือ 300 วินาที
  • History storage period: 90d  => คือระยะเวลาที่ให้ระบบเก็บค่าทุกๆ ครั้งที่มีการตรวจสอบ Item นี้ เช่น 90d คือ 90 วัน
  • Trend storage period: 365d  => คือระยะเวลาที่ให้ระบบเก็บค่าที่ถูกประมวลผลแล้วเช่น Min,Max,Avg
  • Show value: As is  =>  คือรูปแบบการเก็บค่า Item สำหรับ As is คือได้ค่ามายังไงก็เก็บค่านั้น



   ทำความรู้จักกับ Macro
      สำหรับ Macro ใน Zabbix นั้นคือตัวแปรที่สามารถเก็บค่าต่างๆ ได้ ซึ่ง macro นั้นมี 3 รุปแบบคือ
  1. System (supported) macro คือ macro ของระบบเช่น หมายเลขไอพีของ host นั้น
  2. Function macro คือการกำหนด macro ที่สามารถคำนวนค่าได้จาก function
  3. User marco คือ macro ที่สามารถกำหนดชื่อ และค่าได้จากผู้ใช้งาน ซึ่งจะมีระดับในการกำหนดค่า (Level) ดังต่อไปนี้
    • Host level macro (ใช้งานก่อน)
    • Macro ที่ถูกำหนดไว้ใน 1'st level templates ของ host (พิจารณาใช้งานตามลำดับ link template), จากนั้นเรียงการใช้งานตามหมายเลข ID ของ template
    • Macros ที่ถูกำหนดไว้ใน 2'nd level templates ของ host, เรียงการใช้งานตามหมายเลข ID ของ template
    • ที่ถูกำหนดไว้ใน 3'rd level templates ของ host, รียงการใช้งานตามหมายเลข ID ของ template
    • Global macros (ใช้งานลำดับสุดท้าย)
      ตัวอย่างการสร้าง Macro (ระดับ Host)

Configuration -> Hosts -> [SELECTED HOST] -> Macro

โดยจะปรากฏหน้าจอ Create item  โดยใส่ข้อมูลดังนี้

  • Macro: QUERY  => คือชื่อของ macro (ใส่ให้ตรงกับพารามิเตอร์)
  • Value: SELECT COUNT(ID) FROM Product  => คือค่าของ macro นั้น ยกตัวอย่างต้องการทดสอบการ query ฐานข้อมูล จึงทำการใส่ SQL เข้าไป

*** โดยปกติจะไม่มีการใส่รหัสผ่าน (Password) ใน macro เพราะจะทำให้เห็นรหัสผ่าน วิธีการที่แนะนำคือการทำ mapping ระหว่าง host และรหัสผ่านใน script แทน***



ทำความรู้จักกับ Zabbix External Script
    Zabbix External Script คือการเขียน script เพื่อเติมเพื่อให้สามารถทำการ monitor ได้ตามที่ต้องการอย่างไม่มีขอบเขต เนื่องจากเป็นการเขียนโปรแกรมเพื่อทำการ monitor ซึ่งสามารถเขียนได้ทั้งจาก Shell Script, ภาษา Python, ภาษา Perl และภาษาอื่นๆ ที่เครื่อง Zabbix สามารถ execute ได้
   ซึ่งความคิดเป็นส่วนตัว การใช้งาน external script นั้นมีแนวทางการใช้งานดังนี้

  1. ข้อมูล Input กำหนด (ได้มาจากการสั่งจาก Zabbix ที่มี macros)
  2. การดำเนินการใน Script (จะดูรายละเอียดในตัวอย่างโปรแกรม)
  3. ผลที่ได้จากการตรวจสอบ return value โดยมีตัวเลขในการส่งผลดังนี้
    • ถ้า Return Response time ที่ได้จากการทำงาน ตั่งแต่ 0 เป็นในทางบวก นั่นหมายถึงระบบทำงานได้ (ขึ้นอยู่ว่าจะทำงานได้เร็วหรือช้า)
    • ถ้า Return เป็น -1 จะหมายถึงระบบทำงานไม่ได้/มีปัญหา

   สำหรับโปรแกรม script นั้น โดยปกติจะอยู่ที่ไดเร็กทอรี /etc/zabbix/externalscripts ซึ่งจากตัวอย่างการกำหนดใน Item ในส่วนของ Key มีรายละเอียดดังนี้

mssqlchk.py["{HOST.CONN}","{DBQUERY}","{DBUSER}","{DBPASS}","{DBNAME}"]

   การ mapping parameters

    • {HOST.CONN} <--> sys.argv[1]
    • {DBQUERY} <--> sys.argv[2]
    • {DBUSER} <--> sys.argv[3]
    • {DBPASS} <--> sys.argv[4]
    • {DBNAME} <--> sys.argv[5]


  • สร้างไฟล์ script ชื่อ mssqlchk.py (**ต้องกำหนด permission ใน OS  ให้ผู้ใช้งานชื่อ zabbix สามารถ execute ไฟล์นี้ได้, chown zabbix mssqlchk.py; chmod 500 mssqlchk.py **

และในไฟล์ สามารถเขียนโปรแกรมให้ทำงานได้ดังนี้ (ตัวอย่างภาษา Python)

#!/usr/bin/python
import pymssql #import module pymssql เพื่อ connection ไปยังฐานข้อมูล
          import sys #import module sys เพื่อรับ parameter จาก command line
import time  #import module time เพื่อใช้จับเวลา
try: #ขึ้นตอนคำสั่ง except 
   start = int(round(time.time() * 1000)) #ดูเวลาเริ่ม script
   db = pymssql.connect(sys.argv[1], sys.argv[3], sys.argv[4], sys.argv[1]) #connection to database
   cursor = db.cursor()
   sql = sys.argv[2] #คำสั่ง SQL
   cursor.execute(sql) #ทำการ Query database
   results = cursor.fetchall()
   db.close()
   end = int(round(time.time() * 1000)) #ดูเวลาจบการรัน script
   time = end-start #ให้ time=end-start แล้วส่งเป็นค่า time เวลาหน่วยเป็น ms
   print int(time)
except pymssql.OperationalError: #ถ้าเกิด Error หรือรัน Script ไม่ผ่านให้ส่ง -1
   print int(-1)

   จากนั้นสามารถทดสอบค่าที่ได้จาก script โดยการตรวจสอบที่ Latest Data เมื่อการทำงานถูกต้องสามารถดำเนินการสร้าง Graph และ Trigger เพื่อใช้งานได้ต่อไป รวมไปถึงสามารถเขียนโปรแกรมดึงข้อมูลตัวเลขอื่นๆ ตามที่เซอร์วิสนั้นมีให้ดำเนินการได้


ตัวอย่าง script อื่นๆ
   Script สำหรับตรวจสอบ Website
#!/usr/bin/python
import sys  #import module sys เพื่อใช้รับข้อมูลจาก Parameter
import time  #import module time เพื่อใช้นับเวลา
import urllib2  #import module urllib2 ใช้ในการเรียกค่าจากหน้าเว็บ
try: #ขึ้นตอนคำสั่ง except
   s = int(round(time.time() * 1000))  #ดูเวลาเริ่ม script
   url = sys.argv[1] #รับค่าจาก parameter ที่1 เข้าตัวแปร url
   response = urllib2.urlopen(url) #เปิดหน้าเว็บ
   webContent = response.read() #อ่านค่าจะหน้าเว็บ
   e = int(round(time.time() * 1000)) #ดูเวลาจบการรัน script
   find = webContent.find(sys.argv[2]) #ค้นหา คำตาม Key ที่ใส่มาใน Parameter ที่ 2
   if  find < 0: #ถ้าคนหาได้ น้อยกว่า 0 คำ ให้ส่งเป็น -1
           t = -1
           print int(t)
   else: #นอกนั้นให้ t=e-s แล้วส่งเป็นค่า t เวลาหน่วยเป็น ms
           t = e-s
           print int(t)
except urllib2.URLError: #ถ้าเกิด Error หรือรัน Script ไม่ผ่านให้ส่ง -1
   print int(-1)


   Script สำหรับตรวจสอบ DNS
#!/usr/bin/python
import time  #import module time เพื่อใช้นับเวลา
import sys
import socket #import module socket ตรวจสอบ DNS
start = int(round(time.time()*1000)) #ดูเวลาเริ่ม script
name = sys.argv[1]  #ชื่อ DNS
try: #ขึ้นตอนคำสั่ง except
    host = socket.gethostbyname(name)  #ตรวจสอบชื่อ DNS ว่าเป็น IP อะไรถ้า DNS ทราบถือว่าใช้ได้
    end = int(round(time.time()*1000)) #ดูเวลาจบ script
    time = end-start #ให้ time=end-start แล้วส่งเป็นค่า time เวลาหน่วยเป็น ms
    print int(time)
except socket.gaierror, err: #ถ้าไม่สามารถถาม IP จาก DNS ได้จะเกิด socket.gaierror จะส่งค่าเป็น -1
    print int(-1)


   Script สำหรับตรวจสอบ Oracle
#!/usr/bin/python
import cx_Oracle #import module cx_Oracle เพื่อ connection ไปหา database
import sys
import time  #import module time เพื่อใช้นับเวลา
try: #ขึ้นตอนคำสั่ง except
   start = int(round(time.time() * 1000)) #ดูเวลาเริ่ม script
   connection = cx_Oracle.connect(sys.argv[1]) #connection string to database
   cursor = connection.cursor()
   sql = sys.argv[2] #คำสั่ง SQL
   cursor.execute(sql) #ทำการ Query database
   count = cursor.fetchall()
   connection.close()
   end = int(round(time.time() * 1000)) #ดูเวลาจบการรัน script
   time = end-start #ให้ time=end-start แล้วส่งเป็นค่า time เวลาหน่วยเป็น ms
   print int(time)
except pymssql.OperationalError: #ถ้าเกิด Error หรือรัน Script ไม่ผ่านให้ส่ง -1
   print int(-1)



   Script สำหรับตรวจสอบ LDAP
#!/usr/bin/perl
use Net::LDAP;
use Time::HiRes qw( gettimeofday tv_interval );
     
my $chkSuccess = 0;
my $ldapserver = "LDAPSERVERIP";
my $ldapversion = 2;
my $ldapuser = "cn=ldadm,o=test";
my $ldapbase = "uniqueId=lduser1,ou=local,deptName=it,o=users,o=TESTER";
my $ldappass = "pass123";
my $searchstring = "objectclass=*";
my @attribs = ('uniqueID');
sub LDAPsearch {
my ($ldap,$searchString,$attrs,$base) = @_;
my $result = $ldap->search ( base => "$base",
scope => "base",
filter => "$searchString",
attrs   =>  $attrs
);
}
my $t0 = [gettimeofday];
my $ldap = Net::LDAP->new ($ldapserver) or die ("-1\n");
$ldap->bind ($ldapuser, password => $ldappass, version => $ldapversion) or die ("-1\n");
my $search = LDAPsearch ($ldap, $searchstring, \@attribs, $ldapbase ) or die ("-1\n");
my @entries = $search->entries;
my ($uniqueID);

if (@entries) {
$uniqueID=$entries[0]->get_value('uniqueID');
if ($uniqueID=="lduser1") {
$chkSuccess = 1;
} else {
$chkSuccess = 0;
} } else {
$chkSuccess = 0;
}

$ldap->unbind;
my $elapsed = tv_interval ($t0, [gettimeofday]);
if($chkSuccess==1) {
        print $elapsed;
} else {
        print "-1";
}


Script สำหรับตรวจสอบ TACACS
#!/usr/bin/perl
use Net::TacacsPlus::Client;
use Net::TacacsPlus::Constants;
use Time::HiRes qw( gettimeofday tv_interval );
     
my $chkSuccess = 0;
my $tac = new Net::TacacsPlus::Client(
        host => 'TACACSSERVERIP',
        key => 'tacacskey');
     
my $t0 = [gettimeofday];
if ($tac->authenticate('tuser1', 'tuser1passwd', TAC_PLUS_AUTHEN_TYPE_PAP)){                

        #print "Authentication successful.\n";                                
        $chkSuccess = 1;
} else {                                                  
        #print "Authentication failed: ".$tac->errmsg()."\n";      
        $chkSuccess = 0;
}                                                        
my @args = ('service=junos-exec', 'local-user-name=staff');
my @args_response;
if($tac->authorize('tuser1', \@args, \@args_response))
{
        #print "Authorization successful.\n";
        #print "Arguments received from server:\n";
        #print join("\n", @args_response);
        $chkSuccess = 1;
} else {
        #print "Authorization failed: " . $tac->errmsg() . "\n";
        $chkSuccess = 0;
}
my $elapsed = tv_interval ($t0, [gettimeofday]);
if($chkSuccess==1) {
        print $elapsed;
} else {
        print "-1";
}


Script สำหรับตรวจสอบ Radius
#!/usr/bin/perl
use Authen::Radius;
use Time::HiRes qw( gettimeofday tv_interval );
     
my $chkSuccess = 0;
my $host = "RADUISSERVERIP";
my $port = 1812;
my $username = "ruser1";
my $password = "ruser1passwd";
my $secret = "secret";
my $nas = "192.168.99.100";
my $timeout = 5;
my $t0 = [gettimeofday];
$host = "$host:$port" if $port;
if (!(my $radius = Authen::Radius->new(Host => $host, Secret => $secret, TimeOut => $timeout))){
    my $err = "Could not connect to $host";
    $err .= ": " . Authen::Radius::strerror if (Authen::Radius::strerror);
    print $err, "\n";
    $status = &set_status(0);
}else{
    my $answer = $radius->check_pwd($username, $password, $nas);
$status = &set_status($answer);
print $status;
}
my $elapsed = tv_interval ($t0, [gettimeofday]);
if($chkSuccess==1) {
        print $elapsed;
} else {
        print "-1";
}
sub set_status {
    my $res = shift;
    my $status;
    if ($res) {
$status = "OK";
    }else {
$status = "CRITICAL";
    }
    print "$status\n";
    return($status);
}

Share:

การ Access mysql/mariadb Server ด้วย Zabbix agent ในขณะที่เปิด SELinux (CentOS)

เนื่องจากผมได้ศึกษาบทความของพี่ Krit
https://zabbix-in-thailand.blogspot.com/2018/11/zabbix-server-selinux-how-to-add-policy.html

ทำให้ใช้งาน Zabbix Server ในขณะที่เปิด SELinux ได้ แต่ยังติดปัญหาเรื่อง Agent ไม่สามารถ Access (Local Access)ไปยัง mysql/mariadb Server ได้  จึงต้องทำการ add policy selinux ดังนี้

1.Create file ชื่อ zabbix_mysql.te


module zabbix_mysql 1.0;
require {
        type unconfined_t;
        type mysqld_var_run_t;
        type mysqld_etc_t;
        type mysqld_t;
        type zabbix_var_lib_t;
        type zabbix_agent_t;
        class sock_file write;
        class unix_stream_socket connectto;
        class file { read relabelto open };
        class dir relabelto;
}

#============= unconfined_t ==============
allow unconfined_t zabbix_agent_t:dir relabelto;
allow unconfined_t zabbix_agent_t:file relabelto;

#============= zabbix_agent_t ==============
allow zabbix_agent_t mysqld_etc_t:file { read open };
#!!!! This avc can be allowed using the boolean 'daemons_enable_cluster_mode'
allow zabbix_agent_t mysqld_t:unix_stream_socket connectto;
allow zabbix_agent_t mysqld_var_run_t:sock_file write;
allow zabbix_agent_t zabbix_var_lib_t:file { read open };

2.Run Command ตามนี้


checkmodule -M -m -o zabbix_mysql.mod zabbix_mysql.te

semodule_package -o zabbix_mysql.pp -m zabbix_mysql.mod

semodule -i zabbix_mysql.pp

3.Restart zabbix_agent  ก็สามารถ Access mysql/mariadb ที่เครื่องตัวเองได้แล้วครับ ถ้า Add Template DB MySQL เอาไว้ก่อนแล้ว ก็จะเห็นว่าสมารถดูข้อมูลได้แล้วครับ




Reference: https://support.zabbix.com/browse/ZBX-10782
Share:
 
Zabbix in Thailand
Facebook Group · 701 members
Join Group
กลุ่มนี้จัดตั้งขึ้นเพื่อแลกเปลี่ยนความรู้ของ zabbix ใครมีคู่มือ เทคนิค หรือ ปัญหา มาร่วมมือกันแก้ไขกันสำหรับชาวไทย -----------------------------------...
 

Popular

ค้นหาบล็อกนี้

Labels

Album (2) CentOS (6) database (3) Grafana (2) Sercurity (2) ubuntu (2) VDO (6) Windows Server (1) Zabbix-Host (11) Zabbix-Notify (1) Zabbix-Server (14)

Comments

Labels

Recent Posts