check-mk 检查hostname and/or ip是否已经存在

check-mk check if hostname and/or ip already exist

我们有一个脚本可以通过 curl

在 check_mk 中插入新主机
#!/bin/bash

cat file.conf | while read line
do

    HOSTNAME=$(echo $line | cut -d '|' -f1)
    IP=$(echo $line | cut -d '|' -f2)


curl "http://myserver/mysite/check_mk/webapi.py?action=add_host&_username=automation&_secret=myautomationsecret" -d 'request={"hostname":"'"$HOSTNAME"'","folder":"ansible","attributes":{"ipaddress":"'"$IP"'","site":"mysite","tag_agent":"cmk-agent"}}'
done 

文件 "file.conf" 是一个已经处理过的文件,来自 xmlstarlet 的 nmap 扫描,这个文件并不总是有主机名,因此 IP 地址被用作主机名

file.conf 看起来像这样

192.168.30.1|192.168.30.1|os
_gateway|192.168.30.2|Linux 2.6.18 - 2.6.22
...

所以对于某些主机,IP 地址作为主机名传递一次,逻辑上作为 ip。现在可以让员工输入正确的主机名并从字段主机名

中删除 ip

如果再次执行上面提到的脚本,它将再次创建主机,并将 ip 作为主机名(因为没有指定主机名),所以现在我们在 check_mk 1x 中有了主机 2x,手动添加主机名,一次使用 ip 作为主机名

从一开始 nmap 就已经正确识别主机名的所有其他主机都没有像应该的那样被接管

我们现在需要一个函数,在执行脚本之前询问主机名的 ip 地址,如果它已经存在,则不应再次创建主机

使用 curl 只能获取主机

curl "http://myserver/mysite/check_mk/webapi.py?action=get_all_hosts&_username=automation&_secret=myautomationsecret"  

首先你需要 "jq",所以 apt-get install jq。 (用于 bash 读取 json 文件)

FILE="filename"
getHost="http://myserver/mysite/check_mk/webapi.py?action=get_all_host&_username=automation&_secret=myautomationsecret"

  while IFS='|' read -r host ip description
  do

    checkHost=$( curl -s "$getHost" | 
     jq -r '.result | keys[] as $k | "\(.[$k] | .attributes | select(.ipaddress=="'$ip'") | .ipaddress )"' | uniq )

    if [ "$checkHost" != "$ip" ]
    then
            # here you already know that this ip ( $ip ) not exist in check_mk
            # put your curl command with add_host action here
            echo "Hostname: $ip added to check_mk"
    else
            echo "Hostname: $ip is already exist in check_mk"

    fi


  done <$FILE

现在我们有另一个问题:我必须直接包含 OS。到目前为止,这已经适用于相同的 add_host,我只需要包含另一个属性

 curl "http://myserver/mysite/check_mk/webapi.py?action=add_host&_username=automation&_secret=myautomationsecret" -d 'request={"hostname":"'"$HOSTNAME"'","folder":"ansible","attributes":{"ipaddress":"'"$IP"'","tag_os": "'"$OS"'","site":"mysite","tag_agent":"cmk-agent"}}'

但是您必须手动将 OS 名称插入 checkmk 界面,有一个特殊的选项卡,您可以在其中定义它们

OSLinux、Windows 和 LCOS

已经做到了这一点

但现在 nmap 扫描并没有到处都包含 os,所以 file.conf 有时看起来像这样:

host1|192.168.30.25|Windows
host2|192.168.30.90|Linux
host3|192.168.30.110|Linux
host4|192.168.30.111|Linux
192.168.30.130|192.168.30.130|
192.168.30.131|192.168.30.131|Android
192.168.30.155|192.168.30.155|Linux
192.168.30.157|192.168.30.157|

你可以看到在 hosts 处 os 完全丢失或者有类似 android

的东西

我们现在希望没有 linux、windows 或 lcos 的 hosts 具有 "empty" 作为 tag_os

但是 curl 命令给出了一个空 os 的 hosts 错误并且没有创建它们

{"result": "Check_MK exception: Unknown tag ", "result_code": 1}{"result": "Check_MK exception: No such host", "result_code": 1}