g87616758 发表于 2019-2-22 11:27:36

aws云主机web弹性添加

  贡献web根据负载弹性添加到loadblance的python脚本一份,适用于aws(亚马逊)书写并调试、优化差不多2天时间,写代码真TM累。此脚本需要在每台web上安装snmp协议,大家做运维的估计在服务器上都安装了,cacti的时候会用到。
  #!/usr/bin/env python
#coding=utf-8
import boto
fromboto.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
    for line in loadlist:
      if line.strip() == name:
            load_balancer = conn.get_all_load_balancers(load_balancer_names=)
            single_load_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()
    instance_running = 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()
    instance_addresses =
    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
    else:
      start_instance = pre_start_instancelist
    printstart_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]
查看完整版本: aws云主机web弹性添加