一.說明
使用阿里雲API可以完成大部分頁面操作,例如定期統計所有資源的清單、統一續費所有產品7天、定期生成資金花費表、定期對RDS做全備份並下載到本地存儲、編寫自動創建ECS模板做一鍵資源購買等等。
阿里雲API在剛看的時候會很懵,雖然能找到接口文檔,但上面的說明是什么意思?參數到底填在哪?返回的是什么?
對於大部分沒有開發經驗的運維來說這會很困難,本次教程讓大家快速了解阿里雲API的整套流程使用方式。
二.使用
接口文檔
1.阿里雲每個服務都有相關的文檔,例如阿里雲ECS文檔中,API參考-》API概覽,可以看到相應的接口參數
2.API相當於一個窗口接待人員,你想詢問ECS的信息,要填寫相應的信息,讓他知道你想辦理什么業務,具體查詢哪台
3.點擊[DescribeInstances],可以看到具體這個方法的參數,接口說明大致看看就行,有涉及到再仔細看
[RegionId]要求傳入字符串,必須填寫,而[VpcId]就不要求必填。可以看不必填的大多是篩選項,用來過濾的。[VpcId]要是填寫了,它就只返回這個VPC下的ECS信息了,而不是全部的。具體要不要填寫,可以根據需求來,也可以根據返回值慢慢調整。
4.返回的是一個json字符串,里面包含一些信息,可以根據返回的結構來進行使用,后續會有詳細例子講解。
5.那這些參數填在哪?怎么使用呢?
一般用阿里雲在線調試平台進行在線調試,它會直接生成具體代碼腳本,拿過來就可以用。
左側搜索服務,然后填入方法名稱,中間類似填空一樣參照接口文檔填入相關信息,直接會生成代碼了。如果是一些查詢的方法,可以直接點擊'發起調用'來借用當前賬號的權限發起一次api請求,會清晰的返回參數有哪些。
像當前例子中的方法,填入必選的地區后,直接調用就可以返回參數了
對照這剛才的文檔中的返回數據,可以發現都是一一對應的,這樣方便調試
腳本
1.將生成的腳本給復制下來,是沒法執行的,因為要安裝相應的模塊才可以使用,core的是核心庫,其它產品看報錯會提示你具體安裝哪個包的
pip3 install aliyun-python-sdk-core
pip3 install aliyun-python-sdk-ecs
2.除了安裝模塊還要填入對應的as和ak才行,線上可以用是因為用的當前賬號臨時api權限套入的。登陸阿里雲,右上角生成ak並記錄下來。這里例子增加了指定單個ECS的id號,必須兩邊加方括號才行。
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest
client = AcsClient('<xxxxxxxxxx>', '<xxxxxxxxxx>', 'cn-beijing')
request = DescribeInstancesRequest()
request.set_accept_format('json')
request.set_InstanceIds("[\"i-2zexxxxxxxxxxxxxx\"]")
response = client.do_action_with_exception(request)
print(str(response, encoding='utf-8'))
3.執行腳本會返回如下一坨json,比線上的難看很多,所以還是看線上調試比較好
線上的如下,其實也可以將這個粘出來,然后放到很多[json在線解析]網站上面。點擊左側那個減號,可以看到是字典->字典->數組->字典這個結構。
比如我們要取出這個Memory內存的值,要先用json模塊給他變成字典格式,讓python可讀,然后根據位置來一層層拆開取到值,這期間可以慢慢調試
import json
#上面的所有代碼
res_dict = json.loads(response)
print(res_dict["Instances"]["Instance"][0]["Memory"])
最終取的值
三.例子
需求說明
需求:
修改某個ECS的實例名稱
步驟:
1.驗證實例ID變量所在的實例是否存在
2.根據配置的實例變量來查詢出現在的實例名稱
3.根據配置的實例名稱變量來設置實例名稱
4.驗證實例名稱是否是配置好的那個
用到的方法:
DescribeInstances 查詢ECS信息
ModifyInstanceAttribute 配置ECS信息
具體步驟
1.這里面有2步都需要驗證實例名稱,所以可以做成一個函數放便調用,先測試傳入一個不存在的ECSid號,會返回空列表,這就可以用if判斷了
代碼:
#!/usr/bin/python3
#權限
aliyun_user_ak = 'xxxxxx'
aliyun_user_sk = 'xxxxxxxxxx'
region_id = 'cn-beijing'
#填寫
ecs_id = "i-2zexxxxxxxxxxx"
#傳入實例id,不存在返回1,存在則返回實例名稱
def Get_EcsName(ecs_id):
import json
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest
client = AcsClient(ak=aliyun_user_ak, secret=aliyun_user_sk, region_id=region_id, timeout=300)
request = DescribeInstancesRequest()
request.set_accept_format('json')
request.set_InstanceIds("[\"%s\"]" %(ecs_id)) #這塊雖然傳入是字符串,但要符合結構
response = client.do_action_with_exception(request)
res_dict = json.loads(response)
if res_dict["Instances"]["Instance"]: #空列表返回False
return res_dict["Instances"]["Instance"][0]["InstanceName"] #先print返回
else:
return 1
if __name__ == "__main__":
Get_EcsName(ecs_id)
2.也是現在調試平台生成代碼,執行一下在ECS控制台看看是否改變,成功了就代碼復制下來改成函數。因為不管失敗和成功都只會返回一個請求id,所以要再次運行查看函數去效驗一下
代碼:
#!/usr/bin/python3
#權限
aliyun_user_ak = 'xxxxxxxxxx'
aliyun_user_sk = 'xxxxxxxxxxxxxxxx'
region_id = 'cn-beijing'
#填寫
ecs_id = "i-2ze8xxxxxxxxxxxxxxx"
ecs_name = "國電測試-支付"
#傳入實例id,不存在返回1,存在則返回實例名稱
def Get_EcsName(ecs_id):
import json
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest
client = AcsClient(ak=aliyun_user_ak, secret=aliyun_user_sk, region_id=region_id, timeout=300)
request = DescribeInstancesRequest()
request.set_accept_format('json')
request.set_InstanceIds("[\"%s\"]" %(ecs_id))
response = client.do_action_with_exception(request)
res_dict = json.loads(response)
if res_dict["Instances"]["Instance"]:
return (res_dict["Instances"]["Instance"][0]["InstanceName"])
else:
return 1
#修改實例名稱
def Modify_EcsName(ecs_name):
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkecs.request.v20140526.ModifyInstanceAttributeRequest import ModifyInstanceAttributeRequest
client = AcsClient(ak=aliyun_user_ak, secret=aliyun_user_sk, region_id=region_id, timeout=300)
request = ModifyInstanceAttributeRequest()
request.set_accept_format('json')
request.set_InstanceId("i-2ze8w32apojmvgunxily")
request.set_InstanceName(ecs_name)
response = client.do_action_with_exception(request)
if __name__ == "__main__":
if Get_EcsName(ecs_id) == 1:
print("傳入的ECS ID號不正確")
else:
Modify_EcsName(ecs_name)
if Get_EcsName(ecs_id) == ecs_name:
print("修改成功,實例" + ecs_id + "的最新實例名稱為" + ecs_name)
else:
print("修改失敗,請查看")
效果圖: