You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用AJAX POST在Nagios中实现服务停机时间调度

把Nagios服务停机时间调度的curl转成AJAX POST请求

嘿,我来帮你把那条curl命令转成AJAX POST请求!刚好我之前折腾过Nagios的外部命令接口,熟得很~

首先得明确:Nagios的GUI操作本质上就是给cmd.cgi这个接口发POST请求,所以我们只要把curl里的参数原封不动(或者补全必要参数)搬到AJAX里就行。

先补全你curl里缺失的关键参数

你的curl命令没写完,调度服务停机时间必须要这些参数(不然Nagios会报错):

  • start_time:停机开始时间(建议用Unix时间戳,避免时区坑)
  • end_time:停机结束时间
  • comment:停机备注
  • com_author:操作人用户名
  • com_authorized:设为1表示这是授权的停机(不会触发告警)

示例代码:jQuery AJAX(最常用)

假设你已经通过GUI登录了Nagios,会话Cookie还在有效期内:

$.ajax({
  url: '/nagios/cgi-bin/cmd.cgi', // 替换成你的Nagios cmd.cgi实际路径
  type: 'POST',
  data: {
    cmd_typ: 56,          // SCHEDULE_SVC_DOWNTIME 命令码
    cmd_mod: 2,           // MODIFIED_COMMAND 固定值
    host: 'jenkins',
    service: 'Jenkins PROD GUI', // 不用转成+,AJAX会自动处理编码
    start_time: Math.floor(Date.now() / 1000), // 当前时间开始
    end_time: Math.floor(Date.now() / 1000) + 3600, // 1小时后结束
    comment: '通过AJAX调度的Jenkins服务维护',
    com_author: 'your_username', // 替换成你的Nagios用户名
    com_authorized: 1
  },
  xhrFields: {
    withCredentials: true // 携带登录会话的Cookie,必须加这个!
  },
  success: function(response) {
    // Nagios返回的是HTML,我们检查关键字判断是否成功
    if (response.includes('Successfully submitted command')) {
      console.log('服务停机时间调度成功!');
    } else {
      console.warn('调度可能失败,检查响应详情:', response);
    }
  },
  error: function(xhr, status, error) {
    console.error('请求失败:', status, error);
  }
});

示例代码:原生Fetch API(不用jQuery也能跑)

如果你的项目不用jQuery,用原生Fetch也可以:

// 构建表单数据
const formData = new FormData();
formData.append('cmd_typ', '56');
formData.append('cmd_mod', '2');
formData.append('host', 'jenkins');
formData.append('service', 'Jenkins PROD GUI');
formData.append('start_time', Math.floor(Date.now() / 1000));
formData.append('end_time', Math.floor(Date.now() / 1000) + 3600);
formData.append('comment', '通过AJAX调度的Jenkins服务维护');
formData.append('com_author', 'your_username');
formData.append('com_authorized', '1');

// 发送请求
fetch('/nagios/cgi-bin/cmd.cgi', {
  method: 'POST',
  body: formData,
  credentials: 'include' // 携带登录Cookie
})
.then(response => response.text())
.then(text => {
  if (text.includes('Successfully submitted command')) {
    console.log('服务停机时间调度成功!');
  } else {
    console.warn('调度可能失败,响应内容:', text);
  }
})
.catch(error => console.error('请求出错:', error));

几个必须注意的坑

  1. 路径要对:你的Nagios可能部署在非根目录,比如路径是/nagios/cgi-bin/cmd.cgi,一定要根据实际情况修改URL。
  2. 跨域问题:如果你的前端页面和Nagios不在同一个域名,会触发CORS报错。解决办法要么把前端部署在Nagios同域,要么在Nagios的Web服务器(Apache/Nginx)配置CORS允许你的前端域名。
  3. 认证方式:如果不想用Cookie,可以用Basic Auth,在请求头里加Authorization: Basic 你的用户名密码Base64编码,但一定要用HTTPS传输,不然密码会明文泄露。
  4. 命令码别搞混:cmd_typ=56是添加服务停机时间,要是想删除的话是57,别写错!

内容的提问来源于stack exchange,提问作者user2439278

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:10:01