如何使用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));
几个必须注意的坑
- 路径要对:你的Nagios可能部署在非根目录,比如路径是
/nagios/cgi-bin/cmd.cgi,一定要根据实际情况修改URL。 - 跨域问题:如果你的前端页面和Nagios不在同一个域名,会触发CORS报错。解决办法要么把前端部署在Nagios同域,要么在Nagios的Web服务器(Apache/Nginx)配置CORS允许你的前端域名。
- 认证方式:如果不想用Cookie,可以用Basic Auth,在请求头里加
Authorization: Basic 你的用户名密码Base64编码,但一定要用HTTPS传输,不然密码会明文泄露。 - 命令码别搞混:cmd_typ=56是添加服务停机时间,要是想删除的话是57,别写错!
内容的提问来源于stack exchange,提问作者user2439278
相关产品推荐
相关产品推荐

