zoukankan      html  css  js  c++  java
  • ansible和python的zabbix_api批量添加rsync服务的监控

    一、正常的处理流程:
    
    1.添加zabbix用户对rsync程序的sudo权限,且不需要输入密码
    # visudo即在/etc/sudoers配置文件最后添加如下内容
    
    Defaults:zabbix !requiretty
    zabbix ALL=NOPASSWD: ALL
    zabbix ALL=NOPASSWD: /bin/bash /usr/local/rsync/bin/rsync
    
    
    2.编写自动拉起服务的脚本,判断rsync程序是否存在,如果不存在就启动rsync
    # vim /usr/local/zabbix_agents_3.2.0/scripts/start_rsy.sh
    #!/bin/bash
    count_num=`ps -ef|grep 'rsync'|grep -v grep|wc -l`
    echo $count_num
    if [ $count_num -eq 0 ];then
    /etc/init.d/rsync start
    fi
    
    # 添加程序的可执行权限
    [root@web02:~]# chmod +x /usr/local/zabbix_agents_3.2.0/scripts/start_rsy.sh
    
    3.打开zabbix agent的远程命令
    sed -i 's|# EnableRemoteCommands=0|EnableRemoteCommands=1|g' /usr/local/zabbix_agents_3.2.0/conf/zabbix_agentd.conf
    
    # 重启zabbix客户端
    [root@web02:~]# /etc/init.d/zabbix_agentd restart
    
    二、使用ansible批量处理添加rsync的监控
    ansible批量添加监控需要做大量的准备工作,相对比较繁琐,如果需要监控的主机就几台手动几分钟就添加好了,当集群大到一定规模手动处理就显得很笨拙了
    使用ansible进行添加,后面即使新增单台服务器也可以这么操作,可以避免我们手动操作遗漏步骤
    
    # 添加需要处理的主机信息
    # vim /etc/ansible/hosts
    chinasoft_cbs_backend_web2    ansible_host=172.30.0.243    ansible_port=2018    ansible_user=root    ansible_ssh_pass=pass
    chinasoft_apiser_web03    ansible_host=172.30.0.27    ansible_port=2018    ansible_user=root    ansible_ssh_pass=pass
    chinasoft_platform_web01    ansible_host=172.30.0.19    ansible_port=2018    ansible_user=root    ansible_ssh_pass=pass
    chinasoft_platform_web02    ansible_host=172.30.0.17    ansible_port=2018    ansible_user=root    ansible_ssh_pass=pass
    chinasoft_platform_web03    ansible_host=172.30.0.20    ansible_port=2018    ansible_user=root    ansible_ssh_pass=pass
    chinasoft_platform_web04    ansible_host=172.30.0.18    ansible_port=2018    ansible_user=root    ansible_ssh_pass=pass
    
    1.添加sudoer的权限
    # 添加zabbix的sudo权限,/etc/sudoers结尾添加这三行
    Defaults:zabbix !requiretty
    zabbix ALL=NOPASSWD: ALL
    zabbix ALL=NOPASSWD: /bin/bash /usr/local/rsync/bin/rsync
    
    # 所有sudo执行rsync的权限
    ansible all -m blockinfile -a 'path=/etc/sudoers block="Defaults:zabbix !requiretty
    zabbix ALL=NOPASSWD: ALL
    zabbix ALL=NOPASSWD: /bin/bash /usr/local/rsync/bin/rsync
    " insertbefore=EOF'
    
    2.拷贝脚本到远程主机
    
    ansible all -m copy -a "src=/usr/local/zabbix_agents_3.2.0/scripts/start_rsy.sh dest=/usr/local/zabbix_agents_3.2.0/scripts/ mode=0755"
    
    3.开启远程命令
    ansible chinasoft_cbs_out_db3 -m shell -a "sed -i 's|# EnableRemoteCommands=0|EnableRemoteCommands=1|g' /usr/local/zabbix_agents_3.2.0/conf/zabbix_agentd.conf"
    
    
    4.zabbix-server在web上添加action动作
    
    具体执行:
    # 使用一台机器用ansible添加脚本、sudo权限进行测试,如果手动关闭rsync能否触发自动启动rsync的脚本说明没问题,就可以批量进行处理了
    
    # 添加sudo权限
    ansible chinasoft_cbs_out_db3 -m blockinfile -a 'path=/etc/sudoers block="Defaults:zabbix !requiretty
    zabbix ALL=NOPASSWD: ALL
    zabbix ALL=NOPASSWD: /bin/bash /usr/local/rsync/bin/rsync
    " insertbefore=EOF'
    
    # 添加脚本
    ansible chinasoft_cbs_out_db3 -m copy -a "src=/usr/local/zabbix_agents_3.2.0/scripts/start_rsy.sh dest=/usr/local/zabbix_agents_3.2.0/scripts/ mode=0755"
    
    # 开启远程命令
    ansible chinasoft_cbs_out_db3 -m shell -a "sed -i 's|# EnableRemoteCommands=0|EnableRemoteCommands=1|g' /usr/local/zabbix_agents_3.2.0/conf/zabbix_agentd.conf"
    
    # 验证远程命令
    ansible all -m shell -a "grep EnableRemoteCommands /usr/local/zabbix_agents_3.2.0/conf/zabbix_agentd.conf"
    
    # 重启zabbix-agent
    ansible chinasoft_cbs_out_db3 -m shell -a "executable=/bin/bash /etc/init.d/zabbix_agentd restart"
    
    
    批量处理:
    
    # 确认是否有rsync服务
    ansible all -m shell -a "ps -ef|grep 'rsync --daemon'"
    
    ansible all -m blockinfile -a 'path=/etc/sudoers block="Defaults:zabbix !requiretty
    zabbix ALL=NOPASSWD: ALL
    zabbix ALL=NOPASSWD: /bin/bash /usr/local/rsync/bin/rsync
    " insertbefore=EOF'
    
    ansible all -m copy -a "src=/usr/local/zabbix_agents_3.2.0/scripts/start_rsy.sh dest=/usr/local/zabbix_agents_3.2.0/scripts/ mode=0755"
    
    # ansible all -m shell -a "ls /usr/local/zabbix_agents_3.2.0/scripts/start_rsy.sh"
    
    ansible all -m shell -a "sed -i 's|# EnableRemoteCommands=0|EnableRemoteCommands=1|g' /usr/local/zabbix_agents_3.2.0/conf/zabbix_agentd.conf"
    
    ansible all -m shell -a "grep EnableRemoteCommands /usr/local/zabbix_agents_3.2.0/conf/zabbix_agentd.conf"
    
    # 重启zabbix-agent
    ansible all -m shell -a "executable=/bin/bash /etc/init.d/zabbix_agentd restart"
    
    
    三、使用zabbix_api批量为主机添加监控rsync程序的模板
    
    使用zabbix_api批量添加模板的脚本:
    template_massadd.py
    
    #!/usr/bin/python
    #-*- coding:utf8 -*-
    import json,sys,argparse
    from zabbix_api import ZabbixAPI
    server = "http://10.11.0.212/api_jsonrpc.php"
    username = "Admin"
    password = "zabbix"
    zapi = ZabbixAPI(server=server, path="", log_level=0)
    zapi.login(username, password)
    
    '''
    1. 安装zabbix插件 D:pythonzabbix>pip install zabbix-api
    2. 使用 zabbix_getallhosts.py 脚本获取主机名,将需要的主机名筛选出来
    
    使用方法:
    cmd下:
    python template_massadd.py --host="chinasoft_cbs_frontend_web01,chinasoft_cbs_frontend_web02,chinasoft_cbs_backend_web1,chinasoft_cbs_backend_web2,chinasoft_cbs_backend_web3,chinasoft_cbs_backend_web4,web01,web02,chinasoft_store_web01,chinasoft_store_web02,chinasoft_apiser_web01,chinasoft_apiser_web02,chinasoft_payment_web01,chinasoft_payment_web02,chinasoft_platform_web01,chinasoft_platform_web02,chinasoft_platform_web03,chinasoft_platform_web04,chinasoft_apicms_backend_web01,chinasoft_apicms_backend_web02,eus-timed-task01,eus-store-pay01,eus-apiserver-web03,eus-apiserver-web04" --"templates"="Template process rsync"
    '''
    
    # 获取参数
    def get_args():
        parser = argparse.ArgumentParser()
        parser.add_argument("-H", "--host", help="host name")
        parser.add_argument("-t", "--templates", help="template name")
        # 解析所传入的参数
        args = parser.parse_args()
        if not args.host:
            args.host = raw_input('host: ')
        if not args.templates:
            args.templates = raw_input('templates: ')
        return args
    
    def get_host_id(host):
        get_host_id = zapi.host.get(
            {
                "output": "hostid",
                "filter": {
                    "host":host.split(",")
                }
            }
        )
        host_id = []
        host_id.append([I['hostid'] for I in get_host_id])
        return host_id[0]
    
    def get_templates_id(templates):
        templates_id = zapi.template.get(
            {
                "output": "templateid",
                "filter": {
                    "host":templates.split(",")
                }
            }
        )
        return templates_id
        
    def template_massadd(template_id,host_id):
        template_add = zapi.template.massadd(
            {
                "templates": template_id,
                "hosts": host_id
                }
        )
        return "host add template success"
        
    
    # 程序入口
    if __name__ == "__main__":
        args = get_args()
        print 'args:%s' % args
        host_id = get_host_id(args.host)
        print 'host_id = %s' % host_id
        template_id = get_templates_id(args.templates)
        print 'template_id: %s' % template_id
        if len(host_id) == len(args.host.split(',')):
            if len(template_id) == len(args.templates.split(',')):
                print template_massadd(template_id,host_id)
            else:
                print "template not exist"
        else:
            print "host not exist"
    
    
    # 用法:
    
    # python template_massadd.py --host="chinasoft_apiser_web01,chinasoft_payment_web01" --"templates"="Template process rsync"
    # host add template success
    
    ###########################
    批量获取主机名的脚本
    
    #!/usr/bin/evn python
    # coding=utf-8
      
    import requests
    import json
      
    ZABIX_ROOT = "http://10.11.0.212"
    url = ZABIX_ROOT + '/api_jsonrpc.php'
      
    # user.login
    payload = {
         "jsonrpc" : "2.0",
         "method" : "user.login",
         "params": {
         'user': 'Admin',
         'password':'zabbix',
         },
         "auth" : None,
         "id" : 0,
        }
    headers = {'content-type': 'application/json',}
    
    req = requests.post(url, json=payload, headers=headers)
    auth = req.json()
      
    # host.get
    #主机显示名        'name'],
    # hosts是zabbix.conf文件中配置的主机名
    payload = {
            "jsonrpc" : "2.0",
            "method" : "host.get",
            "params": {
            'output': [
            'hostid',
            'host'],
            },
            "auth" : auth['result'],
            "id" : 2,
        }
    res2 = requests.post(url, data=json.dumps(payload), headers=headers)
    res2 = res2.json()
    
    #        f.write(host['name'] + '
    ')
    for host in res2['result']:
        with open('host.txt', 'a+') as f:
    
            f.write(host['host'] + '
    ')
  • 相关阅读:
    Java中的Java.lang.ThreadLocal类
    Java中线程的生命周期和状态
    Circular Linked List数据结构
    Linked List数据结构
    JVM如何工作
    JVM运行时数据区域
    queue数据结构
    stack数据结构
    Java中Set/HashSet的内部处理
    POJO,JavaBean 以及他们之间的区别
  • 原文地址:https://www.cnblogs.com/reblue520/p/9532849.html
Copyright © 2011-2022 走看看