循环ACS::Loop

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类型的参数名,如上一个TaskList类型Outputs。

  • Items为一个List。 

    Loop:
      Items: [item1,item2,item3,item4] # 一个包含ItemList,如[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}}"
    }		

任务执行速率

分两种模式:

  1. 并发数控制,保持这个并发数的执行速率,直到所有item执行结束。

  2. 批次控制,把item明确地分成多个批次,然后一个批次运行完再运行下一个批次,若上一个批次未全部完成的情况下,下一个批次不会开始。

并发数的控制(Concurrency)

  • Items10item,并发是3,且会保持一直有3item在并发,直到没有更多未执行的item。 

    Concurrency: 3 # 允许数值或百分比表并发控制,如3。
    Mode: Concurrency
    {
      "Concurrency": 3,
      "Mode": "Concurrency"
    }
  • Items10item,并发是20%,表示20%*10=2的并发,且会保持一直有2item在并发,直到没有更多未执行的item。

    Concurrency: 20% # 可选,允许数值或百分比的定义方式,如20%。
    Mode: Concurrency
    {
      "Concurrency": "20%",
      "Mode": "Concurrency"
    }

批次的控制(Batch)

  • Items10item,批次是[3],会将item分为大小为3的多个批次,结果为3,3,3,1,一共4个批次(假设item的执行结果都是成功)。 

    Batch: [1, 2, 3] # 可选,允许List内含数值或百分比的方式定义表批次控制,如[3]。
    Mode: Batch
    {
      "Batch": [
        1,
        2,
        3
      ],
      "Mode": "Batch"
    }
  • Items10item,批次是[30%],表示第一个批次是3,会将item分为大小为10*30%=3的多个批次,结果为3,3,3,1,一共4个批次(假设item的执行结果都是成功):

    Batch: [30%] # 可选,允许List内含数值或百分比的方式定义表批次控制,如[30%]。
    Mode: Batch
    					
    {
      "Batch": [
        "30%"
      ],
      "Mode": "Batch"
    }
  • Items10item,批次是[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,其意义如下:

  1. 允许数值或百分比(表现为Items乘以百分比)的定义方式,如10,或10%。默认为0,即任何错误都会暴露到loop-task级别。

  2. Loop里面的第一个Item,总会被执行。

  3. 是否能够执行到第二个Item或后续的Item取决于实际MaxErrorsErrorCount的关系。 

    • 当实际ErrorCount>MaxErrors时,后续的Item停止执行,且当前Loop所在任务标记为失败。

    • 当实际的ErrorCount<=MaxErrors时,则持续向下执行。

  4. 根据ErrorCount>MaxErrorsLoop判定Loop所在任务的执行状态,如果大于则是Failed,否则是Success。

  • 数值方式定义。

    MaxErrors: 2 # 可选,允许数值或百分比的定义方式,如2,表示允许最大ErrorCount2。
    {
     "MaxErrors": 2 
    }
  • 百分比方式定义。 

    MaxErrors:  25% # 可选,允许数值或百分比的定义方式,如25%,共4Item则表示允许最大ErrorCount25%*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 }}'