1. 程式人生 > >Azure雲 VM遠程開關機腳本

Azure雲 VM遠程開關機腳本

ont python實現 服務 script 成本 ret all 部署 rgs

背景

在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:

由於筆者的水平有限,文中難免會出現一些錯誤或者不準確的地方,不妥之處懇請讀者批評指正。

我也會繼續分享我的一些工作經驗和心得,喜歡筆者的文章,右上角點一波關註,謝謝!


Azure雲 VM遠程開關機腳本