Zabbix - mở rộng ranh giới vĩ mô

Khi đưa ra giải pháp cho khách hàng, có 2 nhiệm vụ nảy sinh mà tôi muốn giải quyết một cách đẹp mắt và với chức năng Zabbix thông thường.

Nhiệm vụ 1 Theo dõi phiên bản phần sụn hiện tại trên bộ định tuyến Mikrotik.

Nhiệm vụ được giải quyết dễ dàng - bằng cách thêm tác nhân vào mẫu HTTP. Nhân viên nhận phiên bản hiện tại từ trang web Mikrotik và trình kích hoạt so sánh phiên bản hiện tại với phiên bản hiện tại và đưa ra cảnh báo trong trường hợp có sự khác biệt.

Khi bạn có 10 bộ định tuyến, thuật toán như vậy không quan trọng, nhưng phải làm gì với 3000 bộ định tuyến? Gửi 3000 yêu cầu đến máy chủ? Tất nhiên, một kế hoạch như vậy sẽ hiệu quả, nhưng ý tưởng về 3000 yêu cầu không phù hợp với tôi, tôi muốn tìm một giải pháp khác. Ngoài ra, vẫn còn một nhược điểm trong thuật toán như vậy: phía bên kia có thể đếm số lượng yêu cầu như vậy từ một IP cho một cuộc tấn công DoS, họ có thể chỉ cần cấm nó.

Nhiệm vụ 2 Sử dụng phiên ủy quyền trong các tác nhân HTTP khác nhau.

Khi một tác nhân cần nhận thông tin từ các trang "đã đóng" qua HTTP, thì cần có cookie ủy quyền. Để làm điều này, thường có một biểu mẫu ủy quyền tiêu chuẩn với cặp "đăng nhập / mật khẩu" và đặt ID phiên trong cookie.

Nhưng có một vấn đề là không thể truy cập dữ liệu của một mục khác từ một mục tác nhân HTTP để thay thế giá trị này trong Tiêu đề.

Ngoài ra còn có một "Tập lệnh web", nó có một hạn chế khác, nó không cho phép bạn lấy nội dung để phân tích và lưu thêm. Bạn chỉ có thể kiểm tra sự hiện diện của các biến cần thiết trên các trang hoặc chuyển các biến đã nhận trước đó giữa các bước tập lệnh web.

Sau khi suy nghĩ một chút về những nhiệm vụ này, tôi quyết định sử dụng macro hiển thị hoàn hảo trong bất kỳ phần nào của hệ thống giám sát: trong mẫu, máy chủ, trình kích hoạt hoặc mục. Và bạn có thể cập nhật macro thông qua API giao diện web.

Zabbix có tài liệu API tốt và chi tiết. Để trao đổi dữ liệu qua api, định dạng dữ liệu Json được sử dụng. Chi tiết có thể được tìm thấy trong tài liệu chính thức.

Trình tự các hành động để lấy dữ liệu chúng tôi cần và ghi chúng vào macro được hiển thị trong sơ đồ bên dưới.

Zabbix - mở rộng ranh giới vĩ mô

Bước 1

Bước đầu tiên có thể bao gồm một hành động hoặc nhiều hành động. Tất cả logic chính được đặt trong các bước đầu tiên và 3 bước cuối cùng là những bước chính.

Trong ví dụ của tôi, bước đầu tiên là lấy cookie ủy quyền trên PBX cho tác vụ đầu tiên. Đối với nhiệm vụ thứ hai, tôi đã nhận được số phiên bản hiện tại của phần sụn Mikrotik.

URL của các phiên bản phần mềm điều khiển Mikrotik hiện tại

Các địa chỉ này được chính thiết bị Mikrotik truy cập khi nhận được phiên bản chương trình cơ sở mới nhất hiện có.

Bước đầu tiên là hoàn toàn riêng cho từng trường hợp và logic công việc của nó có thể khác nhau. Tất cả phụ thuộc vào nhiệm vụ của bạn.

Khi làm việc với tập lệnh web, hãy theo dõi xem bạn cần phương thức phản hồi nào. Đề mục Phản hồi HTTP hoặc tự тело phản hồi không có tiêu đề?
Nếu cần có cookie ủy quyền, thì hãy đặt phương thức phản hồi Đề mục như trong trường hợp của Asterisk.

Nếu bạn cần dữ liệu, như trong trường hợp phản hồi của máy chủ mikrotik, hãy đặt thân thể phản hồi không có tiêu đề.

Bước 2

