创建操作系统政策分配任务


使用操作系统政策,在 Linux 和 Windows 虚拟机实例之间保持一致的软件配置

准备工作

  • 查看操作系统政策和操作系统政策分配任务
  • 查看 OS Config 配额
  • 设置身份验证(如果尚未设置)。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式向 Compute Engine 进行身份验证。

    选择标签页以了解您打算如何使用本页面上的示例:

    控制台

    当您使用 Google Cloud 控制台访问 Google Cloud 服务和 API 时,无需设置身份验证。

    gcloud

    1. 安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init
    2. 设置默认区域和可用区

    Terraform

    如需从本地开发环境使用本页面上的 Terraform 示例,请安装并初始化 gcloud CLI,然后使用用户凭据设置应用默认凭据。

    1. 安装 Google Cloud CLI。
    2. 如需初始化 gcloud CLI,请运行以下命令:

      gcloud init
    3. 为您的 Google 账号创建本地身份验证凭据:

      gcloud auth application-default login

    如需了解详情,请参阅 为本地开发环境设置身份验证

    REST

    如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。

      安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init

支持的操作系统

如需查看支持操作系统政策的操作系统和版本的完整列表,请参阅操作系统详细信息

权限

由于您可以使用操作系统政策在虚拟机上安装和管理软件包,因此创建和管理操作系统政策等效于授予对虚拟机的远程代码执行权限。

设置操作系统政策时,系统会使用 IAM 权限来控制对政策资源的访问权限,并记录活动的审核日志。但是,用户仍可以在虚拟机上运行代码,这可能会带来安全风险。为缓解此风险,我们建议您仅向每位用户提供所需的访问权限。

项目的所有者拥有创建和管理操作系统政策分配任务的完整权限。 对于所有其他用户,您需要为其授予权限。您可以授予以下其中一种精细角色:

  • OSPolicyAssignment Admin (roles/osconfig.osPolicyAssignmentAdmin)。包含创建、删除、更新、获取和列出操作系统政策分配的权限。
  • OSPolicyAssignment Editor (roles/osconfig.osPolicyAssignmentEditor)。包含更新、获取和列出操作系统政策分配的权限。
  • OSPolicyAssignment Viewer (roles/osconfig.osPolicyAssignmentViewer)。包含获取和列出操作系统政策分配所需的只读权限。

用于设置权限的示例命令

如需向用户授予操作系统政策分配任务的管理员访问权限,请运行以下命令:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member user:USER_ID@gmail.com \
        --role roles/osconfig.osPolicyAssignmentAdmin

替换以下内容:

  • PROJECT_ID:项目 ID
  • USER_ID:用户的 Google Workspace 用户名。

创建操作系统政策分配任务

