天天看點

雲助手指令支援自定義參數背景介紹控制台使用SDK使用相關API應用舉例總結

背景

雲助手

可以自動地、批量地執行日常維護指令。通過雲助手執行指令目前分為兩步,首先建立一個指令,然後執行指令,對于SDK使用者來講,首先調用

CreateCommand

API,然後調用

InvokeCommand

API。指令的執行腳本在建立指令階段設定,在執行指令階段在ECS執行個體中執行該腳本。

由于指令的執行内容在建立指令時已經固定,是以如果要執行不同的腳本,哪怕隻有細微的差別,都隻能建立多條指令,指令無法複用。同時,由于雲助手每個使用者最多持有100條指令,反複建立指令很容易達到這個限額,使用者需要先删除指令才能重新建立指令。

介紹

指令支援自定義參數功能可以有效緩解以上問題,指令可以一次建立,多種執行。建立指令時,在執行腳本中,為參數留出空間,在執行指令時,傳入自定義參數的值,即可組合成不同的腳本,使用上非常靈活。

在建立指令時,以某種格式辨別參數在腳本中的位置,具體來講,用“{{}}”對參數進行包裹,花括号内即為參數的名字。在執行指令時,傳入相應的參數值,即可産生一條新的指令。舉個例子,在建立指令時,腳本設定為

echo {{name}}           

在執行指令時,傳入參數鍵值對

{"name":"Jack"}           

則“Jack”會取代腳本中{{name}}的位置,形成新的腳本

echo Jack           

并在執行個體中執行。

通過這種方式,使用者可以通過合理的建立指令,傳入不同的參數值,進而複用執行腳本,指令的維護成本大幅降低。

控制台使用

  • 建立指令時,在指令内容部分輸入腳本,其中參數用“{{}}”标示,使用參數選擇“是”,其餘與建立一條普通雲助手指令沒有差別。
    雲助手指令支援自定義參數背景介紹控制台使用SDK使用相關API應用舉例總結
  • 執行這條指令,并填入自定義參數的值,如果不填入,會以空字元串代替該參數。
    雲助手指令支援自定義參數背景介紹控制台使用SDK使用相關API應用舉例總結
  • 以上例子的執行結果如下。
    雲助手指令支援自定義參數背景介紹控制台使用SDK使用相關API應用舉例總結

SDK使用

以Java SDK為例展示指令支援自定義參數的使用方法。

通過CreateCommand建立指令

DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");
    IAcsClient client = new DefaultAcsClient(profile);

CreateCommandRequest request = new CreateCommandRequest();
request.setEnableParameter(true);
//"echo {{name}}"的Base64編碼
request.setCommandContent("ZWNobyB7e25hbWV9fQ==");
request.setType("RunShellScript");
request.setName("test_enable_parameter");

try {
    CreateCommandResponse response = client.getAcsResponse(request);
    System.out.println(new Gson().toJson(response));
} catch (ServerException e) {
    e.printStackTrace();
} catch (ClientException e) {
    System.out.println("ErrCode:" + e.getErrCode());
    System.out.println("ErrMsg:" + e.getErrMsg());
    System.out.println("RequestId:" + e.getRequestId());
}           

傳回如下

{
    "RequestId": "AF0EF4C9-21F9-4106-8A10-F8942318BB4B",
    "CommandId": "c-9554c9c281be469b82a56ace39cd6360"
}           

再通過InvokeCommand執行該指令

DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");
IAcsClient client = new DefaultAcsClient(profile);

InvokeCommandRequest request = new InvokeCommandRequest();
request.setCommandId("c-9554c9c281be469b82a56ace39cd6360");
List<String> instanceIdList = new ArrayList<String>();
instanceIdList.add("i-xxxx");
request.setInstanceIds(instanceIdList);
Map parameters = new HashMap();
parameters.put("name", "Jack");
request.setParameters(parameters);

try {
    InvokeCommandResponse response = client.getAcsResponse(request);
    System.out.println(new Gson().toJson(response));
} catch (ServerException e) {
    e.printStackTrace();
} catch (ClientException e) {
    System.out.println("ErrCode:" + e.getErrCode());
    System.out.println("ErrMsg:" + e.getErrMsg());
    System.out.println("RequestId:" + e.getRequestId());
}           

通過以上步驟,在執行個體上執行的指令為

echo Jack           

執行後通過DescribeInvocationResults可以看到output為Jack。

相關API

雲助手指令支援自定義參數的對雲助手的API産生如下變更:

  • CreateCommand 請求參數
名稱 類型 是否必選 示例值 描述
CommandContent String ZWNobyAxMjM= 指令 Base64 編碼後的内容。當您傳入請求參數 Type 後,必須同時傳入該參數。該參數的值必須使用 Base64 編碼後傳輸,且腳本内容的大小在 Base64 編碼之後不能超過 16 KB。如果帶有參數,參數用{{}}包含的方式定義,參數個數為0~10個,參數名允許a-zA-Z0-9-_ 的組合,不允許出現其他符号,參數名最多支援64位元組。參數名不區分大小寫。在{{}}内參數名前後的空格,換行符将被忽略。
EnableParameter Boolean false 建立的指令是否攜帶自定義參數。預設值:false,表示不在指令中攜帶自定義參數。
  • InvokeCommand 請求參數
Parameters Map {"name":"Jack"} 執行指令時傳入的自定義參數的鍵值對。參數個數的取值範圍:0~10。Map的鍵不允許為空字元串,最多支援64個字元。Map的值允許為空字元串。與CommandContent組合完的指令在Base64編碼後,不能超過16KB。

Parameters的類型為Map,在此感謝POP同學的支援。原有SDK不支援傳遞Map,使用者需要自行将Map序列化為JSON字元串,傳遞參數為JSON字元串。POP支援傳入Map類型的參數後,使用者隻需要向Map傳遞鍵值對,序列化的工作交由SDK完成。現在已經支援該功能的SDK的語言有Java和Go,其他語言目前還隻能通過JSON字元串進行傳遞,将在六月初完全支援。

  • DescribeCommands 傳回參數
Commands 指令資料集類型(CommandSetType)
└ParameterNames List ["name","gender"] 通過CommandContent解析出的自定義參數名清單,以List的形式傳回。
└EnableParameter 該指令是否啟用自定義參數。
  • DescribeInvocations 傳回參數
Invocations 指令執行記錄集類(InvocationSetType)
└Parameters 以Json字元串的形式,傳回本次執行傳入的自定義參數。如果該指令禁用了自定義參數功能,則傳回空字元串。
└CommandContent ZWNobyBKYWNr(echo Jack的Base64形式) 傳回本次執行的腳本,如果啟用了自定義參數,則是添加了自定義參數後的腳本

應用舉例

當一個腳本中有一條指令需要進行檔案複制,啟用指令支援參數功能後,隻需建立一條指令。

cp {{option}} {{source_file}} {{dest_dir}}           

在執行指令時,傳入參數

{"source_file":"Main.java","dest_dir":"/home"}           

即可将Main.java複制到/home目錄下。

{"option":"-r","source_file":"/home/dir1","dest_dir":"/home/dir2"}           

即可進行目錄的拷貝。

而對于以上兩種場景,在不采用自定義參數功能時,需要進行兩次指令建立

cp Main.java /home           
cp -r /home/dir1/home/dir2           

指令管理成本很高,使用上很不靈活。

總結

雲助手指令支援自定義參數功能可以降低指令的管理成本,使用者可以建立更少的指令,更加靈活的執行指令。