创建修补作业

您可以使用 OS Patch Management 将操作系统补丁程序应用于一组虚拟机实例。

如需将补丁程序应用于您的虚拟机,请完成以下步骤:

  1. 设置虚拟机
  2. 运行修补作业

准备工作

支持的操作系统

  • Debian 9
  • Ubuntu 16.04 和 18.04
  • CentOS 6、7 和 8
  • Red Hat Enterprise Linux (RHEL) 6、7 和 8
  • Windows Server 2012R2、2016、2019 及半年版本 1803 和 1809
  • SUSE Enterprise Linux Server (SLES) 12 和 15、openSUSE Leap 15

设置虚拟机

如需使用 OS Patch Management 服务,请完成以下步骤:

  1. 对于所有虚拟机,请设置 OS Config Service API 并安装 OS Config 代理。如需了解详细说明,请参阅设置 OS Config
  2. 对于 Windows 虚拟机,Google 建议在虚拟机上停用自动更新。这样可以减少 Windows 自动更新与 OS Patch Management 服务之间的冲突。

权限

项目的所有者拥有运行和管理修补作业的完整访问权限。 对于所有其他用户,您需要为其授予权限。您可以授予以下其中一种精细角色:

  • roles/osconfig.patchJobExecutor:包含运行、取消、获取和列出修补作业的权限。该角色还包含查看修补作业对应实例的详情的权限。
  • roles/osconfig.patchJobViewer:包含获取和列出修补作业的只读权限。该角色还包含查看修补作业对应实例的详情的权限。

例如,如需向用户授予运行修补作业的权限,请使用以下命令:

gcloud projects add-iam-policy-binding project-id \
    --member user:user-id@gmail.com \
    --role roles/osconfig.patchJobExecutor

替换以下内容:

  • project-id:项目 ID。
  • user-id:用户的 G Suite 用户名。

运行修补作业

您可以使用 Google Cloud Consolegcloud 命令行工具Cloud OS Config API 运行修补作业。

当您运行修补作业时,通过实例过滤条件指定的所有实例上会同时开始修补虚拟机。

启动修补作业后,您可以使用 OS Patch Management 信息中心监控补丁程序。在修补作业开始约 30 分钟之后,数据会填充到信息中心内。

控制台

  1. 在 Google Cloud Console 中,转到 OS Patch Management 页面。

    转到 OS Patch Management 页面

  2. 点击新建补丁程序部署
  3. 目标虚拟机部分,选择包含要修补的虚拟机的地区。您还可以选择所有地区。

    选择地区后,您可以进一步过滤该地区内的虚拟机。

    例如,如需为位于 asia-east1-casia-east2-b 并且具有以下过滤条件的虚拟机运行修补作业:

    • 名称前缀:test-
    • 标签:env=devapp=web

    您选择的内容将类似于以下内容:

    显示实例过滤条件的 OS Patch Management 页面。

  4. 补丁程序配置部分,配置补丁程序。

    1. 为您的补丁程序指定名称
    2. 为您的操作系统选择所需的更新。如需了解详情,请参阅补丁程序配置
  5. 时间安排部分,完成以下操作:

    • 选择时间表。如需立即运行修补作业,请选择立即开始
    • (可选)设置考量时长或维护期
  6. 补丁程序发布选项 (Patch rollout options) 部分,配置发布选项

    • 选择一次修补一个地区,还是同时修补多个地区。
    • 设置中断预算。中断预算是您希望修补过程一次中断某个地区的虚拟机数量或百分比。
  7. (可选)在高级选项部分,您可以完成以下任务:

  8. 点击部署

gcloud

使用 os-config patch-jobs execute 命令运行修补作业。请将 instance-filter 替换为所需的实例过滤条件。如需详细了解实例过滤条件,请参阅实例过滤条件

gcloud compute os-config patch-jobs execute instance-filter

如需详细了解所应用的更新,请参阅操作系统修补作业包含哪些内容。如需自定义您的更新,请使用可选标志

示例

