背景
雲助手可以自動地、批量地執行日常維護指令。通過雲助手執行指令目前分為兩步,首先建立一個指令,然後執行指令,對于SDK使用者來講,首先調用
CreateCommandAPI,然後調用
InvokeCommandAPI。指令的執行腳本在建立指令階段設定,在執行指令階段在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
指令管理成本很高,使用上很不靈活。
總結
雲助手指令支援自定義參數功能可以降低指令的管理成本,使用者可以建立更少的指令,更加靈活的執行指令。