分类目录归档:Try

自定义Nagios报警脚本

概述

Nagios可以使用邮件报警,但是如果使用IM软件提供的API进行报警的话,时效性上来说必然是会更好的。

另外如果使用自定义的报警脚本,可以针对报警做更多的事情,譬如限频,异步发送,记录入库等操作。

总而言之就是可以拥有更为灵活的工具。

关键点

开发语言

众多的Nagios插件均使用Perl编写,如 监控Redis 中使用到的工具。

选用Perl语言对于我来说并不是一个好的选择,如果选用了Perl,那么在主要使用PHP的环境下,不能方便的重复利用已有框架的各种工具,同时从语言的熟悉程度上来说,自然是PHP胜过Perl。

综上,选用PHP作为插件开发语言。

选用PHP作为Nagios报警插件的开发语言,需要在脚本的首行指定 Shebang ,即指定PHP可执行程序的绝对路径,形如:

Shebang之下仍然需要使用 <?php 标签。

同时,为了能让Nagios能直接执行报警插件,需要赋予可执行权限:

脚本输入输出

输入

脚本的输入方式与普通的命令行工具并无太多区别,可以使用 getopt 来获取输入的参数。

由于需要实现限频,以及针对主机和服务做一些处理,定义了如下的参数:

参数 说明
u 通知用户
m 报警消息体
r 频率限制值,秒为单位
h 主机
p 端口
l 通知等级,即OK/CRITICAL/WARNING/UNKNOW等
n 通知类型,即PROBLEM/CUSTOM等

限频的目的在于防止接收过多信息,避免必须处理的信息无法及时被发现。

而针对服务恢复正常的信息,不需要限频。

输出

Nagios的插件通过返回值确定这次检验的状态,即:

Exit code 状态
0 OK
1 WARNING
2 CRITICAL
3 UNKNOWN

不过由于是报警脚本,不妨直接让脚本返回0吧。

自定义变量

Nagios在调用编写的报警脚本时,通过定义好的command格式,完成传参。

对应到每一个联系人,需要有变量告知联系人的联系方式,针对IM,比如QQ,自然是QQ号。查阅Nagios预定义宏,会发现并没有QQ号这样的预定义宏。

当然可以选用预定义的 CONTACTPAGER 。考虑到寻呼机已经几乎没人使用了,可以借用一下变量。

针对各种工具(IM/内部通信接口/短信平台接口等),需要自定义。

关于自定义,Nagios的文档已有说明,这里简单提及一下:

  • 自定义变量必须以_开头以防止与预定义变量冲突
  • 自定义变量使用时需要转为全大写
  • 自定义变量会在前方加上所属的对象类型

针对第三点,简单说来,针对Contact,即联系人这一对象,如果定义了名为uid的自定义变量,那么,在contact的配置中,需要写成_uid,而实际在配置command时,会变为$_CONTACTUID$

配置commands

新增一个发送报警命令send_pm,定义这一自定义报警的调用方式。

参数列表正如上文提及的。

报警内容为了简短,只会发送主机名、服务名称以及检查结果的首行。

配置contacts

在需要报警的联系人配置中,加上自定义的uid变量,以及指定报警方法:

以上。

一些简单的tmux设置

概述

如果使用Linux作为服务器的操作系统,通过ssh操作时,会出现一个困难的选择:是否需要打开n个终端窗口?

如果服务器可以直接ssh的话,那么通过复用会话的方式似乎还算是个好选择,或者编写一个expect登陆脚本完成自动登陆操作。

当然,如果有如下需求:

  • 回家之后继续在公司的工作
  • 防止偶发的网络断开引起的重新连接
  • 运行时同时使用监控软件查看运行状态

那么这时候就需要使用终端复用软件了。

问题

tmux这个终端复用软件的强大无需多说,众多复杂的设置似乎对我来说并没有必要。而在使用中,自己曾经遇到过这些问题:

  • 默认的前缀按键Ctrl+b比较难按
  • 部分管理的快捷键并不方便(如关闭window,Ctrl+b -> Shift+7 -> y)或者并不形象(比如分割窗口)

需求

