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}
我们有一个脚本可以通过 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}