设为首页 收藏本站
查看: 981|回复: 0

[经验分享] aws云主机web弹性添加

[复制链接]

尚未签到

发表于 2019-2-22 11:27:36 | 显示全部楼层 |阅读模式
  贡献web根据负载弹性添加到loadblance的python脚本一份,适用于aws(亚马逊)书写并调试、优化差不多2天时间,写代码真TM累。此脚本需要在每台web上安装snmp协议,大家做运维的估计在服务器上都安装了,cacti的时候会用到。
  #!/usr/bin/env python
#coding=utf-8
import boto
from  boto.ec2.elb import ELBConnection
import commands
import random
import logging
import time
  
ACCESS_KEY_ID = 'xxxx'
SECRET_ACCESS_KEY = 'xxxx'
  conn = ELBConnection(ACCESS_KEY_ID, SECRET_ACCESS_KEY)
ec2_connection = boto.connect_ec2(ACCESS_KEY_ID, SECRET_ACCESS_KEY)
  elastic_cloud_configs = {
    'testload': {         #loadbalancer name
        'filters': 'web', #machine nme filter 就是需要添加到负载均衡里面的机器名前缀
        'maxload': 0.02, #达到这个负载开始加机器
        'minload': 0.1, #达到这个负载开始关闭机器
        'keeps': ['web11', 'web10'] #长期开的机器,永远不关闭除非手动关闭
    },
  }
  
def show_elb_instance(name):
    """
    show elb all instance
    """
    loadlist = str(conn.get_all_load_balancers()).strip('[]').replace('LoadBalancer', '').replace(',', '').split(':')
    loadlist = loadlist[1:]
    for line in loadlist:
        if line.strip() == name:
            load_balancer = conn.get_all_load_balancers(load_balancer_names=[name])[0]
            single_load_instances = [instance for instance in load_balancer.instances]
            return single_load_instances
  
def show_elb_running_instance(name):
    """
    show elb running instance
    """
    single_load_instances = show_elb_instance(name)
    reservations = ec2_connection.get_all_instances([i.id for i in single_load_instances])
    instance_running = [r.tags['Name'] for r in reservations for r in r.instances]
    return instance_running
  
def show_all_instance():
    """
    show all instance
    """
    ec2_reservations = ec2_connection.get_all_instances()
    all_instance = []
    for instance in ec2_reservations:
        for inst in instance.instances:
            all_instance.append(inst)
    return all_instance
  
def show_machine_load(single_load_instances):
    sum_minute_load = 0
    sum_fiveminute_load = 0
    numlist = []
    reservations = ec2_connection.get_all_instances([i.id for i in single_load_instances])
    instance_addresses = [r.public_dns_name for r in reservations for r in r.instances]
    for ip in instance_addresses:
        single_machine_load = commands.getoutput(
            "snmpwalk  -v 2c %s -c public  .1.3.6.1.4.1.2021.10.1.3.1|awk '{print $4}'" % ip)
        five_minute_load = commands.getoutput(
            "snmpwalk  -v 2c %s -c public  .1.3.6.1.4.1.2021.10.1.3.2|awk '{print $4}'" % ip)
        numlist.append(ip)
        sum_minute_load += float(single_machine_load)
        sum_fiveminute_load += float(five_minute_load)
    return sum_minute_load / len(numlist), sum_fiveminute_load / len(numlist)
  
def add_machine_instance(key, pre_start_instancelist):
    if len(pre_start_instancelist) == 1:
        start_instance = pre_start_instancelist[0]
    else:
        start_instance = pre_start_instancelist[random.randint(0, len(pre_start_instancelist) - 1)]
    print  start_instance.tags['Name']
    print "Pre start instance status is %s" % start_instance.state
    print "Start instance id is %s:" % start_instance.id
    start_instance.start()
    print start_instance.state
    i = 0
    while True:
        if str(start_instance.state) == 'running':
            conn.register_instances(key, start_instance.id.split())
            print "New machine has been add !"
            break
        else:
            i += 1
            time.sleep(5)
            start_instance.update()
            print start_instance.state
            print str(start_instance.state)
            if i > 30:
                # logging
                break
  
def del_machine_instance(key, pre_stop_instancelist):
    for num in pre_stop_instancelist:
        print num.tags['Name']
        print "Pre stop instance status is %s" % num.state
        print "Stop instance id is %s:" % num.id
        num.stop()
        k = 0
        while True:
            if str(num.state) == 'stopped':
                conn.deregister_instances(key, num.id.split())
                print "New machine has been delete !"
                break
            else:
                k += 1
                time.sleep(5)
                num.update()
                print num.state
                if k > 30:
                    #logging
                    break
  
def main():
    pre_start_instancelist = []
    pre_stop_instancelist = []
    running_instance_id = []
    keeps_instance_id = []
    all_instance = show_all_instance()
    for key, value in elastic_cloud_configs.items():
        single_elb_instance = show_elb_instance(key)
        for inst2 in single_elb_instance:
            running_instance_id.append(inst2.id)
        single_load_instances = show_elb_instance(key)
        avg_minute_load, avg_fiveminute_load = show_machine_load(single_load_instances)
        for inst in all_instance:
            if str(inst.tags['Name']).startswith(value['filters']) and str(inst.state) == 'stopped':
                pre_start_instancelist.append(inst)
            for n in value['keeps']:
                if str(inst.tags['Name']) == n:
                    keeps_instance_id.append(inst.id)
            pre_stop_instanceidlist = [i for i in running_instance_id if
                                       i not in keeps_instance_id] #stop instance which not in keeps instance
            for line in pre_stop_instanceidlist:
                if line == inst.id:
                    pre_stop_instancelist.append(inst)
        print avg_minute_load, avg_fiveminute_load
        if avg_minute_load > float(value['maxload']) * 2 or avg_fiveminute_load > float(value['maxload']):
            add_machine_instance(key, pre_start_instancelist)
            instance_running = show_elb_running_instance(key)
            print instance_running
        if avg_minute_load < float(value['minload']):
            del_machine_instance(key, pre_stop_instancelist)
            instance_running = show_elb_running_instance(key)
            print instance_running
  
if __name__ == '__main__':
    main()




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-675752-1-1.html 上篇帖子: python调用aws接口添加安全组策略 下篇帖子: AWS想到办法让Alexa能在毫秒内做出回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表