示例 1 要运行配置如下的修补作业:

  • 实例名称:instance-1
  • 地区:us-east1-b
  • 说明:patch for instance-1

    您需要运行以下命令:

gcloud compute os-config patch-jobs execute \
    --instance-filter-names="zones/us-east1-b/instances/instance-1" \
    --description "patch for instance-1"

示例 2 假设您希望以异步方式运行配置如下的修补作业:

  • 修补作业必须在项目中的所有实例上运行。
  • 修补作业必须在 1 小时 30 分钟后超时并停止。
  • 安装更新后,机器必须根据系统设置重新启动。
  • 在运行 Apt 的虚拟机上,使用 apt dist-upgrade 进行修补。
  • 在运行 Windows 的虚拟机上,仅为 KB4339284 更新应用补丁程序。
  • 在运行 Yum 的虚拟机上,使用 yum update-minimal --security 实用程序进行修补。

您需要运行以下命令:

gcloud compute os-config patch-jobs execute \
    --instance-filter-all \
    --duration="1h30m" --reboot-config="DEFAULT" \
    --apt-dist --windows-exclusive-patches=KB4339284 \
    --yum-minimal --yum-security \
    --async

API

在 API 中,创建运行新修补作业的 POST 请求。 您必须按照 patchJobs.execute API 文档中的说明明确定义所有必需的配置字段。

如需详细了解所应用的更新,请参阅操作系统修补作业包含哪些内容。 如需自定义更新,请使用 PatchConfig 参数

例如,仅使用必填字段的修补作业如下所示。

POST https://osconfig.googleapis.com/v1/projects/project-id/patchJobs:execute

{
  "instanceFilter": instance-filter
}

替换以下内容:

  • project-id:您的项目 ID。
  • instance-filter:所需的过滤条件参数。如需详细了解实例过滤条件,请参阅实例过滤条件

示例

示例 1 假设您要对位于 us-east1-binstance1 实例运行修补作业。在此示例中,我们添加了描述并指定作业运行 1 小时 30 分钟。 将 project-id 替换为您的项目 ID。

POST https://osconfig.googleapis.com/v1/projects/project-id/patchJobs:execute

{
  "description":"patch instance1 in us-east1-b",
  "duration":"5400s",
  "instanceFilter":{
    "instances":[
      "zones/us-east1-b/instances/instance1"
    ]
  }
}

示例 2 以下修补作业选择具有如下配置的虚拟机:

  • 具有 env=devapp=web 标签。
  • 位于 asia-east1-basia-east1-c
  • 具有 test- 前缀。

在以下命令中,请将 project-id 替换为您的项目 ID。

POST https://osconfig.googleapis.com/v1/projects/project-id/patchJobs:execute

{
  "instanceFilter":{
    "groupLabels":[
      {
        "labels":{
          "env":"dev",
          "app":"web"
        }
      }
    ],
    "instanceNamePrefixes":[
      "test-"
    ],
    "zones":[
      "asia-east1-b",
      "asia-east1-c"
    ]
  }
}

示例 3

假设您要运行配置如下的修补作业:

  • 修补作业必须在项目中的所有实例上运行。
  • 修补作业必须在 1 小时 30 分钟后超时并停止。API 要求以秒为单位表示时间,因此请将此时间设置为 5400s。
  • 安装更新后,机器必须根据系统设置重新启动。
  • 在运行 Apt 的虚拟机上,使用 apt dist-upgrade 进行修补。
  • 在运行 Windows 的虚拟机上,仅为 KB4339284 更新应用补丁程序。
  • 在运行 Yum 的虚拟机上,使用 yum update-minimal --security 实用程序进行修补。

您需要创建以下请求:

在以下命令中,请将 project-id 替换为您的项目 ID。

POST https://osconfig.googleapis.com/v1/projects/project-id/patchJobs:execute

{
 "duration":"5400s",
 "instanceFilter":{
   "all":true
 },
 "patchConfig":{
   "rebootConfig":"DEFAULT",
   "apt":{
     "type":"DIST"
   },
   "yum":{
     "security":true,
     "minimal":true
   },
   "windowsUpdate":{
     "exclusivePatches":"KB4339284"
   }
 }
}