Hãy chuyển sang bước thứ hai. Nhận phiên ủy quyền:

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 là phiên bản của giao thức JSON-RPC đang được sử dụng;
Zabbix triển khai JSON-RPC phiên bản 2.0;

  • phương thức - phương thức được gọi;
  • params - tham số được truyền bởi phương thức;
  • id là một định danh yêu cầu tùy ý;
  • auth - khóa xác thực người dùng; vì chúng tôi chưa có nó, hãy đặt nó thành null.

Để làm việc với API, tôi đã tạo một tài khoản riêng với các quyền hạn chế. Đầu tiên, bạn không cần cấp quyền truy cập vào nơi bạn không cần. Và thứ hai, trước phiên bản 5.0, mật khẩu được đặt thông qua macro có thể được đọc. Theo đó, nếu bạn sử dụng mật khẩu quản trị Zabbix thì tài khoản quản trị rất dễ bị đánh cắp.

Điều này sẽ đặc biệt đúng khi làm việc với API thông qua tập lệnh của bên thứ ba và lưu trữ thông tin đăng nhập ở bên cạnh.

Kể từ phiên bản 5.0, có một tùy chọn để ẩn mật khẩu được lưu trong macro.

Zabbix - mở rộng ranh giới vĩ mô

Khi tạo một tài khoản riêng để cập nhật dữ liệu qua API, hãy đảm bảo kiểm tra xem dữ liệu bạn cần có sẵn qua giao diện web hay không và liệu có thể cập nhật dữ liệu đó hay không. Tôi đã không kiểm tra và sau đó trong một thời gian dài, tôi không hiểu tại sao macro mà tôi cần lại không hiển thị trong API.

Zabbix - mở rộng ranh giới vĩ mô

Sau khi chúng tôi nhận được ủy quyền trong API, chúng tôi sẽ tiến hành lấy danh sách các macro.

Bước 3

API không cho phép bạn cập nhật macro máy chủ theo tên, trước tiên bạn phải lấy ID macro. Ngoài ra, để có danh sách macro cho một máy chủ cụ thể, bạn cần biết ID của máy chủ này và đây là một yêu cầu bổ sung. Sử dụng macro mặc định {MÃ MÁY CHỦ} trong yêu cầu không được phép. Tôi quyết định bỏ qua hạn chế như thế này:

Zabbix - mở rộng ranh giới vĩ mô

Tôi đã tạo một macro cục bộ với ID của máy chủ này. Tìm ra ID máy chủ rất dễ dàng từ giao diện web.

Phản hồi có danh sách tất cả macro trên một máy chủ nhất định có thể được lọc theo mẫu:

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

Zabbix - mở rộng ranh giới vĩ mô

Do đó, chúng tôi nhận được ID của macro mà chúng tôi cần, ở đâu MIKROTIK_VERSION là tên của macro chúng tôi đang tìm kiếm. Trong trường hợp của tôi, macro được tìm kiếm MIKROTIK_VERSIONCái đã được gán cho máy chủ lưu trữ.

Bản thân yêu cầu trông như thế này:

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
}

Biến {sid} thu được ở bước thứ hai và sẽ được sử dụng liên tục khi bạn cần làm việc với giao diện API.

4 BƯỚC cuối cùng - cập nhật macro

Bây giờ chúng tôi biết ID macro cần được cập nhật, cookie ủy quyền hoặc phiên bản phần sụn của bộ định tuyến. Bạn có thể tự cập nhật macro.

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_version} là giá trị thu được trong bước đầu tiên. Trong ví dụ của tôi, phiên bản phần sụn mikrotik hiện tại
{hostmacroid} - giá trị thu được ở bước thứ ba - id của macro mà chúng tôi đang cập nhật.

Những phát hiện

Cách tiếp cận để giải quyết vấn đề với chức năng tiêu chuẩn phức tạp hơn và lâu hơn nhiều. Đặc biệt nếu bạn biết lập trình và có thể nhanh chóng thêm logic cần thiết vào tập lệnh.

Ưu điểm rõ ràng của phương pháp này là "tính di động" của giải pháp giữa các máy chủ khác nhau.

Đối với cá nhân tôi, thật kỳ lạ khi tác nhân HTTP không thể truy cập dữ liệu của một mục khác và thay thế chúng trong phần thân hoặc tiêu đề yêu cầu [ ZBXNEXT-5993].

Mẫu đã hoàn thành có thể tải xuống trên GitHub.

Nguồn: www.habr.com

Thêm một lời nhận xét