0

我们有一个脚本,通过 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 中使用手动添加的主机名和一次使用 ip 作为主机名的主机 2x

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

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

使用 curl 你只能得到主机

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

2 回答 2

0

首先你需要“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
于 2020-04-01T10:17:17.863 回答
0

现在我们有另一个问题:我必须直接包含操作系统。到目前为止,这已经适用于相同的 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"}}'

但这样您就必须手动将操作系统名称插入 checkmk 界面,有一个特殊的选项卡可以在其中定义它们

这已经在 Linux、Windows 和 LCOS 操作系统上完成了

但现在是这样,nmap 扫描没有到处都包含一个操作系统,所以 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|

您可以看到主机上的操作系统完全丢失,或者有类似 android 的东西

我们现在希望没有 linux、windows 或 lcos 的主机将“空”作为 tag_os

但是 curl 命令会为具有空操作系统的主机提供错误,并且不会创建它们

{"result": "Check_MK exception: Unknown tag ", "result_code": 1}{"result": "Check_MK exception: No such host", "result_code": 1}
于 2020-04-02T11:14:56.007 回答