实例过滤条件

您可以使用过滤条件指定要包含在修补作业中的实例。修补作业支持以下过滤条件:

  • 按名称过滤:限制修补作业仅修补具有特定名称的实例。 您必须使用完整 URI 指定实例名称。支持的 URI 格式如下:

    • zones/zone/instances/instance-name
    • projects/project-id/zones/zone/instances/instance-name
    • https://www.googleapis.com/compute/v1/projects/project-id/zones/zone/instances/instance-name
  • 按名称前缀过滤:限制修补作业仅修补名称中包含特定前缀的实例。

  • 按地区过滤:限制修补作业仅修补特定地区中的实例。

  • 按标签过滤:限制修补作业仅修补具有特定标签的实例。

您还可以对项目中的所有实例运行修补作业,方法是将 instanceFilter 中的 all 字段设置为 true。如需了解详情,请参阅实例过滤条件示例

实例过滤条件示例

使用场景 gcloud 过滤条件 API 过滤条件
一个项目中的所有实例

--instance-filter-all

{
  "instanceFilter":{
    "all":"true"
  }
}
位于 us-east1-b 地区名为 instance1 的实例。

--instance-filter-names="zones/us-east1-b/instances/instance1"

{
  "instanceFilter":{
    "instances":[
      "zones/us-east1-b/instances/instance1"
    ]
  }
}
具有 app- 前缀的实例

--instance-filter-name-prefixes="app-"

{
  "instanceFilter":{
    "instanceNamePrefixes":[
      "app-"
    ]
  }
}
位于 us-east1-bus-east1-c 地区的实例

--instance-filter-zones="us-east1-b","us-east1-c"

{
  "instanceFilter":{
    "zones":[
      "us-east1-b",
      "us-east1-c"
    ]
  }
}
具有 env=devapp=web 组合标签的实例以及具有 env=devapp=worker 的实例。

--instance-filter-group-labels="env=dev,app=web"
--instance-filter-group-labels="env=dev,app=worker"

{
  "instanceFilter":{
    "groupLabels":[
      {
        "labels":{
          "env":"dev",
          "app":"web"
        }
      },
      {
        "labels":{
          "env":"dev",
          "app":"worker"
        }
      }
    ]
  }
}

实例过滤组合条件

您也可以组合使用实例过滤条件。例如,如需针对位于 us-east1-c 地区中且具有 test- 前缀以及 env=devapp=web 标签的实例运行修补作业,请运行以下命令:

gcloud compute os-config patch-jobs execute \
    --instance-filter-name-prefixes="test-" \
    --instance-filter-zones="us-east1-c" \
    --instance-filter-group-labels="env=prod,app=web"

补丁程序配置

运行修补作业时,您可以指定参数来控制虚拟机上应用的补丁程序。补丁程序配置参数与平台相关,通常会传递给底层系统更新工具。实际补丁程序源自在虚拟机上配置的软件包代码库 (Linux) 或 Windows 更新服务器 (Windows)。

您可以为虚拟机指定以下补丁程序配置:

  • 对于 Windows,请指定要应用的补丁程序分类(例如 SecurityCritical)或明确要排除的特定 KB。如需详细了解补丁程序分类,请参阅 Microsoft 支持文档
  • 对于 RHEL 和 CentOS,底层系统为 yum。对于针对这些虚拟机的补丁程序,您可以指定 securityminimal 软件包。您还可以排除特定软件包。如需了解详情,请参阅 yum 手册页面
  • 对于 Debian 和 Ubuntu,底层系统为 apt。对于以这些虚拟机为目标的补丁程序,您可以指定 dist-upgrade 或标准升级。您还可以排除特定软件包。如需了解详情,请参阅 Debian 手册页面Ubuntu 手册页面
  • 对于 SUSE,底层系统为 zypper,具体使用 zypper 补丁程序。对于以这些虚拟机为目标的补丁程序,您可以指定以下选项:

    • with update:更新补丁程序未涵盖的所有软件包
    • with optional:根据需要处理可选补丁程序
    • 要应用的补丁程序的类别或严重程度

    您还可以排除特定的补丁程序。

