我按照本指南在 icinga2 上使用 by_ssh 而不是 NRPE:
https://wiki.icinga.org/display/howtos/Using+SSH+as+remote+client+for+Icinga2
我遇到的问题是,当通过 SSH 远程执行 nagios 插件时,我得到返回“stdin:不是 tty”,这是 icinga2 出错的原因。
我可以通过传递 ssh -t 在命令行上停止此操作,例如:
ssh -t [email protected] "ls -l"
但是,我似乎无法将 -t 放入 by_ssh 模块。我以为使用 by_ssh_argument 属性可以做到这一点。我的 icinga2 配置如下所示:
object CheckCommand "disks" {
import "by_ssh"
vars.by_ssh_logname = "root"
vars.by_ssh_port = "4873"
vars.by_ssh_argument = { "-t" = null }
vars.by_ssh_command = [ "/usr/lib64/nagios/plugins/check_disk", "-w", "$by_ssh_disk_warn$", "-c", "$by_ssh_disk_crit$" ]
vars.by_ssh_disk_warn = "5%"
vars.by_ssh_disk_crit = "2%"
}
我也尝试过反转,放入 { 0 = "-t" } 或等效项。两种方法都无法正确传递到 ssh 命令中。
我根本没有按照正确的方式去做这件事,或者这是不可能的,我需要制作自己的 by_ssh 插件?
答案1
我找到了一个解决方案,但我不确定这是否是最好的方法。
我发现传递-E
给 nagioscheck_by_ssh
插件可以阻止 tty 错误。我找不到-E
从by_ssh
插件传递的方法,所以我为此创建了自己的 icinga2 插件:
object CheckCommand "by_ssh_extended" {
import "plugin-check-command"
import "ipv4-or-ipv6"
command = [ PluginDir + "/check_by_ssh" ]
arguments = {
"-H" = "$by_ssh_address$"
"-p" = "$by_ssh_port$"
"-C" = {{
var command = macro("$by_ssh_command$")
var arguments = macro("$by_ssh_arguments$")
if (typeof(command) == String && !arguments) {
return command
}
var escaped_args = []
for (arg in resolve_arguments(command, arguments)) {
escaped_args.add(escape_shell_arg(arg))
}
return escaped_args.join(" ")
}}
"-l" = "$by_ssh_logname$"
"-i" = "$by_ssh_identity$"
"-q" = {
set_if = "$by_ssh_quiet$"
}
"-E" = {
set_if = "$by_ssh_e$"
}
"-w" = "$by_ssh_warn$"
"-c" = "$by_ssh_crit$"
"-t" = "$by_ssh_timeout$"
"-o" = {
value = "$by_ssh_options$"
description = "Provide ssh options (may be repeated)"
}
}
vars.by_ssh_address = "$check_address$"
vars.by_ssh_quiet = false
}