Zabbix - ขยายขอบเขตมาโคร

เมื่อสร้างโซลูชันสำหรับลูกค้า มี 2 งานเกิดขึ้นที่ฉันต้องการแก้ไขอย่างสวยงามและมีฟังก์ชันการทำงานของ Zabbix ปกติ

ความท้าทาย 1 ติดตามเวอร์ชันเฟิร์มแวร์ปัจจุบันบนเราเตอร์ Mikrotik

แก้ไขงานได้อย่างง่ายดาย - โดยการเพิ่มตัวแทนในเทมเพลต HTTP ตัวแทนได้รับเวอร์ชันปัจจุบันจากเว็บไซต์ Mikrotik และทริกเกอร์จะเปรียบเทียบเวอร์ชันปัจจุบันกับเวอร์ชันปัจจุบันและแจ้งเตือนในกรณีที่เกิดความคลาดเคลื่อน

เมื่อคุณมีเราเตอร์ 10 ตัว อัลกอริทึมดังกล่าวไม่สำคัญ แต่จะทำอย่างไรกับเราเตอร์ 3000 ตัว ส่งคำขอ 3000 รายการไปยังเซิร์ฟเวอร์หรือไม่ แน่นอนว่าแผนดังกล่าวจะได้ผล แต่แนวคิดเรื่องคำขอ 3000 รายการไม่เหมาะกับฉัน ฉันต้องการหาทางออกอื่น นอกจากนี้ อัลกอริทึมดังกล่าวยังมีข้อเสีย: อีกด้านหนึ่งสามารถนับจำนวนคำขอดังกล่าวจาก IP หนึ่งสำหรับการโจมตี DoS พวกเขาสามารถแบนได้

ความท้าทาย 2 การใช้เซสชันการให้สิทธิ์ในตัวแทน HTTP ที่แตกต่างกัน

เมื่อตัวแทนต้องการรับข้อมูลจากหน้าที่ "ปิด" ผ่านทาง HTTP จำเป็นต้องใช้คุกกี้การให้สิทธิ์ ในการดำเนินการนี้ มักจะมีแบบฟอร์มการให้สิทธิ์มาตรฐานพร้อมคู่ "ล็อกอิน / รหัสผ่าน" และตั้งค่า ID เซสชันในคุกกี้

แต่มีปัญหาคือไม่สามารถเข้าถึงข้อมูลของรายการอื่นจากรายการตัวแทน HTTP หนึ่งเพื่อแทนที่ค่านี้ในส่วนหัว

นอกจากนี้ยังมี "สคริปต์เว็บ" ซึ่งมีข้อ จำกัด อีกประการหนึ่งคือไม่อนุญาตให้คุณรับเนื้อหาสำหรับการวิเคราะห์และบันทึกเพิ่มเติม คุณสามารถตรวจสอบการมีอยู่ของตัวแปรที่จำเป็นในหน้าหรือผ่านตัวแปรที่ได้รับก่อนหน้านี้ระหว่างขั้นตอนสคริปต์เว็บ

หลังจากคิดเล็กน้อยเกี่ยวกับงานเหล่านี้ ฉันตัดสินใจใช้มาโครที่มองเห็นได้อย่างสมบูรณ์ในส่วนใดๆ ของระบบการตรวจสอบ: ในเทมเพลต โฮสต์ ทริกเกอร์ หรือรายการ และคุณสามารถอัปเดตมาโครผ่านเว็บอินเทอร์เฟซ API

Zabbix มีเอกสาร API ที่ดีและมีรายละเอียด สำหรับการแลกเปลี่ยนข้อมูลผ่าน API จะใช้รูปแบบข้อมูล Json สามารถดูรายละเอียดได้ใน เอกสารราชการ.

ลำดับของการดำเนินการเพื่อรับข้อมูลที่เราต้องการและบันทึกไว้ในมาโครแสดงในแผนภาพด้านล่าง

Zabbix - ขยายขอบเขตมาโคร

ขั้นตอนที่ 1

ขั้นตอนแรกอาจประกอบด้วยการกระทำเดียวหรือหลายการกระทำ ตรรกะหลักทั้งหมดถูกวางไว้ในขั้นตอนแรก และ 3 ขั้นตอนสุดท้ายคือขั้นตอนหลัก

