lam_mysql.py 3.03 KB
# -*- coding: utf8 -*-
import requests
from requests.auth import HTTPBasicAuth
import json

# dingding 
DING =  "https://oapi.dingtalk.com/robot/send?access_token=31cf1a526c98862b7945e561c5a0d857a069350dbee0e807074b83b39fa1e1af"
ansible_url = "http://ansible.yohops.com/api/v2"
ansible_user = "chunhua.zhang"
ansible_password = "Zch@2019"


def main_handler(event, context):
    return_str = "OK"
    if event['queryStringParameters']['method'] != 'master_fail_over' :
        return_str = "Method Not Supported"
    elif event['queryStringParameters']['auth'] != 'yohomysqlfailover123456887':
        return_str = "Auth Failed"
    else:
        fail_master = event['queryStringParameters']['failmaster']
        new_master = event['queryStringParameters']['newmaster']
        return_str = "TEST ... Mysql Failover Proccess Successfully!"
        ansible_tower_process(new_master, fail_master)
        alert_to_dingding(new_master, fail_master)
    return { "isBase64Encoded": False, "statusCode": 200,  "headers": {} , "body": "%s" %return_str }

def ansible_tower_process(newmaster, failmaster):
   ## az1, az2, az3
   for inventory in [6, 5, 4]:
      extra_var = {}
      r = requests.get(ansible_url + "/inventories/%i/" %inventory, auth=(ansible_user, ansible_password))
      inventory_vars = json.loads( r.json()['variables'])
      for key in inventory_vars:
        # only proccess variable's name starts with db and variable's value equals [failmaster]
        if key.startswith("db") and inventory_vars[key] == failmaster:
           extra_var[key] = newmaster
        
      if not extra_var:
         print("can not find any variables in inventory:%i starts with db and value is %s" %(inventory,failmaster))
         continue
    
      # 1. update dns
      extra_var['confirmation'] = 'DNS'
      dns_payload = {}
      dns_payload['inventory'] = inventory
     
      dns_payload['extra_vars'] = json.dumps(extra_var)
      print("start to update dns for inventory: %i , params is: %s" %(inventory, dns_payload))
      r_dns = requests.post(ansible_url + "/job_templates/36/launch/", json = dns_payload, auth=(ansible_user, ansible_password))

      # 2. reload cobar
      cobar_payload = {}
      cobar_payload['inventory'] = inventory
      print("start to reload cobar for inventory: %i , params is: %s" %(inventory, cobar_payload))
      r_cobar = requests.post(ansible_url + "/job_templates/35/launch/", json = cobar_payload, auth=(ansible_user, ansible_password))
      


def alert_to_dingding(newmaster, failmaster):
    # send text dingding message. see:https://open-doc.dingtalk.com/docs/doc.htm?spm=a219a.7629140.0.0.karFPe&treeId=257&articleId=105735&docType=1
    ding_req = {}
    ding_req["msgtype"]="markdown"
    ding_req["markdown"] = {}
    ding_req["markdown"]['title']="Mysql Failover"
    ding_req["markdown"]["text"]= "### Mysql Master Failover.   Fail Master: %s , New Master: %s" % (failmaster, newmaster)
    
    r = requests.post(url = DING, json = ding_req) 
    print("Send DingDing message result:%s, request: %s "  %(r, ding_req)) 
    return("SUCCESS")