针对上面的问题,需求就变成了:

  • 能快速创建、切换pane(充分利用屏幕空间)
  • 快速切换window(可以直接通过组合数字键等方式切换)
  • 按键要便捷

细化一下,就变成了:

  • 能够通过数字键切换window
  • 能够顾通过方向键切换相邻window
  • 通过两次按键的组合键完成创建、切换、关闭window的操作
  • 通过两次按键的组合键完成创建、切换、关闭pane的操作
  • 通过-完成纵向切分window的操作
  • 通过\完成横向切分window的操作(\与|在一个按键上)
  • 快捷键前缀由C-b变为C-x

tmux-multi-pane-effect

配置

其中M表示键盘上的option/alt键S表示Shift键

如果不想增加关闭前的确认步骤,只需去掉指令中的confirm-before

还有一步

使用iTerm2时,为了能够让M键(即键盘上的option/alt键)能够完成上述工作,还需要进行设定:

tmux-iterm2-config

键盘上的两个option/alt键只需使用一个即可。

在Mac上简易设置Oh-My-Zsh的BulletTrain主题

起因

近期有了一台新的MacBook,自然少不了基本的装机过程,其中Homebrew和Oh-My-Zsh作为生产力工具算是必装的软件。

不过Oh-My-Zsh的默认主题看久了仍然还是觉得有些枯燥,动了想要更换主题的念头,于是有了后面的步骤。

步骤

安装Vim

常规的Homebrew安装和Oh-My-Zsh不需多言,而这次选定的Bullet Train主题却需要Vim的Powerline插件支持。而Powerline需要正常显示则需要安装已Patch了特殊字符的字体,如果使用iTerm2还需要设定显示字体为已Patch的字体……

由于Powerline需要Python支持,那么安装vim可以按照如下方式进行安装:

安装已Patch的字体

针对一些譬如手写对勾和叉以及git分支之类的符号,需要安装已Patch的字体,按照说明安装即可。

由于个人比较喜欢Monaco字体,对Monaco字体进行了Patch。

安装powerline

由于一直使用Vundler管理vim插件,通过Vundler安装这一插件十分方便,在~/.vimrc中添加:

为了启用这一插件的美化效果,则需要在~/.vimrc中添加如下配置:

之后在vim中执行:BundleInstall即可,还没有使用Vundler的可以一试。

具体参考了setup-vim-powerline-and-iterm2-on-mac-os-x

设置iTerm2

iTerm2个人一直在使用,需要将显示字体设定为已Patch的字体。

iterm2-set-display-patch-font

vim能够显示三角、分支等特殊字符即说明已然设置完毕。

fancy-vim

安装Bullet Train for oh-my-zsh

Oh-My-Zsh的主题安装一直都是很简便,直接wget对应的插件到~/.oh-my-zsh/themes即可,启用则是在~/.zshrc中设定ZSH_THEME="bullet-train"即可。

default-theme-effect

定制显示颜色

默认的显示颜色感觉略微的不和谐,好在这一主题可以通过在~/.zshrc中设置颜色等属性完成设定。

首先这里要保证iTerm2使用的是xterm-256color终端方式(在iTerm2的Preference->Profiles->Terminal中可以查看),后续显示使用的颜色会设定成这256色中一种。

定制颜色主要分为前景色,即字体的显示颜色,以及背景色。

这一主题的箭头标部分主要显示的是时间、目录、当前目录git信息,所以主要设定的是这三个部分的颜色以及参数:

阅读主题源码后了解到对于颜色直接对属性值赋予256色对应的颜色值即可。

颜色与数值的对应关系可以参考下图:

256-colors

最后

历经这一过程,终于完成了一些简单的修改,工作的时候可能也会更愉悦吧

theme-effect

以上。

从Pelican到Hexo

起因

用Pelican在GitHub上搭blog有段时间了,一直想要更清爽简单的blog解决方案,之前使用的Pelican算是满足了我的需求,但是还想尝试一下其他的系统,同时从视觉效果上来说Hexo+Next主题目前更让我觉得满意,于是决定从Pelican迁移到Hexo。

问题

搭建、使用Hexo的教程google一下就能找到,这里主要说一下自己迁移过程中遇到的一些小问题。

文档迁移

