跨账号跨地域实例操作系统补丁修复

背景

对于规模比较大的企业,不同部门的ECS实例可能会分布在多个账号中。多个账号中ECS实例的补丁的集中管理成为摆在企业资产管理者面前的重要问题。本文将介绍如何通过补丁管理功能跨账号跨地域的集中修复ECS实例操作系统补丁。

实现原理

在跨账号补丁修复的场景中,阿里云账号分为两个角色。

  1. 管理账号

  2. 资源账号

其中资源账号可以有一个或者多个,管理账号本身也可以是一个资源账号。

通过在所有资源账号下创建管理账号可以扮演的RAM角色的方式,授权补丁修复所需要的相关权限。从而可以达到在管理账号内跨账号跨地域集中修复补丁的效果。

execution.drawio.svg

前置条件

如果需要设置自定义的补丁基线,可以通过 ALIYUN::OOS::PatchBaseline 或者 Terraform 统一管理所有资源账号下的自定义补丁基线。

操作步骤

在资源账号中创建RAM角色

需要在所有资源账号中都创建用于补丁管理的RAM角色,并授权管理账号扮演。步骤如下:

  1. 登录系统运维管理 OOS(CloudOps Orchestration Service)控制台

  2. 单击选择自动化任务>公共任务模板,选择 创建角色并授予自定义权限策略image

  3. 单击 创建执行

  4. 单击下一步: 设置参数image

  5. 新建角色名称。可自定义角色名称,例如 PatchRole。image

  6. 角色信任的云账号。填写管理账号的阿里云ID,默认 {{ ACS::AccountId }} 是授权给本账号。

  7. 新建并授予的自定义权限策略名称。可自定义权限策略名称,例如 PatchPolicy。

  8. 授权的自定义权限策略脚本。复制下方代码填入。

    {
      "Version": "1",
      "Statement": [
        {
          "Action": [
            "ecs:DescribeInvocationResults",
            "ecs:DescribeInstances",
            "ecs:RunCommand",
            "ecs:RebootInstance",
            "ecs:DescribeCloudAssistantStatus",
            "ecs:DescribeInvocations"
          ],
          "Resource": "*",
          "Effect": "Allow"
        },
        {
          "Action": [
            "oos:ListInstancePatchStates"
          ],
          "Resource": "*",
          "Effect": "Allow"
        }
      ]
    }
  9. 单击确定,单击创建执行,等待执行完成。

补丁修复

  1. 登录系统运维管理 OOS(CloudOps Orchestration Service)控制台

  2. 使用附录中的模板创建跨账号执行模板来跨账号跨地域补丁修复。Screenshot 2023-05-30 at 17.17.51.png

  3. 执行模板。

  4. accountRoleAndRegions。分别在资源账号下上海和北京地域运行补丁修复操作。

    [
      {
        "OOSAssumeRole": "|${资源账号uid}/PatchRole",  
        "RegionId": "cn-shanghai"
      },
      {
        "OOSAssumeRole": "|${资源账号uid}/PatchRole",
        "RegionId": "cn-beijing"
      }
    ]
  5. templateName。选择ACS-ECS-BulkyApplyPatchBaseline

  6. templateParameters。模板参数参考《立即修复》,可以如下设置。Screenshot 2023-05-30 at 19.18.53.png

    {
      "regionId": "{{ regionId }}",
      "targets": {
        "Type": "All",
        "RegionId": "{{ regionId }}",
        "Parameters": {
          "RegionId": "{{ regionId }}",
          "Status": "Running"
        }
      },
      "action": "install",
      "rebootIfNeed": true,
      "rateControl": {
        "Mode": "Concurrency",
        "MaxErrors": 0,
        "Concurrency": 10
      },
      "OOSAssumeRole": "",
      "timeout": 86400
    }
  7. 单击 确定,单击 创建执行

  8. 创建执行成功后,您可单击该执行的详情,查看执行日志,实时了解执行的进度和状态。

附录

跨账号跨地域执行模板:

FormatVersion: OOS-2019-06-01
Description:
  en: Multi account to execute specified template
  zh-cn: 跨账号执行指定模板
  name-en: MultiAccountToExecuteTemplate
  name-zh-cn: 跨账号执行指定模板
Parameters:
  accountRoleAndRegions:
    Type: Json
  templateName:
    Type: String
    AssociationProperty: TemplateName
  templateParameters:
    Description:
      en: Template paremeters to execute with.
      zh-cn: 触发执行模板的参数。
    Type: Json
    AssociationProperty: TemplateParameter
    AssociationPropertyMetadata:
      TemplateName: $templateName
  rateControl:
    Description:
      en: Concurrency ratio of task execution.
      zh-cn: 任务执行的并发比率。
    Type: Json
    AssociationProperty: RateControl
    Default:
      Mode: Concurrency
      MaxErrors: 0
      Concurrency: 10
  OOSAssumeRole:
    Description:
      en: The RAM role to be assumed by OOS.
      zh-cn: OOS扮演的RAM角色。
    Type: String
    Default: OOSServiceRole
RamRole: '{{ OOSAssumeRole }}'
Tasks:
  - Name: executeTemplate
    Action: 'ACS::Template'
    Description:
      en: Execute template.
      zh-cn: 执行模板。
    Properties:
      TemplateName: '{{ templateName }}'
      Parameters:
        'Fn::MergeMap':
          - '{{ templateParameters }}'
          - regionId:
              'Fn::Select':
                - RegionId
                - '{{ACS::TaskLoopItem}}'
          - OOSAssumeRole:
              'Fn::Select':
                - OOSAssumeRole
                - '{{ACS::TaskLoopItem}}'
    Loop:
      RateControl: '{{ rateControl }}'
      Items: '{{ accountRoleAndRegions }}'