ในตัวอย่างของฉัน ขั้นตอนแรกคือการรับคุกกี้การอนุญาตบน PBX สำหรับงานแรก สำหรับงานที่สอง ฉันได้รับหมายเลขของเฟิร์มแวร์ Mikrotik เวอร์ชันปัจจุบัน

URL ของเฟิร์มแวร์ Mikrotik เวอร์ชันปัจจุบัน

ที่อยู่เหล่านี้เข้าถึงได้โดยอุปกรณ์ Mikrotik เองเมื่อได้รับเฟิร์มแวร์เวอร์ชันล่าสุดที่มี

ขั้นตอนแรกเป็นรายบุคคลสำหรับแต่ละกรณีและตรรกะของการทำงานอาจแตกต่างกัน ทุกอย่างขึ้นอยู่กับงานของคุณ

เมื่อทำงานกับการเขียนสคริปต์เว็บ ให้ติดตามว่าคุณต้องการวิธีตอบกลับแบบใด ชื่อเรื่อง การตอบสนอง HTTP หรือตัวเอง тело การตอบสนองโดยไม่มีส่วนหัว?
หากจำเป็นต้องใช้คุกกี้การอนุญาต ให้ตั้งค่าวิธีการตอบกลับ ชื่อเรื่อง เช่นเดียวกับในกรณีของเครื่องหมายดอกจัน

หากคุณต้องการข้อมูล เช่น ในกรณีของการตอบสนองของเซิร์ฟเวอร์ mikrotik ให้ใส่ ร่างกาย การตอบสนองโดยไม่มีส่วนหัว

ขั้นตอนที่ 2

ไปที่ขั้นตอนที่สองกันเถอะ รับเซสชันการให้สิทธิ์:

POST http://company.com/zabbix/api_jsonrpc.php HTTP/1.1
Content-Type: application/json-rpc

{
    "jsonrpc": "2.0",
    "method": "user.login",
    "params": {
        "user": "Admin"
        "password": "zabbix"
    },
    "id": 1,
    "auth": null
}

jsonrpc เป็นเวอร์ชันของโปรโตคอล JSON-RPC ที่กำลังใช้งานอยู่
Zabbix ใช้ JSON-RPC เวอร์ชัน 2.0;

  • วิธีการ - วิธีการที่เรียกว่า;
  • params - พารามิเตอร์ที่ส่งผ่านโดยเมธอด
  • id เป็นตัวระบุคำขอโดยพลการ
  • รับรองความถูกต้อง - คีย์การตรวจสอบผู้ใช้ เนื่องจากเรายังไม่มี ให้ตั้งค่าเป็นโมฆะ

ในการทำงานกับ API ฉันสร้างบัญชีแยกต่างหากโดยมีสิทธิ์จำกัด ประการแรก คุณไม่จำเป็นต้องให้สิทธิ์การเข้าถึงในที่ที่คุณไม่ต้องการ และประการที่สอง ก่อนเวอร์ชัน 5.0 สามารถอ่านรหัสผ่านที่ตั้งผ่านมาโครได้ ดังนั้น หากคุณใช้รหัสผ่านผู้ดูแลระบบ Zabbix บัญชีผู้ดูแลระบบจะง่ายต่อการขโมย

สิ่งนี้จะเป็นจริงโดยเฉพาะอย่างยิ่งเมื่อทำงานกับ API ผ่านสคริปต์ของบุคคลที่สามและจัดเก็บข้อมูลรับรองไว้ที่ด้านข้าง

ตั้งแต่เวอร์ชัน 5.0 มีตัวเลือกในการซ่อนรหัสผ่านที่บันทึกไว้ในมาโคร

Zabbix - ขยายขอบเขตมาโคร

เมื่อสร้างบัญชีแยกต่างหากสำหรับอัปเดตข้อมูลผ่าน API อย่าลืมตรวจสอบว่าข้อมูลที่คุณต้องการมีให้ใช้งานผ่านเว็บอินเทอร์เฟซหรือไม่ และอัปเดตได้หรือไม่ ฉันไม่ได้ตรวจสอบ และเป็นเวลานานแล้วที่ฉันไม่เข้าใจว่าทำไมมาโครที่ฉันต้องการจึงไม่ปรากฏใน API