Pelican本身也是支持Markdown的的文章写作方式,其实需要修正的地方主要是头部的部分属性。

首先可以将Pelican的content目录下的所有Markdown文件复制到Hexo目录下的source/_posts/目录下。

Pelican通过DateTitleCategoryTagsSlug来表征写作时间、标题、分类、标签、Url等信息,例如:

而Hexo也是类似:

可以简单使用sed完成转换:

关于sed -i后的参数问题,参见stackoverflow上关于在Mac OS X下的sed使用问题

Git设置

允许Git添加非ASCII文件

hexo deploy过程中会在Git中在添加非ascii文件,所以需要在选项中开启这一设置。

Git中文文件名

某些情况下文章使用了中文tag,而生成Tag时会生成中文文件名的目录文件,Git需要关闭对中文文件名的转码。

GitHub CNAME问题

使用GitHub部署的情况下,绑定自定义域名的方法自然是添加一个CNAME文件,最简单的方法可以使用插件来完成。

最后

以上

使用QtCreator配置C++ 11开发调试环境

编译lwan的时候顺道看了下MinGW,发现64位版本也更新到了4.9,感觉自己很久没更新过Windows下的C++环境了,也想体验一下C++ 11,顺手升级了一下。

自己一直使用QtCreator作为C++开发环境,这个IDE个人很喜欢,自动补全功能相当方便,之前在开发Qt程序的时候这几乎是最好的选择,现在也开始出现了收费版本,但是仍然有社区版可用。目前CLion还没有放出正式版本,VS感觉又太重,QtCreator感觉还是一个很不错的选择。

QtCreator的是支持CMake的,正好自己想要学习CMake,于是打算选用CMake作为构建部分的工具。

以下是简要的配置步骤:

1.安装MinGW64

MinGW现在使用安装器的形式进行安装,下载完成一个很小的安装器后进行安装,期间可能是比较漫长的下载过程。不再多说。

2.安装CMake

一样是常规的安装步骤。

3.QtCreator配置

首先是配置编译器路径信息:

工具->选项中进行配置:

配置编译器

之后配置GDB路径信息:

配置GDB

还需要配置上CMake路径信息:

配置CMake

上述步骤完成之后根据之前起好的别名(即上图中的Name字段),选择组成构建套件:

配置构建套件

4.项目级配置

首先自然是常规的新建项目了:

新建项目

在项目类型这里,需要选择使用CMake构建的纯C++项目:

新建使用CMake的纯C++项目

建立完成之后选择好保存的位置

确定项目保存位置

确认项目信息

之后开始配置Debug构建目录

配置Debug构建目录

之后生成CMake相关文件,这里需要指定构建版本为Debug版本,即在参数中指明-DCMAKE_BUILD_TYPE=Debug:

设置CMake参数为Debug构建模式

之后项目会生成一个main.cpp和一个CMakeLists.txt文件:

新项目文件

CMakeLists.txt文件中增加如下配置,告知检查编译器是否支持C++ 11。

之后可以对项目这一构建模式由默认的all重命名为Debug,重新对项目执行CMake操作。

重命名为Debug

重新执行CMake操作

完成上述操作之后,Debug对象的构建配置工作基本完成,可以通过如下代码检验是否能够支持C++ 11的语法:

编辑代码

之后可以尝试构建Debug对象(点击左下角锤子图标):

构建Debug对象

尝试运行:

运行Debug对象

发现能够成功运行,那么至少配置Debug对象这一步就没有问题了。

5.调试

既然生成了Debug对象,那么调试功能自然不能少,尝试打一个断点:

断点调试

可以看出,在断点处查看局部变量等核心调试功能已经能够正常工作,单步、步入等功能也都可以正常工作。

6.发布程序

构建了Debug对象,那么作为生成产物的Release对象自然也不能少。

可以在添加一个构建模式:

添加Release构建模式

Debug对象与Release对象会通过CMake生成不同的配置,需要将二者放到不同的目录中:

配置Release构建目录

CMake参数上的区别在于需要指明-DCMAKE_BUILD_TYPE=Release:

配置CMake的Release参数

之后的构建运行同Debug。

构建运行Release对象

(CentOS下升级GCC参考了这里)。

以上。