(可选)对于所有受支持的操作系统,您可以通过指定这些更新来选择仅安装已获批准的补丁程序。这样您就可以输入已获批准的软件包或补丁程序的列表。当您选择这些已获批准的补丁程序时,系统只会安装已获批准的软件包或补丁程序。在更新过程中,所有其他补丁程序配置参数都会被跳过。

示例

控制台

  1. 按照控制台标签页中所述的步骤,创建修补作业补丁程序部署
  2. 补丁程序配置部分中,选择修补作业的参数。

    显示输入字段的操作系统补丁程序配置。

  3. 进行修补作业或补丁程序部署所需的任何额外配置。

  4. 点击部署

gcloud

例如,如需针对位于 northamerica-northeast1-a 地区中的所有实例运行修补作业(不同操作系统具有相应的特定补丁程序配置),请运行 gcloud compute os-config patch-jobs execute 命令:

gcloud compute os-config patch-jobs execute \
    --instance-filter-zones="northamerica-northeast1-a" \
    --apt-dist \
    --yum-security \
    --yum-minimal \
    --zypper-categories=security \
    --windows-classifications=critical,security \
    --reboot-config=default

如需详细了解支持的选项,请运行以下命令:

gcloud compute os-config patch-jobs execute --help

API

例如,如需针对位于 northamerica-northeast1-a 地区中的所有实例运行修补作业(不同操作系统具有相应的特定补丁程序配置),请运行以下命令:

POST https://osconfig.googleapis.com/v1/projects/project-id/patchJobs:execute
{
    "instanceFilter":{
        "zones":[
            "northamerica-northeast1-a"
        ]
    },
    "patchConfig":{
        "apt": {
            "type": "dist-upgrade"
        },
        "yum": {
            "security": true,
            "minimal": true
        },
        "zypper": {
            "categories": ["security"]
        },
        "windowsUpdate": {
            "classifications": ["CRITICAL", "SECURITY"]
        },
        "rebootConfig": "DEFAULT"
    }
}

如需详细了解支持的参数,请参阅 PatchConfig API 文档。

维护期

维护期是您允许修补作业运行的总时长。如果修补作业未在指定的维护期内完成,则它们将超时。

例如,如果您将维护期设置为 60 minutes,则在开始时间后 60 分钟系统不会启动新的修补作业。在此维护期之外,系统可能会执行某些进程(例如下载文件或重新启动),但不会启动新的修补作业。

重新启动选项

运行修补作业时,您可以为补丁程序指定重新启动选项。您可以使用以下选项:

  • 默认值:代理通过检查每个操作系统上的常见信号来确定是否需要重新启动。在修补期间可能会发生多次重新启动,并且可能在安装任何补丁程序之前发生。
  • 始终:机器在更新完成后重新启动。
  • 从不:更新完成后,机器不会重新启动。在某些情况下,这可能意味着并非所有补丁程序都已完全应用。

修补前脚本和修补后脚本

运行修补作业时,您可以指定要作为修补过程的一部分运行的脚本。这些脚本有助于执行诸如关闭应用和执行运行状况检查等任务。

  • 修补前脚本在修补开始之前运行。如果修补开始前需要重新启动系统,则修补前脚本在系统重新启动之前运行。
  • 修补后脚本在修补完成之后运行。如果修补过程中需要重新启动系统,则修补后脚本在系统重新启动之后运行。

对于 Linux 和 Windows,修补作业分别接受一个修补前脚本和一个修补后脚本。如果分别通过 gcloud 命令行工具Cloud OS Config APIGoogle Cloud Console 指定了 Linux 和 Windows 脚本,则必须使用适当的标志、参数或部分提供这些脚本。Linux 脚本仅在 Linux 虚拟机上运行,Windows 脚本仅在 Windows 虚拟机上运行。