Zabbix - ขยายขอบเขตมาโคร

หลังจากที่เราได้รับการอนุญาตใน API แล้ว เราจะดำเนินการรับรายการมาโคร

ขั้นตอนที่ 3

API ไม่อนุญาตให้คุณอัปเดตมาโครโฮสต์ตามชื่อ คุณต้องได้รับรหัสมาโครก่อน ยิ่งไปกว่านั้น ในการรับรายการมาโครสำหรับโฮสต์เฉพาะ คุณจำเป็นต้องทราบ ID ของโฮสต์นี้ และนี่คือคำขอเพิ่มเติม ใช้มาโครเริ่มต้น {รหัสโฮสต์} ในคำขอไม่ได้รับอนุญาต ฉันตัดสินใจที่จะข้ามข้อจำกัดดังนี้:

Zabbix - ขยายขอบเขตมาโคร

ฉันสร้างมาโครในเครื่องด้วย ID ของโฮสต์นี้ การค้นหา ID โฮสต์นั้นง่ายมากจากเว็บอินเตอร์เฟส

การตอบกลับพร้อมรายการมาโครทั้งหมดบนโฮสต์ที่กำหนดสามารถกรองได้ตามรูปแบบ:

regex:{"hostmacroid":"([0-9]+)"[A-z0-9,":]+"{$MIKROTIK_VERSION}"

Zabbix - ขยายขอบเขตมาโคร

ดังนั้นเราจึงได้รับ ID ของมาโครที่เราต้องการ MIKROTIK_VERSION คือชื่อของมาโครที่เรากำลังมองหา ในกรณีของฉัน มีการค้นหามาโคร MIKROTIK_VERSIONที่ถูกกำหนดให้กับโฮสต์

คำขอนั้นมีลักษณะดังนี้:

POST http://company.com/zabbix/api_jsonrpc.php HTTP/1.1
Content-Type: application/json-rpc

{
    "jsonrpc":"2.0",
    "method":"usermacro.get",
    "params":{
        "output":"extend",
        "hostids":"{$HOST_ID}"
    },
    "auth":"{sid}",
    "id":1
}

ตัวแปร {ไซด์} ได้รับในขั้นตอนที่สองและจะใช้อย่างต่อเนื่องซึ่งคุณต้องทำงานกับอินเทอร์เฟซ API

4 ขั้นตอนสุดท้าย - อัปเดตมาโคร

ตอนนี้เราทราบรหัสแมโครที่ต้องอัปเดต คุกกี้การให้สิทธิ์ หรือเวอร์ชันเฟิร์มแวร์ของเราเตอร์แล้ว คุณสามารถปรับปรุงแมโครได้เอง

POST http://company.com/zabbix/api_jsonrpc.php HTTP/1.1
Content-Type: application/json-rpc

{
    "jsonrpc":"2.0",
    "method":"usermacro.update",
    "params":{
        "hostmacroid":"{hostmacroid}",
        "value":"{mikrotik_version}"
    },
    "auth":"{sid}",
    "id":1
}

{ไมโครติก_เวอร์ชัน} เป็นค่าที่ได้ในขั้นตอนแรก ในตัวอย่างของฉัน เวอร์ชันของเฟิร์มแวร์ mikrotik ปัจจุบัน
{โฮสต์แมครอยด์} - ได้รับค่าในขั้นตอนที่สาม - รหัสของมาโครที่เรากำลังอัปเดต

ผลการวิจัย

วิธีการแก้ปัญหาด้วยฟังก์ชันมาตรฐานนั้นซับซ้อนและยาวกว่ามาก โดยเฉพาะอย่างยิ่งถ้าคุณรู้การเขียนโปรแกรมและสามารถเพิ่มตรรกะที่จำเป็นในสคริปต์ได้อย่างรวดเร็ว

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

สำหรับฉันเป็นการส่วนตัว เป็นเรื่องแปลกที่ตัวแทน HTTP ไม่สามารถเข้าถึงข้อมูลของรายการอื่นและแทนที่ในเนื้อหาคำขอหรือส่วนหัว [ ZBXNEXT-5993].

เทมเพลตสำเร็จรูปสามารถ ดาวน์โหลดบน GitHub.

ที่มา: will.com

เพิ่มความคิดเห็น