运维编排场景系列----分批到机器上运行命令

场景简介

当某一任务需对多个实例进行云助手操作命令,而且需查看在部分实例上由云助手发布的内容与已存在的内容是否会引起冲突,若无冲突则余下实例可以全部执行此任务。由上述内容可以通过Tag的方式查找需要操作的实例,并使用OOS云助手来实现自动化部署,设置分批执行来解决验证发布内容在部分实例的运行情况。

解决方案

任务分解:
1.通过tagKey-tagValue来查找需要操作的实例
2.设置执行的批次
3.循环批次内的实例执行云助手命令
4.执行所有批次

一、打开控制台,找到运维编排
运维编排场景系列----分批到机器上运行命令

二、创建模版
根据以上的任务步骤来看可以把此任务创建成以下模版。点击创建模版
运维编排场景系列----分批到机器上运行命令

或在公共模版中查找此模版ACS-ECS-BulkyRunCommandByTag运维编排场景系列----分批到机器上运行命令

模版内容如下

FormatVersion: OOS-2019-06-01
Description: Run command on ECS instances by specifying tag.
Parameters:
  commandContent:
    Description: Command content to run in ECS instance.
    Type: String
  tagKey:
    Description: The tag key for query ECS instances.
    Type: String
    MinLength: 1
    MaxLength: 30
  tagValue:
    Description: The tag value for query ECS instances.
    Type: String
    MinLength: 1
    MaxLength: 30
  commandType:
    Description: The type of command.
    Type: String
    AllowedValues:
      - RunBatScript
      - RunPowerShellScript
      - RunShellScript
  batchNumber:
    Type: Number
    Description: The number of times of wholesale distribution.
    MinValue: 1
    MaxValue: 10
    Default: 5
  maxErrors:
    Description: The maximum number of errors allowed during task execution.
    Type: Number
    Default: 0
  OOSAssumeRole:
    Description: The RAM role to be assumed by OOS.
    Type: String
    Default: OOSServiceRole
RamRole: '{{ OOSAssumeRole }}'
Tasks:
  - Name: describeRunningInstancesByTag
    Action: 'ACS::ExecuteAPI'
    Description: Views the ECS instances by specifying tag.
    Properties:
      Service: ECS
      API: DescribeInstances
      Parameters:
        Status: Running
        Tags:
          - Key: '{{ tagKey }}'
            Value: '{{ tagValue }}'
    Outputs:
      instanceIds:
        Type: List
        ValueSelector: 'Instances.Instance[].InstanceId'
  - Name: runCommand
    Action: 'ACS::ECS::RunCommand'
    Description: Invokes ECS instance command.
    Properties:
      commandContent: '{{ commandContent }}'
      instanceId: '{{ ACS::TaskLoopItem }}'
      commandType: '{{ commandType }}'
    Loop:
      MaxErrors: '{{ maxErrors }}'
      Items: '{{ describeRunningInstancesByTag.instanceIds }}'
      Concurrency:
        'Fn::CalculateBatch':
          - '{{ batchNumber }}'
          - '{{ describeRunningInstancesByTag.instanceIds }}'
      Outputs:
        commandOutputs:
          AggregateType: 'Fn::ListJoin'
          AggregateField: commandOutput
    Outputs:
      commandOutput:
        Type: String
        ValueSelector: invocationOutput
Outputs:
  commandOutputs:
    Type: List
    Value: '{{ runCommand.commandOutputs }}'

、创建执行
查找到此模版后,点击创建执行
运维编排场景系列----分批到机器上运行命令

四、选择分批执行方式,点击下一步:设置参数
根据实际需要选择分批执行的方式
1、自动并发
循环并发控制为自动并发时,不需要任务执行者来管理任务是否需要继续执行。系统会自动执行此任务下的所有批次。
运维编排场景系列----分批到机器上运行命令

2、第一批暂停
循环并发控制为第一批暂停时,当把任务分为N个批次后,当第一个批次执行结束后,此时任务会进入暂停状态,等待执行者确认后继续执行,当第一次确认过后,剩下的所有批次无需再次确认是否需要继续执行,直接执行至此任务结束。(:当使用第一批暂停时按下图设置)
运维编排场景系列----分批到机器上运行命令