这些脚本文件可以存储在虚拟机上,也可以存储在有版本控制的 Cloud Storage 存储分区中。如果您的 Cloud Storage 对象不可公开读取,请确保项目的默认 Compute Engine 服务帐号具有读取 Cloud Storage 对象所需的 IAM 权限。请检查 Cloud Storage 对象的权限设置,以确保您拥有正确的权限。

如果您希望使用 Cloud Storage 存储分区来存储脚本,请创建一个 Cloud Storage 存储分区将脚本上传到该存储分区。

示例

控制台

  1. 按照控制台标签页中所述的步骤,创建修补作业补丁程序部署
  2. 高级选项部分中,对于修补前部分和修补后部分,点击浏览。此时会显示 Cloud Storage 对象页面。

    显示脚本上传部分的 OS Patch Management 页面。

  3. 在 Cloud Storage 对象页面中,选择包含相应脚本的 Cloud Storage 存储分区,然后选择 Cloud Storage 对象或文件。

  4. 进行修补作业或补丁程序部署所需的任何额外配置。

  5. 点击部署

gcloud

例如,如需同时使用适用于 Linux 和 Windows 实例的修补前脚本和修补后脚本对 northamerica-northeast1-a 地区中的所有实例运行修补作业,请运行以下命令:

gcloud compute os-config patch-jobs execute \
    --instance-filter-zones="northamerica-northeast1-a" \
    --async \
    --pre-patch-linux-executable="/tmp/pre_patch_script.sh" \
    --post-patch-linux-executable="gs://my-patch-scripts/linux/post_patch_script#1523477886880" \
    --pre-patch-windows-executable="C:\\Users\\user\\pre-patch-script.cmd" \
    --post-patch-windows-executable="gs://my-patch-scripts/windows/post_patch_script.ps1#135920493447"

如需详细了解可接受的文件格式,请运行以下命令:

gcloud compute os-config patch-jobs execute --help

API

例如,如需同时使用适用于 Linux 和 Windows 实例的修补前脚本和修补后脚本对 northamerica-northeast1-a 地区中的所有实例运行修补作业,请运行以下命令:

POST https://osconfig.googleapis.com/v1/projects/project-id/patchJobs:execute

{
  "instanceFilter":{
    "zones":[
      "northamerica-northeast1-a"
    ]
  },
  "patchConfig":{
    "preStep":{
      "linuxExecStepConfig":{
        "localPath":"/tmp/pre_patch_script.sh"
      },
      "windowsExecStepConfig":{
        "interpreter":"SHELL",
        "localPath":"C:\\Users\\user\\pre-patch-script.cmd"
      }
    },
    "postStep":{
      "linuxExecStepConfig":{
        "gcsObject":{
          "bucket":"my-patch-scripts",
          "generationNumber":"1523477886880",
          "object":"linux/post_patch_script"
        }
      },
      "windowsExecStepConfig":{
        "gcsObject":{
          "bucket":"my-patch-scripts",
          "generationNumber":"135920493447",
          "object":"windows/post_patch_script.ps1"
        },
        "interpreter":"POWERSHELL"
      }
    }
  }
}

如需详细了解可接受的文件格式,请参阅 PatchConfig API 文档的 ExecStepConfig 部分。

补丁程序发布选项

您可以选择一次修补一个地区的虚拟机(逐个地区),也可以同时修补所有地区(并发地区)。

除了为地区发布作出选择外,您还可以为虚拟机指定地区中断预算。

地区中断预算

中断预算是每个地区在任何给定时刻要中断运行的虚拟机最大数量(或百分比)。

什么样的虚拟机会被视为已中断运行的虚拟机?

在修补过程中,从系统通知 OS Config 代理开始的时间到修补完成为止,虚拟机被视为中断运行。此中断时间包括完成重新启动以及任何修补后步骤的时间。

