安装
推荐yum安装
RHEL(CentOS)5版本:
rpm -Uvh http://mirror.pnl.gov/epel/5/i386/epel-release-5-4.noarch.rpm
RHEL(CentOS)6版本:
rpm -Uvh http://ftp.linux.ncsu.edu/pub/epel/6/i386/epel-release-6-8.noarch.rpm
pip安装
pip install ansible
要自己手动创建/etc/ansible/hosts等文件夹
由于后面要使用sshpass和ssh-copy-id于是
yum install -y ssh-client sshpass
目录结构
├── copy
│ ├── zabbix-agent-3.2.11-1.el6.x86_64.rpm
│ └── zabbix_pip.sh
├── hosts
├── scripts
│ └── zabbix.py
├── zabbix_ansible
│ ├── group_vars
│ ├── hosts
│ ├── roles
│ │ ├── ab
│ │ │ ├── handlers
│ │ │ │ └── main.yml
│ │ │ └── tasks
│ │ │ └── main.yml
│ │ ├── as
│ │ │ ├── handlers
│ │ │ │ └── main.yml
│ │ │ └── tasks
│ │ │ └── main.yml
│ │ └── common
│ │ ├── handlers
│ │ │ └── main.yml
│ │ └── tasks
│ │ └── main.yml
│ ├── site.yml
│ └── start.sh
└── zabbix_ansible.tar.gz
hosts
[ab]
xx.xx.xx.xx //填写自己需要的IP,也可以使用变量
[as]
xx.xx.xx.xx
xx.xx.xx.xx
[zainstall:children]
ab
as
site.yml
- hosts: zainstall
roles:
- common
- hosts: as
roles:
- as
- hosts: ab
roles:
- ab
start.sh
#!/bin/bash
read -p "Please input a IP:" IP
read -p "Please input ab or as:" TYPE
if [ $TYPE = 'as' ]; then
sed "/\[as\]/a $IP" -i hosts
else
sed "/\[ab\]/a $IP" -i hosts
fi
#ssh-copy-id -i /root/.ssh/id_rsa.pub root@$IP
sshpass -p ‘xxxxx’ ssh-copy-id -i /root/.ssh/id_rsa.pub -o StrictHostKeyChecking=no root@$IP
ansible-playbook -i hosts site.yml
zabbix_pip.sh //我在客户端安装agent时发现zabbix-agent虽然启动,但10050端口没有监听,所以写了这个脚本
if [ ! -d "/var/run/zabbix/zabbix_agentd.pid"]; then
mkdir -p /var/run/zabbix && chown zabbix.zabbix /var/run/zabbix && touch zabbix_agentd.pid
fi
roles/common/tasks/main.yml //as和ab都要执行的任务
- name: Copy rpm file to server
copy:
src: “{{ item }}”
dest: /tmp/
with_fileglob:
- /etc/ansible/copy/*
- name: Install package.
yum:
name: /tmp/zabbix-agent-3.2.11-1.el6.x86_64.rpm
state: present
- name: change zabbix-agent.conf
command: sed -i.ori ‘s#Server=127.0.0.1#Server=xx.xx.xx.xx#’ /etc/zabbix/zabbix_agentd.conf
- name: set hostname
shell: hostname
register: info
- name: change zabbix-agent.conf
command: sed -i.ori ‘147c Hostname={{info.stdout}}’ /etc/zabbix/zabbix_agentd.conf
#debug: msg={{info.stdout}}
- name: touch zabbix_agentd.pid
command: /bin/bash /tmp/zabbix_pip.sh
- name: start zabbix agent
service: name=zabbix-agent state=started
roles/as/tasks/main.yml
- name: set hostname
shell: hostname
register: info
- name: add host in zabbix server
script: /etc/ansible/scripts/zabbix.py -C {{ansible_ssh_host}} “My Templates” “Template for AnyBackup process num,Template for AnyBackup process mem” {{info.stdout}}
#debug: msg={{ansible_ssh_host}}
notify:
restart zabbix-agent
roles/as/handlers/main.yml
- name: restart zabbix-agent
service: name=zabbix-agent state=restarted
zabbix.py //控制zabbix服务端配置主机
#!/usr/bin/python
#coding:utf-8
import json
import sys
import urllib2
import argparse
from urllib2 import URLError
reload(sys)
sys.setdefaultencoding('utf-8')
class zabbix_api:
def __init__(self):
self.url = 'http://xx.xx.xx.xx:9800/api_jsonrpc.php'
self.header = {"Content-Type":"application/json"}
def user_login(self):
data = json.dumps({
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "xx",
"password": "xxxx"
},
"id": 0
})
request = urllib2.Request(self.url, data)
for key in self.header:
request.add_header(key, self.header[key])
try:
result = urllib2.urlopen(request)
except URLError as e:
print "\033[041m 认证失败,请检查URL !\033[0m",e.code
except KeyError as e:
print "\033[041m 认证失败,请检查用户名密码 !\033[0m",e
else:
response = json.loads(result.read())
result.close()
#print response['result']
self.authID = response['result']
return self.authID
def hostid_get_hostname(self, hostId=''):
data = json.dumps({
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": "extend",
"filter": {"hostid": hostId}
},
"auth": self.user_login(),
"id": 1
})
request = urllib2.Request(self.url, data)
for key in self.header:
request.add_header(key, self.header[key])
try:
result = urllib2.urlopen(request)
except URLError as e:
if hasattr(e, 'reason'):
print 'We failed to reach a server.'
print 'Reason: ', e.reason
elif hasattr(e, 'code'):
print 'The server could not fulfill the request.'
print 'Error code: ', e.code
else:
response = json.loads(result.read())
#print response
result.close()
if not len(response['result']):
print "hostId is not exist"
return False
host_dict=dict()
for host in response['result']:
status = {"0": "OK", "1": "Disabled"}
available = {"0": "Unknown", "1": "available", "2": "Unavailable"}
host_dict['name']=host['name']
host_dict['status']=status[host['status']]
host_dict['available']=available[host['available']]
return host_dict
def hostid_get_hostip(self, hostId=''):
data = json.dumps({
"jsonrpc": "2.0",
"method": "hostinterface.get",
"params": {
"output": "extend",
"filter": {"hostid": hostId}
},
"auth": self.user_login(),
"id": 1
})
request = urllib2.Request(self.url, data)
for key in self.header:
request.add_header(key, self.header[key])
try:
result = urllib2.urlopen(request)
except URLError as e:
if hasattr(e, 'reason'):
print 'We failed to reach a server.'
print 'Reason: ', e.reason
elif hasattr(e, 'code'):
print 'The server could not fulfill the request.'
print 'Error code: ', e.code
else:
response = json.loads(result.read())
# print response
result.close()
if not len(response['result']):
print "\033[041m hostid \033[0m is not exist"
return False
for hostip in response['result']:
return hostip['ip']
def host_get(self,hostName=''):
data=json.dumps({
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": "extend",
#"filter":{"host":""}
"filter":{"host":hostName}
},
"auth": self.user_login(),
"id": 1
})
request = urllib2.Request(self.url,data)
for key in self.header:
request.add_header(key, self.header[key])
try:
result = urllib2.urlopen(request)
except URLError as e:
if hasattr(e, 'reason'):
print 'We failed to reach a server.'
print 'Reason: ', e.reason
elif hasattr(e, 'code'):
print 'The server could not fulfill the request.'
print 'Error code: ', e.code
else:
response = json.loads(result.read())
#print reqponse
result.close()
if not len(response['result']):
print "\033[041m %s \033[0m is not exist" % hostName
return False
print "主机数量: \033[31m%s\033[0m"%(len(response['result']))
for host in response['result']:
status={"0":"OK","1":"Disabled"}
available={"0":"Unknown","1":"available","2":"Unavailable"}
#print host
if len(hostName)==0:
print "HostID : %s\t HostName : %s\t HostIp : %s\t Status :%s \t Available :%s"%(host['hostid'],host['name'],self.hostid_get_hostip(hostId=host['hostid']),status[host['status']],available[host['available']])
else:
print "HostID : %s\t HostName : %s\t HostIp : %s\t Status :\033[32m%s\033[0m \t Available :\033[31m%s\033[0m"%(host['hostid'],host['name'],self.hostid_get_hostip(hostId=host['hostid']),status[host['status']],available[host['available']])
return host['hostid']
def hostip_get(self, hostIp=''):
data = json.dumps({
"jsonrpc": "2.0",
"method": "hostinterface.get",
"params": {
"output": "extend",
"filter": {"ip": hostIp}
},
"auth": self.user_login(),
"id": 1
})
request = urllib2.Request(self.url, data)
for key in self.header:
request.add_header(key, self.header[key])
try:
result = urllib2.urlopen(request)
except URLError as e:
if hasattr(e, 'reason'):
print 'We failed to reach a server.'
print 'Reason: ', e.reason
elif hasattr(e, 'code'):
print 'The server could not fulfill the request.'
print 'Error code: ', e.code
else:
response = json.loads(result.read())
# print response
result.close()
if not len(response['result']):
print "\033[041m hostip \033[0m is not exist"
return False
print "主机数量: \33[31m%s\33[0m" % (len(response['result']))
for hostip in response['result']:
host = self.hostid_get_hostname(hostip['hostid'])
if len(hostip) == 0:
print "HostID : %s\t HostName : %s\t HostIp : %s\t Status :\33[32m%s\33[0m \t Available :\33[31m%s\33[0m"%(hostip['hostid'],host['name'],hostip['ip'],host['status'],host['available'])
else:
print "HostID : %s\t HostName : %s\t HostIp : %s\t Status :\33[32m%s\33[0m \t Available :\33[31m%s\33[0m"%(hostip['hostid'],host['name'],hostip['ip'],host['status'],host['available'])
return hostip['hostid']
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,
})
request = urllib2.Request(self.url,data)
for key in self.header:
request.add_header(key, self.header[key])
try:
result = urllib2.urlopen(request)
except URLError as e:
print "Error as ", e
else:
# result.read()
response = json.loads(result.read())
result.close()
#print response()
if not len(response['result']):
print "\033[041m %s \033[0m is not exist" % hostgroupName
return False
for group in response['result']:
if len(hostgroupName)==0:
print "hostgroup: \033[31m%s\033[0m \tgroupid : %s" %(group['name'],group['groupid'])
else:
print "hostgroup: \033[31m%s\033[0m\tgroupid : %s" %(group['name'],group['groupid'])
self.hostgroupID = group['groupid']
return group['groupid']
def template_get(self,templateName=''):
data = json.dumps({
"jsonrpc":"2.0",
"method": "template.get",
"params": {
"output": "extend",
"filter": {
"name":templateName
}
},
"auth":self.user_login(),
"id":1,
})
request = urllib2.Request(self.url, data)
for key in self.header:
request.add_header(key, self.header[key])
try:
result = urllib2.urlopen(request)
except URLError as e:
print "Error as ", e
else:
response = json.loads(result.read())
result.close()
#print response
if not len(response['result']):
print "\033[041m %s \033[0m is not exist" % templateName
return False
for template in response['result']:
if len(templateName)==0:
print "template : %s \t id : %s" % (template['name'], template['templateid'])
else:
self.templateID = response['result'][0]['templateid']
print "Template Name :%s"%templateName
return response['result'][0]['templateid']
def hostgroup_create(self,hostgroupName):
if self.hostgroup_get(hostgroupName):
print "hostgroup \033[42m%s\033[0m is exist !" % hostgroupName
sys.exit(1)
data = json.dumps({
"jsonrpc": "2.0",
"method": "hostgroup.create",
"params": {
"name": hostgroupName
},
"auth": self.user_login(),
"id": 1
})
request=urllib2.Request(self.url,data)
for key in self.header:
request.add_header(key, self.header[key])
try:
result = urllib2.urlopen(request)
except URLError as e:
print "Error as ", e
else:
response = json.loads(result.read())
result.close()
print "添加主机组:%s hostgroupID : %s"%(hostgroupName,self.hostgroup_get(hostgroupName))
def host_create(self, hostIp, hostgroupName, templateName, hostName):
if self.host_get(hostName) or self.hostip_get(hostIp):
print "该主机已经添加!"
sys.exit(1)
group_list=[]
template_list=[]
for i in hostgroupName.split(','):
var = {}
var['groupid'] = self.hostgroup_get(i)
group_list.append(var)
for i in templateName.split(','):
var={}
var['templateid']=self.template_get(i)
template_list.append(var)
data = json.dumps({
"jsonrpc":"2.0",
"method":"host.create",
"params":{
"host": hostName,
"interfaces": [
{
"type": 1,
"main": 1,
"useip": 1,
"ip": hostIp,
"dns": "",
"port": "10050"
}
],
"groups": group_list,
"templates": template_list,
},
"auth": self.user_login(),
"id":1
})
request = urllib2.Request(self.url, data)
for key in self.header:
request.add_header(key, self.header[key])
try:
result = urllib2.urlopen(request)
response = json.loads(result.read())
result.close()
print "add host : %s id :%s" % (hostIp, hostName)
except URLError as e:
print "Error as ", e
except KeyError as e:
print "\033[041m 主机添加有误,请检查模板正确性或主机是否添加重复 !\033[0m",e
print response
def host_disable(self,hostip):
data=json.dumps({
"jsonrpc": "2.0",
"method": "host.update",
"params": {
"hostid": self.host_get(hostip),
"status": 1
},
"auth": self.user_login(),
"id": 1
})
request = urllib2.Request(self.url,data)
for key in self.header:
request.add_header(key, self.header[key])
try:
result = urllib2.urlopen(request)
except URLError as e:
print "Error as ", e
else:
response = json.loads(result.read())
result.close()
print '------------主机现在状态------------'
print self.host_get(hostip)
def host_enable(self,hostip):
data=json.dumps({
"jsonrpc": "2.0",
"method": "host.update",
"params": {
"hostid": self.host_get(hostip),
"status": 0
},
"auth": self.user_login(),
"id": 1
})
request = urllib2.Request(self.url,data)
for key in self.header:
request.add_header(key, self.header[key])
try:
result = urllib2.urlopen(request)
except URLError as e:
print "Error as ", e
else:
response = json.loads(result.read())
result.close()
print '------------主机现在状态------------'
print self.host_get(hostip)
def host_delete(self,hostNames):
hostid_list=[]
for hostName in hostNames.split(','):
hostid = self.host_get(hostName=hostName)
if not hostid:
print "主机 \033[041m %s\033[0m 删除失败 !" % hostName
sys.exit()
hostid_list.append(hostid)
data=json.dumps({
"jsonrpc": "2.0",
"method": "host.delete",
"params": hostid_list,
"auth": self.user_login(),
"id": 1
})
request = urllib2.Request(self.url,data)
for key in self.header:
request.add_header(key, self.header[key])
try:
result = urllib2.urlopen(request)
result.close()
print "主机 \033[041m %s\033[0m 已经删除 !" % hostName
except Exception,e:
print e
if __name__ == "__main__":
zabbix=zabbix_api()
parser=argparse.ArgumentParser(description='zabbix api ',usage='%(prog)s [options]')
parser.add_argument('-H','--host',nargs='?',dest='listhost',default='host',help='查询主机')
parser.add_argument('-G','--group',nargs='?',dest='listgroup',default='group',help='查询主机组')
parser.add_argument('-T','--template',nargs='?',dest='listtemp',default='template',help='查询模板信息')
parser.add_argument('-A','--add-group',nargs=1,dest='addgroup',help='添加主机组')
parser.add_argument('-C','--add-host',dest='addhost',nargs=4,metavar=('xx.xx.xx.xx', 'groupname', 'Template01,Template02', 'hostName'),help='添加主机,多个主机组或模板使用逗号')
parser.add_argument('-d','--disable',dest='disablehost',nargs='+',metavar=('sh-aa-01'),help='禁用主机,填写主机名,多个主机名之间用逗号')
parser.add_argument('-e','--enable',dest='enablehost',nargs=1,metavar=('sh-aa-01'),help='开启主机')
parser.add_argument('-D','--delete',dest='deletehost',nargs='+',metavar=('sh-aa-01'),help='删除主机,多个主机之间用逗号')
parser.add_argument('-v','--version', action='version', version='%(prog)s 1.0')
if len(sys.argv) == 1:
print zabbix.host_delete('hz-aaa-02')
else:
args = parser.parse_args()
if args.listhost != 'host':
if args.listhost:
zabbix.host_get(args.listhost)
else:
zabbix.host_get()
if args.listgroup != 'group':
if args.listgroup:
zabbix.hostgroup_get(args.listgroup)
else:
zabbix.hostgroup_get()
if args.listtemp != 'template':
if args.listtemp:
zabbix.template_get(args.listtemp)
else:
zabbix.template_get()
if args.addgroup:
zabbix.hostgroup_create(args.addgroup[0])
if args.addhost:
zabbix.host_create(args.addhost[0], args.addhost[1], args.addhost[2], args.addhost[3])
if args.disablehost:
zabbix.host_disable(args.disablehost)
if args.deletehost:
zabbix.host_delete(args.deletehost[0])
最后执行./start.sh