您可以使用补丁在一组虚拟机 (VM) 实例上应用操作系统补丁。
如需将补丁程序应用于您的虚拟机,请完成以下步骤:
准备工作
- 查看 OS Config 配额。
-
如果您尚未设置身份验证,请进行设置。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以通过选择以下选项之一向 Compute Engine 进行身份验证:
Select the tab for how you plan to use the samples on this page:
When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.
-
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
- Set a default region and zone.
REST
如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证。
-
限制
- 您只能针对单个 Google Cloud 项目中的虚拟机部署和运行修补作业。即使虚拟机位于共享 VPC 中,您也不能跨 Google Cloud 项目运行修补作业。不过,您可以跨项目查看补丁合规性数据。
- 默认情况下,虚拟机管理器不会为属于托管式实例组 (MIG) 的任何虚拟机打补丁。修补这些虚拟机会在修补作业中报告为失败。您可以在创建补丁作业时替换此默认行为。修补属于 MIG 的虚拟机时,存在以下限制:
- 当 MIG 修复虚拟机时,它会根据实例模板重新创建虚拟机。这可能会将虚拟机还原到未修补的状态。
- 修补虚拟机可能会导致启用了自动扩缩功能的 MIG 中出现意外结果。当负载下降时,自动扩缩器会删除已修补的虚拟机,并在负载增加时使用 MIG 的实例模板创建新虚拟机,没有任何补丁。例如,如果平均 CPU 利用率低于您为自动扩缩指定的目标利用率,则 MIG 可以在缩容时移除一些已修补的虚拟机。
支持的操作系统
如需查看支持补丁的操作系统和版本的完整列表,请参阅操作系统详细信息。
设置虚拟机
如需使用补丁功能,请完成以下步骤:
权限
Google Cloud 项目的所有者拥有运行和管理修补作业的完整访问权限。对于所有其他用户,您需要为其授予权限。您可以授予以下其中一种精细角色:
roles/osconfig.patchJobExecutor
:包含运行、取消、获取和列出修补作业的权限。该角色还包含查看修补作业对应实例的详情的权限。roles/osconfig.patchJobViewer
:包含获取和列出修补作业的只读权限。该角色还包含查看修补作业对应实例的详情的权限。
例如,如需向用户授予运行修补作业的权限,请使用以下命令:
gcloud projects add-iam-policy-bindingproject-id \ --member user:user-id @gmail.com \ --role roles/osconfig.patchJobExecutor
替换以下内容:
project-id
:项目 ID。user-id
:用户的 Google Workspace 用户名。
运行修补作业
您可以使用 Google Cloud 控制台、Google Cloud CLI 或 REST 运行修补作业。
当您运行修补作业时,通过实例过滤条件指定的所有实例上会同时开始修补虚拟机。
启动修补作业后,您可以使用补丁信息中心监控补丁。在修补作业开始约 30 分钟之后,数据会填充到信息中心内。
- 在 Google Cloud 控制台中,转到 Compute Engine > 虚拟机管理器 > 补丁页面。
- 点击新建补丁程序部署。
在目标虚拟机部分,选择包含要修补的虚拟机的地区。您还可以选择所有地区。
选择地区后,您可以进一步过滤该地区内的虚拟机。
例如,要修补所选可用区内的特定虚拟机,请输入类似于以下内容的名称和标签过滤条件:
- 名称前缀:
test-
- 标签:
env=dev
和app=web
- 名称前缀:
在补丁程序配置部分,配置补丁程序。
- 为您的补丁程序指定名称。
- 为您的操作系统选择所需的更新。如需了解详情,请参阅补丁程序配置。
在时间安排部分,完成以下操作:
- 选择时间表。如需立即运行修补作业,请选择立即开始。
- 可选:设置时长或维护窗口。
在发布选项部分,配置补丁程序发布选项:
- 选择一次修补一个地区,还是同时修补多个地区。
- 设置中断预算。中断预算是您希望修补过程一次中断某个地区的虚拟机数量或百分比。
可选:在高级选项部分,您可以完成以下任务:
- 选择重新启动选项。
- 上传修补前脚本和修补后脚本。如需详细了解修补前脚本和修补后脚本,请参阅指定修补前脚本和修补后脚本。
点击部署。
使用 os-config patch-jobs execute
命令运行修补作业。请将 instance-filter
替换为所需的实例过滤条件。如需详细了解实例过滤条件,请参阅实例过滤条件。
gcloud compute os-config patch-jobs executeinstance-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=4339284 \ --yum-minimal --yum-security \ --async
在 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-b
的 instance1
实例运行修补作业。在此示例中,我们添加了描述并指定作业运行 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=dev
和app=web
标签。 - 位于
asia-east1-b
或asia-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":"4339284" } } }
实例过滤条件
您可以使用过滤条件指定要包含在修补作业中的实例。修补作业支持以下过滤条件:
按名称过滤:限制修补作业仅修补具有特定名称的实例。 您必须使用完整 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
对 Google Cloud 项目中的所有实例运行修补作业。如需了解详情,请参阅实例过滤条件示例。
实例过滤条件示例
使用场景 | gcloud 过滤条件 | API 过滤条件 |
---|---|---|
Google Cloud 项目中的所有实例 | --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-b 或 us-east1-c 地区的实例 |
--instance-filter-zones="us-east1-b","us-east1-c" |
{ "instanceFilter":{ "zones":[ "us-east1-b", "us-east1-c" ] } } |
具有 env=dev 和 app=web 组合标签的实例以及具有 env=dev 和 app=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=dev
和 app=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,请指定要应用的补丁程序分类(例如
Security
和Critical
)或明确要排除的特定 KB。如需详细了解补丁程序分类,请参阅 Microsoft 支持文档。 对于 RHEL、Rocky Linux 和 CentOS,底层系统为
yum
。- 对于针对 RHEL 和 Rocky Linux 虚拟机的补丁,您可以指定
security
和minimal
软件包。 - 对于 CentOS 虚拟机,CentOS
yum
代码库中没有security
元数据。因此,在更新安全软件包时,您无需指定security
选项。如果未指定任何软件包,则修补作业会更新所有软件包,包括具有安全更新的软件包。 - 您还可以排除特定软件包。如需了解详情,请参阅
yum
手册页面。
- 对于针对 RHEL 和 Rocky Linux 虚拟机的补丁,您可以指定
对于 Debian 和 Ubuntu,底层系统为
apt
。对于以这些虚拟机为目标的补丁程序,您可以指定dist-upgrade
或标准升级。您还可以排除特定软件包。如需了解详情,请参阅 Debian 手册页面或 Ubuntu 手册页面。对于 SUSE,底层系统为
zypper
,具体使用 zypper 补丁程序。对于以这些虚拟机为目标的补丁程序,您可以指定以下选项:with update
:更新补丁程序未涵盖的所有软件包with optional
:根据需要处理可选补丁程序- 要应用的补丁程序的类别或严重程度
您还可以排除特定的补丁程序。
(可选)对于所有受支持的操作系统,您可以通过指定这些更新来选择仅安装已获批准的补丁程序。这样您就可以输入已获批准的软件包或补丁程序的列表。当您选择这些已获批准的补丁程序时,系统只会安装已获批准的软件包或补丁程序。在更新过程中,所有其他补丁程序配置参数都会被跳过。
示例
例如,如需针对位于 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
例如,如需针对位于 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,修补作业分别接受一个修补前脚本和一个修补后脚本。从 Google Cloud CLI、REST 或 Google Cloud 控制台分别指定时,必须使用适当的标志、参数或部分提供 Linux 和 Windows 脚本。Linux 脚本仅在 Linux 虚拟机上运行,Windows 脚本仅在 Windows 虚拟机上运行。
这些脚本文件可以存储在虚拟机上,也可以存储在有版本控制的 Cloud Storage 存储分区中。
将补丁脚本存储在 Cloud Storage 存储分区中
如果您希望使用 Cloud Storage 存储分区来存储脚本,请创建一个 Cloud Storage 存储分区并将脚本上传到该存储分区。使用 Cloud Storage 存储分区时,请考虑以下事项:
- 如果您的 Cloud Storage 对象不可公开读取,请确保附加到实例的服务账号具有读取 Cloud Storage 对象所需的 IAM 权限。请检查 Cloud Storage 对象的权限设置,以确保您拥有正确的权限。
- 使用 Google Cloud 控制台从 Cloud Storage 中选择脚本时,系统会默认使用指定 Cloud Storage 对象的最新版本。
如果贵组织强制执行资源位置限制条件,则您必须将脚本存储在组织政策允许的区域和可用区中的 Cloud Storage 存储分区中。
例如,如需同时使用适用于 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
例如,如需同时使用适用于 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
此示例演示了使用以下指定内容运行修补作业的 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
此示例演示了使用以下指定内容运行修补作业的 patchJobs.execute
方法:
- 修补
us-central1-a
、us-central1-c
、us-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 文档。
启用在 Windows 虚拟机上修补 Microsoft 软件的功能
当您在 Windows 虚拟机上运行修补作业时,默认情况下,补丁仅应用适用于 Windows 操作系统的补丁。
运行修补作业时,您可以应用 Windows 虚拟机上运行的 Microsoft 软件(如 Microsoft SQL Server、SharePoint Server 或 .NET Framework)的更新。默认情况下,系统会停用为这些应用修补的功能,以免服务中断,以及为此类软件单独进行计划更新。如需自动修补 Microsoft 软件,您可以使用 Windows 界面或 PowerShell。
- 在 Windows“开始”菜单中,依次选择设置 > 更新和安全 > Windows 更新。
- 在高级选项部分,开启在您更新 Windows 时接收其他 Microsoft 产品的更新。
$service_manager = New-Object -ComObject 'Microsoft.Update.ServiceManager' $service_manager.AddService2("7971f918-a847-4430-9279-4a52d1efe18d",7,"")
调试修补作业
如果您的补丁程序失败,您可以借助以下步骤查找并解决问题。
查看受影响修补作业的实例详情。这有助于您确定失败的实例或这些实例所陷入的状态。实例详情列表还包含针对每个实例的简短错误消息。
如果补丁程序失败并且状态为
NO_AGENT_DETECTED
或TIMED_OUT
,这通常表示服务向代理发送了开始修补的请求,但从未收到代理的响应。查看以下可能的原因和修复方案:如果实例详情未提供足够的信息,请查看 Cloud Logging 日志或串行端口控制台。OS Config 代理会将其日志条目写入这两个位置。 在 Cloud Logging 中,您可以使用修补作业 ID 进行过滤,以查看与该修补作业相关的所有日志条目。 您还可以通过在虚拟机或 Google Cloud 项目级设置
osconfig-log-level=debug
元数据值来启用调试日志记录功能。