如需创建和发布操作系统政策分配任务,请完成以下步骤:

  1. 设置虚拟机管理器
  2. 向用户分配所需权限
  3. 查看操作系统政策和操作系统政策分配任务
  4. 创建操作系统政策资源
  5. 如需创建和发布操作系统政策分配任务,请使用以下方法之一:

    控制台

    如需创建和发布操作系统政策分配任务,请完成以下步骤:

    1. 在本地客户端上,创建或下载操作系统政策。该文件必须是 JSON 或 YAML 文件。如需详细了解如何创建操作系统政策,或者查看示例操作系统政策,请参阅操作系统政策
    2. 在 Google Cloud 控制台中,转到操作系统政策页面。

      转到“操作系统政策”

    3. 点击创建操作系统政策分配

    4. 分配任务 ID 部分中,为操作系统政策分配任务提供一个名称。请参阅资源命名惯例

    5. 操作系统政策部分中,上传操作系统政策文件。

    6. 目标虚拟机实例部分中,指定目标虚拟机。

      • 选择包含您要应用政策的虚拟机的可用区。
      • 选择操作系统系列。
      • 可选:您可以通过指定包含和排除标签来进一步过滤虚拟机。

      例如,您可以在测试环境中选择全部 Ubuntu 虚拟机,并通过指定以下内容来排除运行 Google Kubernetes Engine 的虚拟机:

      • 操作系统系列:ubuntu
      • 包含:env:testenv:staging
      • 排除:goog-gke-node

      选择目标虚拟机。

    7. 指定发布计划。

      • 指定波次规模(也称为中断预算)。例如:10%。
      • 指定等待时间。例如 15 分钟。

        发布配置。

    8. 点击开始发布

    gcloud

    如需在可用区中创建和发布操作系统政策分配任务,请完成以下步骤:

    1. 创建 JSON 或 YAML 格式的操作系统政策分配资源。此文件定义了您要应用于虚拟机的操作系统政策、要将政策应用于的目标虚拟机以及应用操作系统政策的发布速率。如需详细了解此文件和示例分配任务,请参阅操作系统政策分配任务

    2. 使用 os-config os-policy-assignments create 命令在指定位置创建和发布操作系统政策分配任务。

      gcloud compute os-config os-policy-assignments create OS_POLICY_ASSIGNMENT_ID \
         --location=ZONE \
         --file=OS_POLICY_ASSIGNMENT_FILE \
         --async
      

      替换以下内容:

      • OS_POLICY_ASSIGNMENT_ID:操作系统政策分配任务的名称。请参阅资源命名惯例
      • ZONE:要在其中创建操作系统政策分配任务的可用区。
      • OS_POLICY_ASSIGNMENT_FILE:您在上一步中创建的操作系统政策分配文件的绝对路径。

      示例

      gcloud compute os-config os-policy-assignments create my-os-policy-assignment \
          --location=asia-south1-a \
          --file=/downloads/assignment-config.yaml \
          --async
      

      输出内容类似如下:

      Create request issued for: [my-os-policy-assignment]
      Check operation [projects/384123488288/locations/asia-south1-a/osPolicyAssignments/my-os-policy-assignment/operations/fb2011d6-61de-46f1-afdb-bc96bdb3fbaa] for status.
      
    3. 记下操作的完全限定资源名称。在前面的示例中,完全限定资源名称如下:

      projects/384123488288/locations/asia-south1-a/osPolicyAssignments/my-os-policy-assignment/operations/fb2011d6-61de-46f1-afdb-bc96bdb3fbaa
      

      您可以使用此完全限定资源名称来获取发布的详细信息或者取消发布。请参阅发布

    Terraform

    如需创建操作系统政策分配任务,请使用 google_os_config_os_policy_assignment 资源

    以下示例验证 Apache Web 服务器是否在 CentOS 虚拟机上运行。

    resource "google_os_config_os_policy_assignment" "my_os_policy_assignment" {
    
      name        = "my-os-policy-assignment"
      location    = "us-west1-a"
      description = "An OS policy assignment that verifies if the Apache web server is running on CentOS VMs."
    
      instance_filter {
        # filter to select VMs
        all = false
    
        exclusion_labels {
          labels = {
            label-one = "goog-gke-node"
          }
        }
    
        inclusion_labels {
          labels = {
            env = "test",
          }
        }
    
        inventories {
          os_short_name = "centos"
          os_version    = "7*"
        }
      }
    
      os_policies {
        #list of OS policies to be applied to VMs
        id   = "apache-always-up-policy"
        mode = "ENFORCEMENT"
    
        resource_groups { #list of resource groups for the policy
          resources {
            id = "ensure-apache-is-up"
    
            exec {
              validate {
                interpreter = "SHELL"
                script      = "if systemctl is-active --quiet httpd; then exit 100; else exit 101; fi"
              }
    
              enforce {
                interpreter = "SHELL"
                script      = "systemctl start httpd && exit 100"
              }
            }
          }
    
          inventory_filters {
            os_short_name = "centos"
            os_version    = "7*"
          }
        }
    
        allow_no_resource_group_match = false #OS policy compliance status
        description                   = "An OS policy that verifies if the Apache web server is running on Linux VMs."
      }
    
      rollout {
        #define rollout parameters
        disruption_budget {
          fixed = 1
        }
        min_wait_duration = "3.5s"
      }
    }

    如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

    REST

    如需在本地客户端上创建操作系统政策分配任务,请完成以下步骤:

    1. 创建操作系统政策分配任务。该文件必须是 JSON 文件。如需详细了解如何创建操作系统政策分配任务,或者查看示例操作系统政策分配任务,请参阅操作系统政策分配任务

      如果要使用示例 YAML 操作系统政策分配任务,则必须将其转换为 JSON。

    2. 在 API 中,创建对 projects.locations.osPolicyAssignments.create 方法POST 请求。

      在请求正文中,粘贴上一步中的操作系统政策分配任务规范。

      POST https://osconfig.googleapis.com/v1/projects/PROJECT_ID/locations/ZONE/OSPolicyAssignments?osPolicyAssignmentId=OS_POLICY_ASSIGNMENT_ID
      
      {
       JSON_OS_POLICY
      }
      

      替换以下内容:

      • PROJECT_ID:您的项目 ID
      • OS_POLICY_ASSIGNMENT_ID:操作系统政策分配任务的名称
      • JSON_OS_POLICY:上一步中创建的操作系统政策分配任务规范。此文件必须采用 JSON 格式。 如需详细了解参数和格式,请参阅 Resource: OSPolicyAssignment
      • ZONE:要在其中创建操作系统政策分配任务的可用区

      示例

      例如,如需为 Google Cloud Observability 创建操作系统政策分配任务(使用示例操作系统政策分配任务),以在选定的虚拟机上安装监控和 Logging 代理,请完成以下步骤:

      1. 将示例转换为 JSON
      2. 发出以下请求:
      POST https://osconfig.googleapis.com/v1/projects/PROJECT_ID/locations/ZONE/OSPolicyAssignments?osPolicyAssignmentId=OS_POLICY_ASSIGNMENT_ID
      
      {
        "osPolicies": [
          {
            "id": "setup-repo-and-install-package-policy",
            "mode": "ENFORCEMENT",
            "resourceGroups": [
              {
                "resources": [
                  {
                    "id": "setup-repo",
                    "repository": {
                      "yum": {
                        "id": "google-cloud-monitoring",
                        "displayName": "Google Cloud Monitoring Agent Repository",
                        "baseUrl": "https://packages.cloud.google.com/yum/repos/google-cloud-monitoring-el8-x86_64-all",
                        "gpgKeys": [
                          "https://packages.cloud.google.com/yum/doc/yum-key.gpg",
                          "https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg"
                        ]
                      }
                    }
                  },
                  {
                    "id": "install-pkg",
                    "pkg": {
                      "desiredState": "INSTALLED",
                      "yum": {
                        "name": "stackdriver-agent"
                      }
                    }
                  }
                ]
              }
            ]
          }
        ],
        "instanceFilter": {
          "inclusionLabels": [
            {
              "labels": {
                "used_for": "testing"
              }
            }
          ]
        },
        "rollout": {
          "disruptionBudget": {
            "fixed": 10
          },
          "minWaitDuration": {
            "seconds": 300
          }
        }
      }
      

