ACS::Loop
动作用于循环执行一系列运维任务。您可以将一连串OOS支持的运维任务定义为循环体
语法
- Name: exampleTask
Action: 'ACS::Loop'
Properties:
LoopItems: # 循环数组,接受一个包含Item的List,遍历List得到的元素,将作为循环任务每次执行时的参数
- i-aaaaa
- 1-bbbbb
LoopRateControl:
MaxErrors: 0 # 可选,允许数值或百分比的定义方式,如10或10%,默认为0。
Mode: "Batch/Concurrency" # 必填,循环执行速率控制的模式,可选项为Concurrency或Batch;Concurrency表示并发执行,Batch表示分批执行。
Batch: [1, 2, 3] # 可选,该参数在Mode=Batch时生效,表示分批控制。定义方式参考下文批次的控制。
ConcurrencyInBatches: [1, 1, 1] #可选,该参数在Mode=Batch时生效,表示Batch模式下对每批次的并发度控制,默认20,定义方式为[]内填写每批对应的并发数。
Concurrency: 1 # 可选,该参数在Mode=Concurrency时生效,表示所有执行并发数控制,允许数值或百分比。默认为1。
BatchPauseOption: "FirstBatchPause/Automatic/EveryBatchPause" # 可选,该参数在Mode=Batch时生效,表示分批模式下,每批执行完成后暂停选项。可选项FirstBatchPause/Automatic/EveryBatchPause分别表示首批暂停,自动执行不暂停,每批暂停。
LoopTasks: # 任务数组,可以包括多个OOS支持的任务
- Name: deployRevisions
Action: ACS::CICD::DeployRevisionOnEcs
Properties:
regionId: 'cn-hangzhou'
instanceId: '{{ ACS::TaskLoopItem }}' # ACS::TaskLoopItem引用循环数组中每次遍历的元素
deployRevisionId: 'xxxx'
Outputs:
deployCommandOutput: # 自定义循环任务输出
Type: String
ValueSelector: '{{ deployRevisions.commandOutput }}' # 选取任务数组中某个任务的输出,最终deployCommandOutput输出的是一个数组,聚合每次循环的输出
循环数组
Items接受一个List,如一个直接的List:[item1, item2, item3]。
Items也可以是一个List类型的参数名,如上一个Task的List类型Outputs。
Items为一个List。
Loop: Items: [item1,item2,item3,item4] # 一个包含Item的List,如[i-id1,i-id2,i-id3,i-id4],Items迭代作为Loop所在Task执行的参数。
{ "Items": [ "item1", "item2", "item3", "item4" ] }
Items为一个List类型的参数名。
Items: '{{ParameterName1}}' # 一个可被解析为List类型的参数名,如describeInstance.InstanceIds;Items迭代作为Loop所在Task执行的参数。
{ "Items": "{{ParameterName1}}" }
任务执行速率
分两种模式:
并发数控制,保持这个并发数的执行速率,直到所有item执行结束。
批次控制,把item明确地分成多个批次,然后一个批次运行完再运行下一个批次,若上一个批次未全部完成的情况下,下一个批次不会开始。
并发数的控制(Concurrency)
如Items是10个item,并发是3,且会保持一直有3个item在并发,直到没有更多未执行的item。
Concurrency: 3 # 允许数值或百分比表并发控制,如3。 Mode: Concurrency
{ "Concurrency": 3, "Mode": "Concurrency" }
如Items是10个item,并发是20%,表示20%*10=2的并发,且会保持一直有2个item在并发,直到没有更多未执行的item。
Concurrency: 20% # 可选,允许数值或百分比的定义方式,如20%。 Mode: Concurrency
{ "Concurrency": "20%", "Mode": "Concurrency" }
批次的控制(Batch)
如Items是10个item,批次是[3],会将item分为大小为3的多个批次,结果为3,3,3,1,一共4个批次(假设item的执行结果都是成功)。
Batch: [1, 2, 3] # 可选,允许List内含数值或百分比的方式定义表批次控制,如[3]。 Mode: Batch
{ "Batch": [ 1, 2, 3 ], "Mode": "Batch" }
如Items是10个item,批次是[30%],表示第一个批次是3,会将item分为大小为10*30%=3的多个批次,结果为3,3,3,1,一共4个批次(假设item的执行结果都是成功):
Batch: [30%] # 可选,允许List内含数值或百分比的方式定义表批次控制,如[30%]。 Mode: Batch
{ "Batch": [ "30%" ], "Mode": "Batch" }
如Items是10个item,批次是[3,10%,30%],表示第一个批次是3,第二个批次是总量的10%,第三个及以后批次为[30%],结果为3,1,3,3一共4个批次(假设item的执行结果都是成功)
Mode: Batch Batch: [3, 10%,30%] # 可选,允许List内含多个数值或百分比的方式定义表批次控制,如[3, 10%,30%]。
{ "Mode": "Batch", "Batch": [ 3, "10%", "30%" ] }
错误控制MaxErrors
在Loop中,您也可以定义MaxErrors,其意义如下:
允许数值或百分比(表现为Items乘以百分比)的定义方式,如10,或10%。默认为0,即任何错误都会暴露到loop-task级别。
Loop里面的第一个Item,总会被执行。
是否能够执行到第二个Item或后续的Item取决于实际MaxErrors和ErrorCount的关系。
当实际ErrorCount>MaxErrors时,后续的Item停止执行,且当前Loop所在任务标记为失败。
当实际的ErrorCount<=MaxErrors时,则持续向下执行。
根据ErrorCount>MaxErrorsLoop判定Loop所在任务的执行状态,如果大于则是Failed,否则是Success。
数值方式定义。
MaxErrors: 2 # 可选,允许数值或百分比的定义方式,如2,表示允许最大ErrorCount为2。
{ "MaxErrors": 2 }
百分比方式定义。
MaxErrors: 25% # 可选,允许数值或百分比的定义方式,如25%,共4个Item则表示允许最大ErrorCount为25%*4=1。
{ "MaxErrors": "25%" }
任务输出Outputs
您可以自定义ACS::Loop任务的输出。在ValueSelector中,您可以选取LoopTasks内的任务的输出。最终的输出,会以数组的方式,聚合每次循环的任务输出。
比如上面语法部分的例子中,假设deployRevisions任务会返回"deployRevisions example output"。
那最终deployCommandOutput会输出:
["deployRevisions example output",
"deployRevisions example output"]
示例
FormatVersion: OOS-2019-06-01
Description: acsLoop示例模板
Tasks:
- Name: exampleTask
Action: ACS::Loop
Properties:
LoopItems:
- cn-hangzhou
- cn-qingdao
LoopTasks:
- Name: DescribeRegions
Action: ACS::ExecuteApi
Properties:
Parameters:
RegionId: '{{ ACS::TaskLoopItem }}'
Service: ecs
API: DescribeRegions
Outputs:
regions:
Type: String
ValueSelector: DescribeRegions.Regions.Region[]?.LocalName
Outputs:
outputRegions:
Type: List
Value: '{{ exampleTask.regions }}'