在自动化运维的一些场景中,有些特殊的操作需要被特殊关注,例如删除重要资源,或使用费用较高的实例等。如果把这些操作也纳入自动化的范畴,您可能会担心失去控制,带来风险。若不纳入自动化的范畴,又会导致这些操作退化到手工执行或其他非自动化方式。而审批步骤刚好能够让您在自动化和特殊关注之间寻找一个平衡。
前提条件
已创建用于接收告警通知的钉钉群并获取钉钉机器人Webhook地址。请参见获取钉钉机器人Webhook地址。
解决方案
在系统运维管理 OOS(CloudOps Orchestration Service)中,当被执行模板中包括审批动作,且执行到审批动作所在任务时,OOS执行引擎会暂停执行,执行进入等待中状态,并发送一个包含通知的审批链接到管理员用户。当管理员单击审批链接后,可根据业务需求做出审批决定,同意或拒绝,同意后则OOS引擎继续执行后续任务,拒绝后引擎停止执行,执行状态转为已取消(Cancelled)。
操作步骤
登录系统运维管理控制台。
在
中,单击创建模板,单击下一步。单击YAML,将附录1:模板内容粘贴到空白编辑栏,单击创建模板,填写模板名称,单击完成创建。
在
中,找到刚创建成功的模板,单击创建执行。单击下一步:设置参数。
输入以下的参数。
targets:必填,将重启的实例范围。
webHookUrl:必填,审批通知及链接将发送到的钉钉群助手WebHook。获取方法可参考附录2:钉钉WebHook获取。
rateControl:选填,并发速率控制。
atMobiles:选填,发送审批通知时,在钉钉群中@的指定的用户。
atAll:选填,发送审批通知时,是否@钉钉群中的所有成员。
OOSAssumeRole:选填。OOS默认使用当前登录用户的权限执行动作;如果指定了RAM角色名称,OOS扮演该RAM角色执行动作。
单击下一步:确定,单击创建执行。
在
中可查看刚刚创建的执行,若创建执行成功,被指定的手机号的用户,在钉钉群中会被@,且当前执行状态处于等待中,用户可以单击审批链接,根据需要作出审批决定。
附录1:模板(审批ECS实例重启)
模板任务逻辑:
捕捉所选实例信息。
下发对实例重启的审批通知及链接。
如审批通过,对所选实例进行重启。
模板内容(YAML)
FormatVersion: OOS-2019-06-01 Description: en: Bulky restarts the ECS instances with Approval. zh-cn: 批量重启ECS实例带审批。 name-en: BulkyRebootInstancesWithApproval name-zh-cn: 批量重启ECS实例带审批 Parameters: targets: Type: Json AssociationProperty: Targets AssociationPropertyMetadata: ResourceType: 'ALIYUN::ECS::Instance' rateControl: Description: en: Concurrency ratio of task execution. zh-cn: 任务执行的并发比率。 Type: Json AssociationProperty: RateControl Default: Mode: Concurrency MaxErrors: 0 Concurrency: 100% webHookUrl: Description: en: >- The webHook url of dingtalk group assistant, e.g.https://oapi.dingtalk.com/robot/send?access_token=1234zxcvaksdq31414. zh-cn: >- 钉钉群助手的webhook地址,形如https://oapi.dingtalk.com/robot/send?access_token=1234zxcvaksdq31414。 Type: String atMobiles: Description: en: >- The telephone numbers of member in dingtalk group assistant @, when notify comes. zh-cn: 当群助手向钉钉群中发送审批通知时,要被@的群成员注册钉钉所用手机号。 Type: List Default: - '1390000****' atAll: Description: en: 'assistant @ all members in dingtalk group or not, when notify comes.' zh-cn: 当群助手向钉钉群中发送审批通知时是否@所有人。 Type: String Default: 'false' OOSAssumeRole: Description: en: The RAM role to be assumed by OOS. zh-cn: OOS扮演的RAM角色。 Type: String Default: OOSServiceRole RamRole: '{{ OOSAssumeRole }}' Tasks: - Name: getInstance Description: en: Views the ECS instances. zh-cn: 获取ECS实例。 Action: 'ACS::SelectTargets' Properties: ResourceType: 'ALIYUN::ECS::Instance' Filters: - '{{ targets }}' Outputs: instanceIds: Type: List ValueSelector: 'Instances.Instance[].InstanceId' instanceNames: Type: List ValueSelector: 'Instances.Instance[].InstanceName' - Name: approveRestart Action: 'ACS::Approve' Properties: NotifyType: WebHook WebHook: URI: '{{webhookUrl}}' Headers: Content-Type: application/json Content: msgtype: text text: content: >- Notify: please approve instances restart, instance names to approve are {{getInstance.instanceNames}}, sent by {{ACS::RegionId}} oos {{ACS::ExecutionId}}. at: atMobiles: '{{atMobiles}}' isAtAll: '{{atAll}}' - Name: rebootInstance Action: 'ACS::ECS::RebootInstance' Description: en: Restarts the ECS instances. zh-cn: 重启实例。 Properties: instanceId: '{{ ACS::TaskLoopItem }}' Loop: RateControl: '{{ rateControl }}' Items: '{{ getInstance.instanceIds }}' Outputs: instanceIds: Type: List Value: '{{ getInstance.instanceIds }}'