发布

系统会根据发布速率部署操作系统政策分配任务。这意味着针对一组虚拟机的分配任务可以逐步部署,而非立即应用于所有虚拟机。我们将逐步发布更改,以便让您在新更改造成退步时,有机会施加干预并取消发布。

如果对 API 的方法调用可能需要很长时间才能完成,则该 API 会返回长时间运行的操作 (LRO)。如需详细了解 LRO,请参阅长时间运行的操作

每次创建、更新或删除操作系统政策分配任务时,OS Config API 都会创建 LRO。每个 LRO 会返回一个操作资源。此操作资源类似于以下内容:

Create request issued for: [my-os-policy-assignment]
Check operation [projects/384123488288/locations/asia-south1-a/osPolicyAssignments/my-os-policy-assignment/operations/fb2011d6-61de-46f1-afdb-bc96bdb3fbaa] for status.

每个创建、更新或删除操作也会生成新的操作系统政策分配修订版本。如需查看操作系统政策分配任务的修订版本,请参阅列出操作系统政策分配任务修订版本

您可以使用 Google Cloud CLI 获取发布详情或取消发布。

获取发布详情

如需获取发布的详细信息,请使用 os-config os-policy-assignments operations describe 命令

gcloud compute os-config os-policy-assignments operations describe FULLY_QUALIFIED_OPERATION_NAME

FULLY_QUALIFIED_OPERATION_NAME 替换为创建、更新或删除操作返回的操作的完全限定资源名称。

示例

gcloud compute os-config os-policy-assignments operations describe \
    projects/384123488288/locations/asia-south1-a/osPolicyAssignments/my-os-policy-assignment/operations/fb2011d6-61de-46f1-afdb-bc96bdb3fbaa

输出示例

done: true
metadata:
  '@type': type.googleapis.com/google.cloud.osconfig.$$api-version$$.OSPolicyAssignmentOperationMetadata
  apiMethod: CREATE
  osPolicyAssignment: projects/3841234882888/locations/asia-south1-a/osPolicyAssignments/my-os-policy-assignment@cfb78790-41d8-40d1-b8a1-1eaf6011b909
  rolloutStartTime: '2021-04-15T00:53:52.963569Z'
  rolloutState: SUCCEEDED
  rolloutUpdateTime: '2021-04-15T00:53:53.094041Z'
name: projects/3841234882888/locations/asia-south1-a/osPolicyAssignments/my-os-policy-assignment/operations/cfb78790-41d8-40d1-b8a1-1eaf6011b909
response:
  '@type': type.googleapis.com/google.cloud.osconfig.$$api-version$$.OSPolicyAssignment
  baseline: true
  description: My test policy
  instanceFilter:
    inclusionLabels:
    - labels:
        label-key-not-targeting-instances: label-value-not-targeting-instances
  name: projects/3841234882888/locations/asia-south1-a/osPolicyAssignments/my-os-policy-assignment
  osPolicies:
  - id: q-test-policy
    mode: ENFORCEMENT
    resourceGroups:
    - osFilter:
        osShortName: centos
        osVersion: '7'
      resources:
      - id: add-repo
        repository:
          yum:
            baseUrl: https://packages.cloud.google.com/yum/repos/google-cloud-ops-agent-el7-x86_64-all

取消发布

控制台

  1. 在 Google Cloud 控制台中,转到操作系统政策页面。

    转到“操作系统政策”

  2. 点击操作系统政策分配标签页。

  3. 对于要取消发布的操作系统政策分配,请点击操作 () > 取消发布

  4. 点击取消发布

gcloud

若要取消发布,请使用 gcloud compute os-config os-policy-assignments operations cancel 命令

gcloud compute os-config os-policy-assignments operations cancel FULLY_QUALIFIED_OPERATION_NAME

FULLY_QUALIFIED_OPERATION_NAME 替换为创建、更新或删除操作返回的操作的完全限定资源名称。

示例

gcloud compute os-config os-policy-assignments operations cancel \
    projects/384123488288/locations/asia-south1-a/osPolicyAssignments/my-os-policy-assignment/operations/fb2011d6-61de-46f1-afdb-bc96bdb3fbaa

如果命令成功,则不会返回任何输出。

后续步骤