如果虚拟机满足以下任一条件,则也会计为中断预算的一部分:

  • 应用补丁程序时,修补操作失败
  • 运行修补前或修补后步骤时,修补操作失败
  • 在超时之前,修补操作未返回成功通知

中断预算的工作原理

对于“逐个地区”的发布,如果超出某个地区的中断预算,则修补作业会停止。这是因为,在继续修补下一个地区之前,上一个地区的修补过程必须已完成。

例如,如果中断预算的值为 10,并且当前地区有 8 个虚拟机无法修补,则修补作业将继续修补虚拟机(每次 2 个),直到该地区完成修补为止。当该地区成功完成修补后,下一个地区将开始进行修补,每次修补 10 个虚拟机。如果下一个地区中有 10 个虚拟机无法修补,则修补作业会停止。

示例

控制台

  1. 按照控制台标签页中所述的步骤,创建修补作业补丁程序部署
  2. 补丁程序发布选项 (Patch rollout options) 部分,配置发布选项:
    • 选择一次修补一个地区,还是同时修补所有地区。
    • 设置中断预算。中断预算是您希望修补过程一次中断某个地区的虚拟机数量或百分比。
  3. 进行修补作业或补丁程序部署所需的任何额外配置。
  4. 点击部署

gcloud

示例 1

此示例演示了使用以下指定内容运行修补作业的 os-config patch-jobs execute 命令

  • 修补项目中的所有虚拟机
  • 逐个地区地修补虚拟机
  • 确保同一地区在给定时间中断运行的虚拟机不超过 10 个
gcloud compute os-config patch-jobs execute \
   --instance-filter-all \
   --rollout-mode=zone-by-zone \
   --rollout-disruption-budget=10

示例 2

此示例演示了使用以下指定内容运行修补作业的 os-config patch-jobs execute 命令

  • 修补项目中的所有虚拟机
  • 同时修补多个地区
  • 确保同一地区在给定时间中断运行的虚拟机不超过 50%
gcloud compute os-config patch-jobs execute \
   --instance-filter-all \
   --rollout-mode=concurrent-zones \
   --rollout-disruption-budget-percent=50

API

此示例演示了使用以下指定内容运行修补作业的 patchJobs.execute 方法

  • 修补 us-central1-aus-central1-cus-central1-f 地区中的所有虚拟机
  • 同时修补多个地区
  • 确保同一地区在给定时间中断运行的实例不超过 25%
POST https://osconfig.googleapis.com/v1/projects/project-id/patchJobs:execute

{
  "instanceFilter":{
    "zones":[
      "us-central1-a",
      "us-central1-c",
      "us-central1-f"
    ]
  },
  "rollout": {
    "disruptionBudget": {
      "percent": 25
    },
    "mode": "CONCURRENT_ZONES"
  }
}

如需详细了解补丁程序发布,请参阅 PatchRollout API 文档。

调试修补作业

如果您的补丁程序失败,您可以借助以下步骤查找并解决问题。

  1. 查看受影响修补作业的实例详情。这有助于您确定失败的实例或这些实例所陷入的状态。实例详情列表还包含针对每个实例的简短错误消息。

    如果补丁程序的失败状态为 NO_AGENT_DETECTED,这通常表示服务向代理发送了开始修补的请求,但从未收到代理的响应。查看以下可能的原因和修复方案:

    • 实例未在运行。如需解决此问题,请启动虚拟机实例
    • 未启用 OS Config 服务。如需解决此问题,请参阅设置虚拟机
    • OS Config 代理未安装或未在实例上运行。如需解决此问题,请参阅设置虚拟机
    • 实例的网络设置不允许代理与服务通信。检查网络设置。
  2. 如果实例详情未提供足够的信息,请查看 Cloud Logging 日志或串行端口控制台。OS Config 代理会将其日志条目写入这两个位置。 在 Cloud Logging 中,您可以使用修补作业 ID 进行过滤,以查看与该修补作业相关的所有日志条目。 您还可以通过在虚拟机或项目级设置 osconfig-log-level=debug 元数据值来启用调试日志记录功能。

后续步骤