背景
对于规模比较大的企业,不同部门的ECS实例可能会分布在多个账号中。多个账号中ECS实例的补丁的集中管理成为摆在企业资产管理者面前的重要问题。本文将介绍如何通过补丁管理功能跨账号跨地域的集中修复ECS实例操作系统补丁。
实现原理
在跨账号补丁修复的场景中,阿里云账号分为两个角色。
管理账号
资源账号
其中资源账号可以有一个或者多个,管理账号本身也可以是一个资源账号。
通过在所有资源账号下创建管理账号可以扮演的RAM角色的方式,授权补丁修复所需要的相关权限。从而可以达到在管理账号内跨账号跨地域集中修复补丁的效果。

前置条件
如果需要设置自定义的补丁基线,可以通过 ALIYUN::OOS::PatchBaseline 或者 Terraform 统一管理所有资源账号下的自定义补丁基线。
操作步骤
在资源账号中创建RAM角色
需要在所有资源账号中都创建用于补丁管理的RAM角色,并授权管理账号扮演。步骤如下:
单击选择自动化任务>公共任务模板,选择 创建角色并授予自定义权限策略。

单击 创建执行。
单击下一步: 设置参数。

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

角色信任的云账号。填写管理账号的阿里云ID,默认 {{ ACS::AccountId }} 是授权给本账号。
新建并授予的自定义权限策略名称。可自定义权限策略名称,例如 PatchPolicy。
授权的自定义权限策略脚本。复制下方代码填入。
{ "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" } ] }单击确定,单击创建执行,等待执行完成。
补丁修复
使用附录中的模板创建跨账号执行模板来跨账号跨地域补丁修复。

执行模板。
accountRoleAndRegions。分别在资源账号下上海和北京地域运行补丁修复操作。
[ { "OOSAssumeRole": "|${资源账号uid}/PatchRole", "RegionId": "cn-shanghai" }, { "OOSAssumeRole": "|${资源账号uid}/PatchRole", "RegionId": "cn-beijing" } ]templateName。选择ACS-ECS-BulkyApplyPatchBaseline。
templateParameters。模板参数参考《立即修复》,可以如下设置。

{ "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 }单击 确定,单击 创建执行。
创建执行成功后,您可单击该执行的详情,查看执行日志,实时了解执行的进度和状态。
附录
跨账号跨地域执行模板:
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 }}'