• 全世界谁倾听你
  • 网站正式加入腾讯404公益
  • 霸气的藏獒
  • Apache为什么二级域名不能加载证书呢?
  • 将网站做了一个微信小程序了,等待审核!
  • 一张图完美讲述VIM命令
  • 生活中不简简单单是做对的事,更是要把对的事情做对,如果还有一层,那么应该尝试把错的事情也做对! by 尼古拉斯·拉布拉卡
  • 123木头人
  • Windows命令提示符中统计行数
  • 一张图看懂上海17区县名字来源

Python批量部署zabbix的agent_client

Python IT敢客 6个月前 (11-09) 36688次浏览 已收录 2个评论 扫描二维码

        在运维工作中,zabbix 监控占据着越来越重要的地位,随着项目的增多以及项目本身的扩张,服务器数量越来越多,需要监控的服务器也就随之而多。一台台部署 zabbix 的客户端工作量会越来越大。这其中包括上传 zabbix 的客户端安装包,修改每一台的配置文件,加权限启动服务然后还要在 zabbix 上的界面上添加所有的监控服务器等等。所以能够批量远程部署,这是势在必行的,也是极大减少工作量的。于是自己在一边学习 python 一边专研这个需求方面,自己编写了一套 python 脚本来实现该需求。


        主要功能:1、实现批量上传文件至远程服务器,
                         2、批量修改各服务器上的配置文件,每一台都是特定的
                         3、批量启动服务
                         4、一键批量启动服务
                         5、一键批量停止服务
                         4、自动生成导入界面服务器的模板文件。


下面做简要说明和程序源码了:
主程序:
zabbix_sftp.py

import paramiko
import datetime
import os
import sys

port = 22
hosts_file = 'zabbix_hosts.txt'
remote_zbx_conf_file = '/home/zabbix/zabbix_import/zbx_host_list.txt'
remote_conf_file = '/home/zabbix/zabbix/conf/zabbix_agentd.conf'
remote_zbx_sh = '/home/zabbix/zabbix_import/zbx.sh'

def upload(local_dir,remote_dir):
    local_dir = local_dir.replace('\\','/')
    remote_dir = remote_dir.replace('\\','/')
    sub_folders = os.listdir(local_dir)
    with open(hosts_file,encoding='UTF-8') as file_object:
        contents = file_object.readlines()
    for content in contents:
        line=content.rstrip().lstrip().split(';')
        hostip=line[0]
        username=line[1]
        password=line[2]
        hostname=line[3]

        try:
            s = paramiko.SSHClient()
            s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            s.connect(hostname=hostip, username=username, password=password)
            print("!!:判断远程目录" +remote_dir+"是否存在,存在则备份为后缀加 _bak_ 时间的文件夹")
            for sub_folder in sub_folders:
                sub_dir_if = 'ls -d ' + sub_folder
                stdin, stdout, stderr = s.exec_command(sub_dir_if)
                result = stdout.read()
                if result is not None:
                    shell_dir_bak = 'mv ' + sub_folder.rstrip('/') + ' ' + sub_folder.rstrip('/') +'_bak_`date +%Y%m%d_%H%M%S`'
                    stdin, stdout, stderr = s.exec_command(shell_dir_bak)
            shell_cmd = 'mkdir -p ' + remote_dir
            stdin, stdout, stderr = s.exec_command(shell_cmd)
            s.close()
            t = paramiko.Transport((hostip,port))
            t.connect(username=username,password=password)
            sftp = paramiko.SFTPClient.from_transport(t)
            print('主机'+ hostip+ '在 %s' % datetime.datetime.now() +'时刻开始上传文件')
            zabbix_file = os.path.join(sys.path[0], hosts_file)
            for root,dirs,files in os.walk(local_dir):
                for file in files:
                    local_file = os.path.join(root,file)
                    a = local_file.replace(local_dir,'')
                    remote_file = os.path.join(remote_dir,a.lstrip('\\').replace('\\','/'))
                    try:
                        sftp.put(local_file,remote_file)
                        sftp.put(zabbix_file,remote_zbx_conf_file) # 上传文件配置文件到 zabbix_import 下面
                    except Exception as e:
                        sftp.mkdir(os.path.split(remote_file)[0])
                        sftp.put(local_file,remote_file)
                for name in dirs:
                    local_path = os.path.join(root,name)
                    a = local_path.replace(local_dir,'')
                    remote_path = os.path.join(remote_dir,a.lstrip('\\').replace('\\','/'))
                    try:
                        sftp.mkdir(remote_path)
                    except Exception as e:
                        print(e)
            print('主机'+ hostip+ '在 %s' % datetime.datetime.now() +'时刻上传文件成功')
            t.close()
            k = paramiko.SSHClient()
            k.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            k.connect(hostname=hostip, username=username, password=password)
            shell_killzbx = 'killall zabbix_agentd'
            shell_chmod = 'chmod -R u+x '+ remote_dir + '/*'
            shell_start = 'sh /home/zabbix/zabbix/start.sh'
            shell_rmbak = 'rm -rf /home/zabbix/*bak*'
            stdin, stdout, stderr = k.exec_command(shell_killzbx)
            stdin, stdout, stderr = k.exec_command(shell_chmod)
            stdin, stdout, stderr = k.exec_command(shell_start)
            print('主机' + hostip + '在 %s' % datetime.datetime.now() + '时刻启动 zabbix 服务成功')
            stdin, stdout, stderr = k.exec_command(shell_rmbak)
            k.close()
            ss = paramiko.SSHClient()
            ss.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            ss.connect(hostname=hostip, username=username, password=password)
            print("!!!:判断远程文件" +remote_conf_file+"是否存在,存在则备份为后缀加 _bak_ 时间 的文件")
            file_if = 'ls -f ' + remote_conf_file
            stdin, stdout, stderr = ss.exec_command(file_if)
            result = stdout.read()
            if result is not None:
                shell_file_bak = 'cp ' + remote_conf_file + ' ' + remote_conf_file +'_bak_`date +%Y%m%d_%H%M%S`'
                stdin, stdout, stderr = ss.exec_command(shell_file_bak)
            modify_conf_file_cmd = 'sed -i ' + 's/FEEIMT_UATA_APP1/'+hostname+'/g ' + remote_conf_file
            stdin, stdout, stderr = ss.exec_command(modify_conf_file_cmd)
            shell_import_zabbix =  'cd /home/zabbix/zabbix_import/;dos2unix * ;'+'sh '+ remote_zbx_sh
            stdin, stdout, stderr = ss.exec_command(shell_import_zabbix)
            print(stdout.read())
            ss.close()
        except Exception as e:
            print(e)


