OOS任务通过钉钉审批使用

在自动化运维的一些场景中,有些特殊的操作需要被特殊关注,例如删除重要资源,或使用费用较高的实例等。如果把这些操作也纳入自动化的范畴,您可能会担心失去控制,带来风险。若不纳入自动化的范畴,又会导致这些操作退化到手工执行或其他非自动化方式。而审批步骤刚好能够让您在自动化和特殊关注之间寻找一个平衡。

前提条件

已创建用于接收告警通知的钉钉群并获取钉钉机器人Webhook地址。请参见获取钉钉机器人Webhook地址

解决方案

系统运维管理 OOS(CloudOps Orchestration Service)中,当被执行模板中包括审批动作,且执行到审批动作所在任务时,OOS执行引擎会暂停执行,执行进入等待中状态,并发送一个包含通知的审批链接到管理员用户。当管理员单击审批链接后,可根据业务需求做出审批决定,同意或拒绝,同意后则OOS引擎继续执行后续任务,拒绝后引擎停止执行,执行状态转为已取消(Cancelled)。

操作步骤

  1. 登录系统运维管理控制台。

  2. 自动化任务 > 自定义任务模板中,单击创建模板,单击下一步image

  3. 单击YAML,将附录1:模板内容粘贴到空白编辑栏,单击创建模板,填写模板名称,单击完成创建image

  4. 自动化任务 > 自定义任务模板中,找到刚创建成功的模板,单击创建执行

  5. 单击下一步:设置参数

  6. 输入以下的参数。

    • targets:必填,将重启的实例范围。

    • webHookUrl:必填,审批通知及链接将发送到的钉钉群助手WebHook。获取方法可参考附录2:钉钉WebHook获取

    • rateControl:选填,并发速率控制。

    • atMobiles:选填,发送审批通知时,在钉钉群中@的指定的用户。

    • atAll:选填,发送审批通知时,是否@钉钉群中的所有成员。

    • OOSAssumeRole:选填。OOS默认使用当前登录用户的权限执行动作;如果指定了RAM角色名称,OOS扮演该RAM角色执行动作。 image

  7. 单击下一步:确定,单击创建执行

  8. 自动化任务 > 任务执行管理中可查看刚刚创建的执行,若创建执行成功,被指定的手机号的用户,在钉钉群中会被@,且当前执行状态处于等待中,用户可以单击审批链接,根据需要作出审批决定。

附录1:模板(审批ECS实例重启)

  • 模板任务逻辑:

    1. 捕捉所选实例信息。

    2. 下发对实例重启的审批通知及链接。

    3. 如审批通过,对所选实例进行重启。

  • 模板内容(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 }}'