Zabbix API批量新增用户

给zabbix配置完LDAP验证,但是需要提前在zabbix中建好用户,这个就会比较麻烦一点,AD域中的用户好几千人,而涉及到IT的也有2 300人,加上配置邮箱、手机号等,很明显工作量巨大。

由于对python和LDAP都不太熟悉,研究了几天没想出如何从直接从ldap将用户信息同步到zabbix,但刚好在另外一套系统中发现了有将ad域账号落地到数据库的情况,于是退而求其次,从这个数据库取得数据,再参考zabbix api的官方文档,完成了想要的效果。

这里采用python3的版本,通过pyzabbix库进行调用。

参考pyzabbix文档的语法

1
2
3
4
5
6
7
8
from pyzabbix import ZabbixAPI

zapi = ZabbixAPI("http://zabbixserver.example.com")
zapi.login("zabbix user", "zabbix pass")
print("Connected to Zabbix API Version %s" % zapi.api_version())

for h in zapi.host.get(output="extend"):
print(h['hostid'])

这里存放的临时表,很简单通过pymysql获取

1
2
3
QurySql ="""select * from tmp_user"""
mycursor.execute(QurySql)
data = mycursor.fetchall()

总共取出4个字段,登录账号、别名、手机号、邮箱地址

获取已有账号信息

第一步就是要登陆到zabbix,获取系统里所有的user信息。

请求对象

1
2
3
4
5
6
7
8
9
{
"jsonrpc": "2.0",
"method": "user.get",
"params": {
"output": "extend"
},
"auth": "038e1d7b1735c6a5436ee9eae095879e",
"id": 1
}

返回值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"jsonrpc": "2.0",
"result": [
{
"userid": "1",
"alias": "Admin",
"name": "Zabbix",
"surname": "Administrator",
"url": "",
"autologin": "1",
"autologout": "0s",
"lang": "ru_RU",
"refresh": "0s",
"type": "3",
"theme": "default",
"attempt_failed": "0",
"attempt_ip": "",
"attempt_clock": "0",
"rows_per_page": "50"
}
],
"id": 1
}

因为alias这里是唯一索引,所以调用user.get方法的时候通过alias进行判断,如果已存在则更新信息,如果不存在则新增用户。

1
user = zapi.user.get(filter={"alias": row[0]},output='extend')

这里可以根据传入的alias值获取到账户的所有属性,还有个比较重要的返回值叫userid,这个是要作为后面更新的时候的入参。

更新用户

根据前面得到的userid,这里只在属性里配置手机号和邮件地址,这样调用的时候就只会更新配置了的属性,其他保持不变

1
2
3
4
5
6
7
8
9
10
user_defaults = {'userid': user.userid, "user_medias": [
{
"mediatypeid": "3",
"sendto": row[2]
},
{
"mediatypeid": "4",
"sendto": row[3]
}
]}

新增用户

新增用户的内容就比较多一点,会设置短信和邮件的告警级别,和账号的一些其他属性默认密码等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
user_defaults = {'alias': row[0], 'name': row[1], 'autologin': 1, 'autologout': 0, 'lang': 'zh_CN', 'type': 1,
'usrgrps': [{'usrgrpid': 88}], 'passwd': default_password, "user_medias": [
{
"mediatypeid": "3",
"sendto": row[2],
"active": 0,
"severity": 48,
"period": "1-7,00:00-24:00"
},
{
"mediatypeid": "4",
"sendto": row[3],
"active": 0,
"severity": 8,
"period": "1-7,00:00-24:00"
}
]}

完整脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/usr/bin/env python3
import pymysql
from pyzabbix import ZabbixAPI, ZabbixAPIException

mysql_conn = pymysql.connect("127.0.0.1","zabbix","zabbix","zabbix" )
mycursor = mysql_conn.cursor()


zabbix_server = 'http://zabbixserver.example.com'

zapi = ZabbixAPI(zabbix_server)

# login to the Zabbix API
zapi.login('Admin','zabbix')


QurySql ="""select * from tmp_user"""
mycursor.execute(QurySql)
data = mycursor.fetchall()

default_password = '123456'

for row in data:
user = zapi.user.get(filter={"alias": row[0]},output='extend')

if user:
userid = user[0]["userid"]
user_defaults = {'userid': userid, "user_medias": [
{
"mediatypeid": "3",
"sendto": row[2]
},
{
"mediatypeid": "4",
"sendto": row[3]
}
]}
zapi.user.update(user_defaults)
print("更新用户{0}".format(row[1]))

else:
user_defaults = {'alias': row[0], 'name': row[1], 'autologin': 1, 'autologout': 0, 'lang': 'zh_CN', 'type': 1,
'usrgrps': [{'usrgrpid': 88}], 'passwd': default_password, "user_medias": [
{
"mediatypeid": "3",
"sendto": row[2],
"active": 0,
"severity": 48,
"period": "1-7,00:00-24:00"
},
{
"mediatypeid": "4",
"sendto": row[3],
"active": 0,
"severity": 8,
"period": "1-7,00:00-24:00"
}
]}
zapi.user.create(user_defaults)
print("新增用户{0}".format(row[1]))

执行效果

1
2
3
[root@zabbix-pri ~]# ./test.py 
更新用户占凯
新增用户王锴

Reference


Zabbix API批量新增用户
https://www.xbdba.com/2019/12/19/zabbix-api-create-user/
作者
xbdba
发布于
2019年12月19日
许可协议