0

我在 Icinga 中有一个条件规则来执行检查 cas 身份验证的脚本。该脚本使用 URL 并在返回的页面中 grep 字符串。URL 和字符串被赋予脚本的属性。

这是主机的定义:

 object Host "m" {
  address = "1xx.xx7.25"
  import "linux-server"
  display_name = "m"    
  vars.curl_casURL = "http://xxx.html"
  vars.curl_casGREP = "Returned String"
}

这是服务的代码,它仅在主机中定义了两个变量 curl_casURL 和 curl_casGREP 时执行:

apply Service "cas"  {
  import "generic-service"
  check_command = "cas"
  assign  where (host.vars.curl_casURL && host.vars.curl_casGREP)
}

在web界面中,没关系,我看到脚本是为服务器“m”执行的。

这是命令:

object CheckCommand "cas" {
  import "plugin-check-command"
  command = [ PluginDir + "/icinga-curl_cas.sh" ]
  command +=[  vars.curl_casURL + vars.curl_casGREP ]
}

但是由于脚本的第一行,脚本从不接收参数并回显临界状态:

if [ ! $1  ]
 then
  echo "GIVE ME AN  URL, PLEASE!"
  exit $STATE_CRITICAL
fi

我没有在文档中找到答案。有人可以帮我吗?谢谢!!

4

1 回答 1

0

在您的示例中,将自定义属性作为运行时宏访问是错误的:

object CheckCommand "cas" {
  import "plugin-check-command"
  command = [ PluginDir + "/icinga-curl_cas.sh" ]
  command +=[  vars.curl_casURL + vars.curl_casGREP ]
}

使用您的 CheckCommand 询问如何将自定义属性作为命令属性访问需要很少了解运行时宏及其值,当然还有命令参数语法。

由于您使用的是没有任何键的有序参数列表,因此我会以丑陋的方式进行操作,并将自定义属性值作为运行时宏字符串添加到数组中。

object CheckCommand "cas" {
  import "plugin-check-command"
  command = [ PluginDir + "/icinga-curl_cas.sh", "$curl_casURL$", "$curl_casGREP$" ]
}

宏解析器将自动查找所需的值,无论它们是否定义为 CheckCommand、Host 对象或使用 CheckCommand 的服务的默认值。

尽管我建议您将 GetOpts 与脚本的参数和值一起使用(更好的可读性和值的位置对以后的更改无关紧要)。

while getopts "u:g:" opt; do
  case $opt in
    u)
      URL=$OPTARG
      ;;
    g)
      GREP=$OPTARG
      ;;
    [....]
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done

使用命令参数非常简单。它还允许您添加参数描述,这在以后会有所帮助(并通过 2.4 中的 API 检索)。

object CheckCommand "cas" {
  import "plugin-check-command"
  command = [ PluginDir + "/icinga-curl_cas.sh" ]

  arguments = {
    "-u" = {
      value = "$curl_casURL$"
      description = "URL for curl"
    }
    "-g" = {
      value = "$curl_casGREP$"
      description = "GREP for curl"
    }
  }
}
于 2015-11-25T15:38:02.977 回答