if __name__=='__main__':
    print("1:注意,local_dir 的路径最后不加\或者/;remote_dir 的路径最后要加/。。。")
    print("2:该小脚本实现从 Windows 或者 Linux 主机上传文件包括目录到 linux 服务器上!!!")
    local_dir = 'E:\Python\paramiko\paramiko(zabbix)\sftp'
    remote_dir = '/home/zabbix/'
    upload(local_dir,remote_dir)

        简要说明:程序上面已经实现了将本地 E:\Python\paramiko\paramiko(zabbix)\sftp 文件下面的所有文件都上传到远程目录/home/zabbix/目录下,这是程序中定义的两个路径,一个本地路径 local_dir,一个远程路径 remote_dir,这两个路径可自行修改。
然后还定义了一个配置文件,zabbix_hosts.txt,这个文件和 zabbix_sftp.py 放在了同一层路径下,里面内容如下

199.168.4.87;zabbix;zabbix;SS_STC_IMT1;XXX 交易系统;XXX SS STC IMT1
199.168.4.88;zabbix;zabbix;SS_STC_IMT2;XXX 交易系统;XXX SS STC IMT2
199.168.4.89;zabbix;zabbix;SS_STC_FCS1;XXX 交易系统;XXX SS STC FCS1
199.168.4.90;zabbix;zabbix;SS_STC_FCS2;XXX 交易系统;XXX SS STC FCS2

        zabbix_hosts.txt 内容说明:每一行代表一个服务器客户端,总共有 6 列,以半角分号分割开,第一列写远程服务器的 ip,第二列写远程 ssh 登录的用户名,第三列是远程 ssh 登录对应的密码,第四列是对应需要修改 zabbix 配置文件中的主机名,也是 zabbix 监控界面添加服务器的主机名称,第五列是 zabbix 界面添加监控服务器的所属组名,第六列是 zabbix 界面添加监控服务器的描述。

E:\Python\paramiko\paramiko(zabbix)\sftp 下面有两个文件夹,一个是 zabbix 的 agent 的客户端程序包,一个是生成导入 zabbix 界面监控服务器列表的程序 zabbix_import
        执行完上面的 python 脚本后,自动启动了客户端 zabbix_agent 服务,然后任意一台被监控的服务器上,/home/zabbix/zabbix_import/zbx_export_hosts.xml 该文件即为需要导入 zabbix 界面的被监控服务器的列表文件。

一键启动 zabbix 服务脚本。
zabbix_start.py

import paramiko
import datetime
import os
import sys

port = 22
hosts_file = 'zabbix_hosts.txt'

def upload(local_dir,remote_dir):
    local_dir = local_dir.replace('\\','/')
    remote_dir = remote_dir.replace('\\','/')
    with open(hosts_file,encoding='UTF-8') as file_object:
        contents = file_object.readlines()
    for content in contents:
        line=content.rstrip().lstrip().split(';')
        hostip=line[0]
        username=line[1]
        password=line[2]
        hostname=line[3]

        try:
            k = paramiko.SSHClient()
            k.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            k.connect(hostname=hostip, username=username, password=password)
            shell_killzbx = 'killall zabbix_agentd'
            shell_chmod = 'chmod -R u+x '+ remote_dir + '/*'
            shell_start = 'sh /home/zabbix/zabbix/start.sh;ps -ef|grep zabbix'
            stdin, stdout, stderr = k.exec_command(shell_killzbx)
            stdin, stdout, stderr = k.exec_command(shell_chmod)
            stdin, stdout, stderr = k.exec_command(shell_start)
            print('主机' + hostip + '在 %s' % datetime.datetime.now() + '时刻启动 zabbix 服务成功')
            k.close()
        except Exception as e:
            print(e)


