前提条件:使用ansible批量安装完node-exporter与zabbix-agent
1、consul单节点安装:
docker run --name consul1 -d -p 8500:8500 -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8600:8600 consul:1.2.2
2、注册服务到consul,批量添加
IP_LIST="xxx.xxx.xxx.xxx" ##ip列表用空格隔开
for ip in ${IP_LIST}
do
host_ip=$(cat /etc/hosts|grep $ip|awk '{print $1}'|head -n 1)
if [ "$host_ip" == "$ip" ];then
host=$(cat /etc/hosts|grep $ip|awk '{print $2}'|head -n 1)
curl -X PUT -d "{\"id\": \"node-exporter-${ip}\",\"name\": \"node-exporter-${ip}\",\"address\": \"${ip}\",\"port\": 9100,\"tags\": [\"noder\"],\"Meta\": {\"hostname\": \"${host}\"},\"checks\": [{\"http\": \"http://${ip}:9100/metrics\", \"interval\": \"5s\"}]}" http://10.3.166.3:8500/v1/agent/service/register
echo "添加节点${ip},hostname: $host"
else
echo "列表ip: $ip, hosts文件ip: $host_ip。ip不一致,注册失败"
fi
done
注销服务: curl -X PUT http://xxx.xxx.xxx.xxx:8500/v1/agent/service/deregister/node-exporter-$ip
3、检查注册状态
4、修改prometheus.yml文件添加如下内容
- job_name: 'consul-prometheus'
consul_sd_configs:
- server: 'xxx.xxx.xxx.xxx:8500'
services: []
relabel_configs:
- source_labels: [__meta_consul_tags]
regex: .*noder.*
action: keep
- regex: __meta_consul_service_metadata_(.+)
action: labelmap
#!/bin/python3
import xlrd, os, json, requests, sys
参考zabbix API 5.0版本:https://www.zabbix.com/documentation/5.0/zh/manual/api
class zabbixtools:
url = 'http://xxx.xxxx.xxxx/zabbix/api_jsonrpc.php'
head = {'Content-Type': 'application/jsonrequest'}
# 获取认证id
def user_login(self):
data = {
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "Admin",
"password": "zabbix"
},
"id": 1,
"auth": None
}
try:
request_auth = requests.post(self.url, headers=self.head, data=json.dumps(data))
request_auth_json = request_auth.json()
auth = request_auth_json['result']
except Exception as e:
return '0'
return auth
##创建主机组
def hostgroup_create(self):
file = sys.argv[2]
with xlrd.open_workbook(file) as fb:
sheet = fb.sheet_by_name('Sheet1')
for i in range(1, sheet.nrows):
group = sheet.row_values(i)[2]
data = json.dumps({
"jsonrpc": "2.0",
"method": "hostgroup.create",
"params": {
"name": group
},
"auth": self.user_login(),
"id": 1
})
groups_create = requests.post(self.url, headers=self.head, data=data)
result = groups_create.json()
print(result)
# 获取主机组id
def hostgroup_get(self, hostGroupName):
data = json.dumps({
"jsonrpc": "2.0",
"method": "hostgroup.get",
"params": {
"output": "extend",
"filter": {
"name": hostGroupName
}
},
"auth": self.user_login(),
"id": 1,
})
response = requests.get(url=self.url, headers=self.head, data=data)
return response.json()
# 获取监控主机列表
def get_hosts(self):
data = {
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": ["hostid", "host"], "selectInterfaces": ["interfaceid", "ip"]},
"id": 2,
"auth": self.user_login()
}
request_host = requests.post(self.url, headers=self.head, data=json.dumps(data))
request_host_json = request_host.json()
return request_host_json
# 创建主机
def create_hosts(self):
file = sys.argv[2]
print("创建主机")
with xlrd.open_workbook(file) as fb:
sheet = fb.sheet_by_name('Sheet1')
for i in range(1, sheet.nrows):
hostname = sheet.row_values(i)[0]
hostip = sheet.row_values(i)[1]
groupid_list = self.hostgroup_get(sheet.row_values(i)[2])['result']
for groupid in groupid_list:
templateid = int(sheet.row_values(i)[3])
####################################
data = {
"jsonrpc": "2.0",
"method": "host.create", "params": {"host": hostip, "interfaces": [
{"type": 1, "main": 1, "useip": 1, "ip": hostip, "dns": "", "port": "10050"}],
"groups": [{"groupid": groupid['groupid']}],
"templates": [{"templateid": templateid}],
"inventory_mode": 0,
"inventory": {"macaddress_a": "01234",
"macaddress_b": "56768"},
"name": hostname
},
"auth": self.user_login(),
"id": 1
}
request_create = requests.post(self.url, headers=self.head, data=json.dumps(data))
request_create_json = request_create.json()
print(request_create_json)
# 导入模板
def zbx_export(self):
fb = open(sys.argv[2], encoding='utf8').read()
data_export = {
"jsonrpc": "2.0",
"method": "configuration.import",
"params": {
"format": "xml",
"rules": {
"applications": {"createMissing": True, "deleteMissing": True},
"valueMaps": {"createMissing": True, "updateExisting": True},
"groups": {"createMissing": True},
"graphs": {"createMissing": True},
"screens": {"createMissing": True},
"templateScreens": {"createMissing": True},
"triggers": {"createMissing": True, "updateExisting": True},
"templates": {"createMissing": True},
"items": {"createMissing": True,
"updateExisting": True, "deleteMissing": True}
},
"source": fb},
"auth": self.user_login(),
"id": 1
}
request_export = requests.post(self.url, headers=self.head, data=json.dumps(data_export))
request_export_json = request_export.json()
return request_export_json
def main():
if len(sys.argv) == 3:
if (sys.argv[1] == 'delete' or sys.argv[1] == 'create' or sys.argv[1] == 'export') and os.path.isfile(
sys.argv[2]):
auths = zabbixtools()
if auths == 0:
print('获取认证令牌失败..请检查提交数据的准确性')
return '0'
# 获取认证令牌
print('-------------')
print('获取用户认证令牌auth:%s' % auths.user_login())
if sys.argv[1] == 'create':
#添加主机组
print('添加主机log:%s' % auths.hostgroup_create())
# 添加监控主机
print('-------------')
print('添加主机log:%s' % auths.create_hosts())
if sys.argv[1] == 'export':
# 导入模板
print('-------------')
print('导入模板log:%s' % auths.zbx_export())
else:
pass
#获取线上监控主机列表
print('--------------')
hostlist = auths.get_hosts()['result']
for i in hostlist:
i['ip'] = i['interfaces'][0]['ip']
del i['interfaces']
print('目前监控主机列表:%s' % (i))
else:
print('执行失败.Usage: /bin/python3 %s delete/create/export target_file' % (sys.argv[0]))
else:
print('执行失败.Usage: /bin/python3 %s delete/create/export target_file' % (sys.argv[0]))
return '0'
if __name__ == '__main__':
main()