场景简介
当某一任务需对多个实例进行云助手操作命令,而且需查看在部分实例上由云助手发布的内容与已存在的内容是否会引起冲突,若无冲突则余下实例可以全部执行此任务。由上述内容可以通过Tag的方式查找需要操作的实例,并使用OOS云助手来实现自动化部署,设置分批执行来解决验证发布内容在部分实例的运行情况。
解决方案
任务分解:
1.通过tagKey-tagValue来查找需要操作的实例
2.设置执行的批次
3.循环批次内的实例执行云助手命令
4.执行所有批次
一、打开控制台,找到运维编排
![1566456218571_ceaae01e_41f9_46d4_8f30_c85f54ad5422 1566456218571_ceaae01e_41f9_46d4_8f30_c85f54ad5422]()
二、创建模版
根据以上的任务步骤来看可以把此任务创建成以下模版。点击创建模版
![1566456542256_2289028b_ba31_4c41_bbeb_2bee10a82659 1566456542256_2289028b_ba31_4c41_bbeb_2bee10a82659]()
或在公共模版中查找此模版ACS-ECS-BulkyRunCommandByTag![1566536064642_d038fbdd_ef91_447d_82f6_f6342ddf8712 1566536064642_d038fbdd_ef91_447d_82f6_f6342ddf8712]()
模版内容如下
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 }}'
三、创建执行
查找到此模版后,点击创建执行。
![1566535980697_2642b3cd_ac87_4dc0_bd53_cf432c97fe73 1566535980697_2642b3cd_ac87_4dc0_bd53_cf432c97fe73]()
四、选择分批执行方式,点击下一步:设置参数
根据实际需要选择分批执行的方式
1、自动并发
循环并发控制为自动并发时,不需要任务执行者来管理任务是否需要继续执行。系统会自动执行此任务下的所有批次。
![1566543705824_6096c330_1e4c_47eb_9208_d7303971468c 1566543705824_6096c330_1e4c_47eb_9208_d7303971468c]()
2、第一批暂停
循环并发控制为第一批暂停时,当把任务分为N个批次后,当第一个批次执行结束后,此时任务会进入暂停状态,等待执行者确认后继续执行,当第一次确认过后,剩下的所有批次无需再次确认是否需要继续执行,直接执行至此任务结束。(注:当使用第一批暂停时按下图设置)
![1566543604563_c9a7eed8_a59f_4e9d_a281_943b97f4471d 1566543604563_c9a7eed8_a59f_4e9d_a281_943b97f4471d]()
3、每批暂停
循环并发控制为每批暂停时,把任务分成N个批次后,每当一个批次的所有子任务执行结束后,都需要等待任务执行者确认后才能继续执行下一批次。(使用每批暂停时按下图选择)
![1566543772981_77d401f6_9492_47fe_b29e_66b495683d4b 1566543772981_77d401f6_9492_47fe_b29e_66b495683d4b]()
五、设置参数
如下图所示,根据实际的业务情况输入需要的参数。参数输入完毕后,点击下一步:确认创建![1566535882018_10e14fca_bde5_4cb9_8f6d_eafd96075a42 1566535882018_10e14fca_bde5_4cb9_8f6d_eafd96075a42]()
参数介绍:
commandContent:输入需要操作的部署命令,命令类型可以是shell、PowerShell、Bat
commandType:选择执行部署命令的类型
tagKey:Tag标签key
tagValue:Tag标签value
maxErrors:循环的最大错误数
batchNumber:设置分批执行的批次数
六、创建执行
参数确认完毕后,点击创建执行之后,此任务开始正式执行
![1566463382589_009a564c_8646_4b47_b14f_1bc30bb14757 1566463382589_009a564c_8646_4b47_b14f_1bc30bb14757]()
七、执行过程,执行暂停的恢复方法
1、当循环并发控制为自动并发时,无论此任务有多少批次,都不需要任务执行者来确认是否继续执行。会自动执行所有的批次。其过程如下所示。
![1566540227448_047a961e_88ab_4b2e_abf9_d94f4555ba44 1566540227448_047a961e_88ab_4b2e_abf9_d94f4555ba44]()
2、当循环并发控制为第一批暂停时,当第一批次执行结束后,任务进入等待中,需要任务执行者来确认是否继续执行此任务。若想继续执行,按下图操作,点击恢复,此时任务开始继续执行。余下所有批次无需确认恢复则可以全部执行至结束。
![1566539978568_972ad60f_3a52_4d60_b187_e982c21f9cf6 1566539978568_972ad60f_3a52_4d60_b187_e982c21f9cf6]()
3、当循环并发控制为每批暂停时,每当有一批次的子任务执行结束后,整个任务都会进入等待中,进而需要点击恢复来继续执行。如下图所示,当批次2运行结束后,没有经过确认恢复,批次3就无法执行。
![1566540679312_687c15da_a18b_43c8_b7af_5d1039971fc5 1566540679312_687c15da_a18b_43c8_b7af_5d1039971fc5]()
八、异常失败处理
当执行时,子任务可能由于某些原因导致执行失败,如下图所示,并点击下图所标位置,查看失败的任务详情。
![1566466024760_10385638_e221_410a_9eaf_3bd75c9cc376 1566466024760_10385638_e221_410a_9eaf_3bd75c9cc376]()
在失败详情页找到失败的子任务时,可以首先选择先重试,让此子任务重新执行,若重试执行后依然失败,可以选择继续重试,或者也可以选择跳过或取消放弃当前的子任务。
重试:在当前情况下重新执行失败的子任务
跳过:跳过此子任务
取消:取消当前子任务的执行
![1566541286693_a4b379e7_be05_4ccb_b460_40844e9294c4 1566541286693_a4b379e7_be05_4ccb_b460_40844e9294c4]()
如上图所示当前第一批次有失败的情况,分别对其进行了跳过和取消处理,其表现形式如下图所示。
![1566543132437_5fdfeeba_4fb9_48d0_9e0d_c99262655b18 1566543132437_5fdfeeba_4fb9_48d0_9e0d_c99262655b18]()
九、执行结果
根据上面的例子输入commandContent:date,此脚本为输出当前时间。如下所示,根据结果显示,当前脚本在每个实例上都执行了一遍。
![1566545152062_2d933e81_ebed_4994_8e25_8f945b87d534 1566545152062_2d933e81_ebed_4994_8e25_8f945b87d534]()
总结
由以上的任务可以发现,在含有多个子执行的任务中使用分批执行的模式,可以快速定位并重试失败任务的执行。使用分批执行的模式来执行云助手命令进行发布,方便了运维层次的操作,以及方便根据批次来验证发布内容的实际效果是否符合预期的效果或者发布内容是否存在问题,若不达标则可以进行余下批次的取消。
OOS客户支持钉钉群:23330931
OOS管理控制台的链接
OOS帮助文档的链接
系列文章
主题文章
阿里云重磅发布云上自动化利器——运维编排OOS
最佳实践
玩转运维编排服务的权限:Assume Role+Pass Role
场景系列
运维编排场景系列----更新ECS镜像
运维编排场景系列-----给ECS实例自动打TAG
运维编排场景系列----从实例中拷贝文件到OSS
运维编排场景系列----给实例加到SLS机器组
运维编排场景系列----检测MFA功能状态
阿里云运维编排新功能:一键批量克隆ECS
运维编排场景系列-----每日统计多Region实例的运行状态
运维编排场景系列-----如何使用jq
运维编排场景系列----分批到机器上运行命令