if __name__=='__main__':
    print("1:注意,local_dir 的路径最后不加\或者/;remote_dir 的路径最后要加/。。。")
    print("2:该小脚本实现从 Windows 或者 Linux 主机上传文件包括目录到 linux 服务器上!!!")
    local_dir = 'E:\Python\paramiko\paramiko(zabbix)\sftp'
    remote_dir = '/home/zabbix/'
    upload(local_dir,remote_dir)

一键停止 zabbix 服务脚本。
zabbix_stop.py

import paramiko
import datetime
import os
import sys

port = 22
hosts_file = 'zabbix_hosts.txt'

def upload(local_dir,remote_dir):
    local_dir = local_dir.replace('\\','/')
    remote_dir = remote_dir.replace('\\','/')
    sub_folders = os.listdir(local_dir)
    with open(hosts_file,encoding='UTF-8') as file_object:
        contents = file_object.readlines()
    for content in contents:
        line=content.rstrip().lstrip().split(';')
        hostip=line[0]
        username=line[1]
        password=line[2]
        hostname=line[3]

        try:
            k = paramiko.SSHClient()
            k.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            k.connect(hostname=hostip, username=username, password=password)
            shell_killzbx = 'killall zabbix_agentd'
            stdin, stdout, stderr = k.exec_command(shell_killzbx)
            print('主机' + hostip + '在 %s' % datetime.datetime.now() + '时刻停止 zabbix 服务成功')
            k.close()
        except Exception as e:
            print(e)


if __name__=='__main__':
    print("1:注意,local_dir 的路径最后不加\或者/;remote_dir 的路径最后要加/。。。")
    print("2:该小脚本实现从 Windows 或者 Linux 主机上传文件包括目录到 linux 服务器上!!!")
    local_dir = 'E:\Python\paramiko\paramiko(zabbix)\sftp'
    remote_dir = '/home/zabbix/'
    upload(local_dir,remote_dir)

然后另外讲述一下生存 zabbix 的导入模板的脚本,该脚本是 shell 写的。zbx.sh 内容如下

#!/bin/bash
echo "###############################################"
echo "#  functions for import many hosts to zabbix  #"
echo "#                                             #"
echo "#  date 20170707                              #"
echo "#  author:amber_xu                            #"
echo "###############################################"
#sleep 5
if [ -f zbx_export_hosts.xml ]; then
	rm zbx_export_hosts.xml
fi 
cat zbx_export_hosts_head.xml > zbx_export_hosts.xml
cat zbx_host_list.txt > zbx_host_list_temp.txt
#sed -i '1d' zbx_host_list_temp.txt
cat zbx_host_list_temp.txt|while read zbx
do
	echo $zbx > tmp.txt
	host=`awk -F ";" '{print $4}' tmp.txt`
	name=`awk -F ";" '{print $4}' tmp.txt`
	group=`awk -F ";" '{print $5}' tmp.txt`
	ip=`awk -F ";" '{print $1}' tmp.txt`
	descripts=`awk 'BEGIN{FS=";"}{print $6}' tmp.txt`
	cat zbx_export_hosts_body.xml >111.xml
	sed -ri 's/host_template/'"$host"'/g' 111.xml
	sed -ri 's/name_template/'"$name"'/g' 111.xml
	sed -ri 's/group_template/'"$group"'/g' 111.xml
	sed -ri 's/ip_template/'"$ip"'/g' 111.xml
	sed -ri 's/description_template/'"$descripts"'/g' 111.xml
	cat 111.xml >> zbx_export_hosts.xml
done
cat zbx_export_hosts_tail.xml >> zbx_export_hosts.xml
rm -rf zbx_host_list_temp.txt tmp.txt 111.xml

以上是 Python3.4.4  paramiko2.2.1
程序打包下载地址 :

Python 批量部署 zabbix 的 agent_client此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“微信验证码”,获取验证码。在微信里搜索“IT 敢客”或者“itgank_com”或者微信扫描右侧二维码都可以关注本站微信公众号。


IT 敢客 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Python 批量部署 zabbix 的 agent_client
喜欢 (6555)
[313176056@qq.com]
分享 (0)
IT敢客
关于作者:
“我所做的一切都是为了方便我的生活~~~“
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(2)个小伙伴在吐槽
  1. 想法不错,不过用ansible更方便。
    hello world2018-01-22 10:51 回复 Windows 7 | Chrome 61.0.3163.100
    • IT敢客
      嗯。ansible是非常强大的,不过当时没有一台测试机,只能拿自己的PC做分发,所以才写了这个东西。哈哈
      IT敢客2018-01-22 11:00 回复 Windows 10 | Chrome 63.0.3239.132