3、每批暂停
循环并发控制为每批暂停时,把任务分成N个批次后,每当一个批次的所有子任务执行结束后,都需要等待任务执行者确认后才能继续执行下一批次。(使用每批暂停时按下图选择)
运维编排场景系列----分批到机器上运行命令

五、设置参数
如下图所示,根据实际的业务情况输入需要的参数。参数输入完毕后,点击下一步:确认创建运维编排场景系列----分批到机器上运行命令

参数介绍:
commandContent:输入需要操作的部署命令,命令类型可以是shell、PowerShell、Bat
commandType:选择执行部署命令的类型
tagKey:Tag标签key
tagValue:Tag标签value
maxErrors:循环的最大错误数
batchNumber:设置分批执行的批次数

六、创建执行
参数确认完毕后,点击创建执行之后,此任务开始正式执行
运维编排场景系列----分批到机器上运行命令

七、执行过程,执行暂停的恢复方法
1、循环并发控制自动并发时,无论此任务有多少批次,都不需要任务执行者来确认是否继续执行。会自动执行所有的批次。其过程如下所示。
运维编排场景系列----分批到机器上运行命令



2、循环并发控制第一批暂停时,当第一批次执行结束后,任务进入等待中,需要任务执行者来确认是否继续执行此任务。若想继续执行,按下图操作,点击恢复,此时任务开始继续执行。余下所有批次无需确认恢复则可以全部执行至结束。
运维编排场景系列----分批到机器上运行命令



3、循环并发控制每批暂停时,每当有一批次的子任务执行结束后,整个任务都会进入等待中,进而需要点击恢复来继续执行。如下图所示,当批次2运行结束后,没有经过确认恢复,批次3就无法执行。
运维编排场景系列----分批到机器上运行命令

八、异常失败处理
当执行时,子任务可能由于某些原因导致执行失败,如下图所示,并点击下图所标位置,查看失败的任务详情。
运维编排场景系列----分批到机器上运行命令

在失败详情页找到失败的子任务时,可以首先选择先重试,让此子任务重新执行,若重试执行后依然失败,可以选择继续重试,或者也可以选择跳过取消放弃当前的子任务。


重试:在当前情况下重新执行失败的子任务
跳过:跳过此子任务
取消:取消当前子任务的执行

运维编排场景系列----分批到机器上运行命令

如上图所示当前第一批次有失败的情况,分别对其进行了跳过和取消处理,其表现形式如下图所示。
运维编排场景系列----分批到机器上运行命令

九、执行结果
根据上面的例子输入commandContent:date,此脚本为输出当前时间。如下所示,根据结果显示,当前脚本在每个实例上都执行了一遍。
运维编排场景系列----分批到机器上运行命令

总结

由以上的任务可以发现,在含有多个子执行的任务中使用分批执行的模式,可以快速定位并重试失败任务的执行。使用分批执行的模式来执行云助手命令进行发布,方便了运维层次的操作,以及方便根据批次来验证发布内容的实际效果是否符合预期的效果或者发布内容是否存在问题,若不达标则可以进行余下批次的取消。

欢迎使用OOS

OOS客户支持钉钉群:23330931
OOS管理控制台的链接
OOS帮助文档的链接


系列文章

主题文章

阿里云重磅发布云上自动化利器——运维编排OOS

最佳实践

玩转运维编排服务的权限:Assume Role+Pass Role

场景系列

运维编排场景系列----更新ECS镜像
运维编排场景系列-----给ECS实例自动打TAG
运维编排场景系列----从实例中拷贝文件到OSS
运维编排场景系列----给实例加到SLS机器组
运维编排场景系列----检测MFA功能状态
阿里云运维编排新功能:一键批量克隆ECS
运维编排场景系列-----每日统计多Region实例的运行状态
运维编排场景系列-----如何使用jq
运维编排场景系列----分批到机器上运行命令

上一篇:阿里云应用质量管理沙龙 . 北京站


下一篇:EMAS远程日志 - 移动端问题排查利器