背景

在Azure云上准备的测试环境,考虑到运行的成本,需要通过计划任务设置定时开关机。

此操作可以通过多种方法实现,例如Azure提供的runbook,或者调用Azure SDK来实现,本文使用Azure sdk for python实现。

支持判断中国法定节假日、周六日,按Resource Group为单位进行开关机。


Code:


credentials.py

#!/usr/bin/python
from msrestazure.azure_cloud import AZURE_CHINA_CLOUD
from azure.common.credentials import ServicePrincipalCredentials
from azure.mgmt.compute import ComputeManagementClient

# Credentials
SUBSCRIPTION_ID = '1f6xxx46-167a-433c-bxxx-ff18f5xxxdd3'
CLIENT_SECRET = 'A123456'
CLIENT_ID = 'e8xx-5dxxf-47x3-99xxd-22xxxa0a'
TENANT = 'xxfxx14-8x47-4x8-x4c-386xd2d'

def get_credentials():
    credentials = ServicePrincipalCredentials(
        client_id = CLIENT_ID,
        secret = CLIENT_SECRET,
        tenant = TENANT,
        china = True
    )
    return credentials
    
def auth():
    credentials = get_credentials()
    compute_client = ComputeManagementClient(
        credentials, 
        SUBSCRIPTION_ID,
        base_url=AZURE_CHINA_CLOUD.endpoints.resource_manager
    )
  
    return compute_client


vm_power.py

#!/usr/bin/python
# -*- coding: utf-8 -*-
from datetime import datetime
from chinese_calendar import is_holiday
from  credentials import auth
import sys
import logging
RESOURCE_GROUPS = ['clusters', 'website']
compute_client = auth()  

def vm_start(group_name):
    for vm in compute_client.virtual_machines.list(group_name):
        async_vm = compute_client.virtual_machines.start(group_name, vm.name)
        async_vm.wait()
        
def vm_deallocate(group_name):
    for vm in compute_client.virtual_machines.list(group_name):
        async_vm = compute_client.virtual_machines.deallocate(group_name, vm.name)
        async_vm.wait()
        
def check_args():
    args = ['start', 'deallocate']
    if len(sys.argv) == 2:
        if sys.argv[1] not in args:
            logging.error("Input must be %s" % args)
            sys.exit(1)
        return sys.argv[1]
        
if __name__ == '__main__':
    today = datetime.date(datetime.now())
    cmd = check_args()
    action = {'start': vm_start, 'deallocate' : vm_deallocate}
    if is_holiday(today) and cmd != 'deallocate':
        logging.error("Can't exec %s in holiday" % cmd)
        sys.exit(1)
    else:
        for group in RESOURCE_GROUPS:
            action[cmd](group)


使用方法

使用此脚本需要先安装Azure SDK和 chinese_calendar,chinese_calendar用于判断中国的法定节假日。

此脚本可以部署在能访问Azure的主机上或是Azure的一个服务上,通过计划任务的方式进行调度执行,来达到节省成本的目的。


END:

由于笔者的水平有限,文中难免会出现一些错误或者不准确的地方,不妥之处恳请读者批评指正。

我也会继续分享我的一些工作经验和心得,喜欢笔者的文章,右上角点一波关注,谢谢!