操作系统政策和操作系统政策分配任务


操作系统政策就是一个文件,其中包含操作系统资源(如软件包、存储库、文件或脚本定义的自定义资源)的声明性配置。 如需了解详情,请参阅 OSPolicy 的资源定义。

操作系统政策分配任务是虚拟机管理器用来将操作系统政策应用于虚拟机的 API 资源。 如需了解详情,请参阅 OSPolicyAssignment 的资源定义。

操作系统政策

操作系统政策是包含三个部分的 JSON 或 YAML 文件:

  • 模式。政策行为。有两种模式可供选择:

    • Validation:对于此模式,该政策会检查资源是否处于所选状态,但不执行任何操作。
    • Enforcement:对于此模式,政策会检查资源是否处于所选状态;如果不是,则政策会执行必要的操作,使资源达到所选状态。

    对于这两种模式,虚拟机管理器都会报告操作系统政策及相关资源的合规性。

  • 资源组。关联资源规范适用的操作系统名称和版本。例如,您可以定义单个政策,以在不同的操作系统发布版本和版本上安装或部署代理。

  • 资源。虚拟机获得所选配置所需的规范。支持以下资源类型:

    • pkg:用于安装或移除 Linux 和 Windows 软件包
    • repository:用于指定可从中安装软件包的代码库
    • exec:用于允许运行临时 shell (/bin/sh) 或 PowerShell 脚本
    • file:用于管理系统中的文件

操作系统政策示例

以下示例展示了如何创建操作系统政策。创建操作系统政策分配任务时,您可以将这些操作系统政策上传到 Google Cloud 控制台。

  • 示例 1:安装软件包。
  • 示例 2:运行脚本。
  • 示例 3:指定下载代码库,并从该代码库安装软件包。
  • 示例 4:在运行 Container-Optimized OS (COS) 的虚拟机上配置 CIS 基准扫描。如需详细了解如何使用操作系统政策进行 CIS 基准扫描,请参阅自动启用和检查 CIS 合规性状态

如需查看可在您的环境中应用的示例操作系统政策的完整列表,请参阅 GoogleCloudPlatform/osconfig GitHub 代码库。

示例 1

创建操作系统政策,以安装从 Cloud Storage 存储分区下载的 Windows MSI。

# An OS policy to install a Windows MSI downloaded from a Google Cloud Storage bucket.
id: install-msi-policy
mode: ENFORCEMENT
resourceGroups:
  - resources:
      - id: install-msi
        pkg:
          desiredState: INSTALLED
          msi:
            source:
              gcs:
                bucket: my-bucket
                object: my-app.msi
                generation: 1619136883923956

示例 2

创建一个操作系统政策,以验证 Apache Web 服务器是否正在 Linux 虚拟机上运行。

# An OS policy that ensures Apache web server is running on Linux OSes.
id: apache-always-up-policy
mode: ENFORCEMENT
resourceGroups:
  - resources:
      id: ensure-apache-is-up
      exec:
        validate:
          interpreter: SHELL
          # If Apache web server is already running, return an exit code 100 to indicate
          # that exec resource is already in desired state. In this scenario,
          # the `enforce` step will not be run.
          # Otherwise return an exit code of 101 to indicate that exec resource is not in
          # desired state. In this scenario, the `enforce` step will be run.
          script: if systemctl is-active --quiet httpd; then exit 100; else exit 101; fi
        enforce:
          interpreter: SHELL
          # Start Apache web server and return an exit code of 100 to indicate that the
          # resource is now in its desired state.
          script: systemctl start httpd && exit 100

示例 3

创建在 CentOS 虚拟机上安装 Google Cloud Observability 代理的操作系统政策。

id: cloudops-policy
mode: ENFORCEMENT
resourceGroups:
  - resources:
      - id: add-repo
        repository:
          yum:
            id: google-cloud-ops-agent
            displayName: Google Cloud Ops Agent Repository
            baseUrl: https://packages.cloud.google.com/yum/repos/google-cloud-ops-agent-el7-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: google-cloud-ops-agent
      - id: exec-script
        exec:
          validate:
            script: |-
              if [[ $(rpm --query --queryformat '%{VERSION}
              ' google-cloud-ops-agent) == '1.0.2' ]]; then exit 100; else exit 101; fi
            interpreter: SHELL
          enforce:
            script:
              sudo yum remove -y google-cloud-ops-agent || true; sudo yum install
              -y 'google-cloud-ops-agent-1.0.2*' && exit 100
            interpreter: SHELL
      - id: ensure-agent-running
        exec:
          validate:
            script:
              if (ps aux | grep 'opt[/].*google-cloud-ops-agent.*bin/'); then exit
              100; else exit 101; fi
            interpreter: SHELL
          enforce:
            script: sudo systemctl start google-cloud-ops-agent.target && exit 100
            interpreter: SHELL

示例 4

配置定期 CIS 1 级扫描,每天扫描一次。

# An OS policy to check CIS level 1 compliance once a day.
osPolicies:
- id: ensure-cis-level1-compliance-once-a-day-policy
  mode: ENFORCEMENT
  resourceGroups:
  - resources:
      id: ensure-cis-level1-compliance-once-a-day
      exec:
        validate:
          interpreter: SHELL
          # If cis-compliance-scanner.service is active, return an exit code
          # 100 to indicate that the instance is in compliant state.
          # Otherwise, return an exit code of 101 to run `enforce` step.
          script: |-
            is_active=$(systemctl is-active cis-compliance-scanner.timer)
            result=$(systemctl show -p Result --value cis-compliance-scanner.service)

            if [ "$is_active" == "active" ] && [ "$result" == "success" ]; then
              exit 100;
            else
              exit 101;
            fi
        enforce:
          interpreter: SHELL
          # COS 97 images are by-default CIS Level 1 compliant and there is no
          # additional configuration needed. However, if certain changes
          # cause non-compliance because of the workload on the instance, this
          # section can be used to automate to make fixes. For example, the
          # workload might generate a file that does not comply with the
          # recommended file permissions.
          # Return an exit code of 100 to indicate that the desired changes
          # successfully applied.
          script: |-
            # optional <your code>
            # Check the compliance of the instance once a day.
            systemctl start cis-compliance-scanner.timer && exit 100

操作系统政策分配任务

操作系统政策分配任务包含以下部分:

  • 操作系统政策。您要应用到虚拟机的一项或多项操作系统政策。如需下载或创建政策,请参阅操作系统政策

  • 目标虚拟机。您要应用政策的单个可用区内的一组虚拟机。在一个可用区内,您可以使用操作系统系列以及包含或排除标签来限制虚拟机。您可以选择以下选项的组合:

    • 操作系统系列:指定操作系统政策要应用于的目标操作系统。如需查看支持操作系统政策的操作系统和版本的完整列表,请参阅操作系统详细信息
    • 包含集:根据虚拟机或系统标签,指定操作系统政策要应用于的虚拟机。
    • 排除集:根据虚拟机或系统标签,指定操作系统政策应忽略的虚拟机。

    对于“包含”和“排除”标签集,如果单个字符串标签符合系统使用的命名惯例,则会被接受。但大多数标签均采用 key:value 对的形式指定。如需详细了解标签,请参阅为资源添加标签

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

    • 操作系统系列:ubuntu
    • 包含:env:testenv:staging
    • 排除:goog-gke-node
  • 发布速率。指定将操作系统政策应用于虚拟机的速率。操作系统政策将逐步发布,让您能够跟踪系统运行状况,并在更新导致环境退步时做出修改。发布计划包含以下组成部分:

    • 波次规模(中断预算):一次发布可以发布的虚拟机的固定数量或百分比。这表示无论何时进行发布,仅以指定数量的虚拟机为发布目标。
    • 等待时间:从服务向虚拟机应用政策到虚拟机从中断阈值中移除之间的时间。例如,等待时间为 15 分钟,这表示发布过程必须在将政策应用于虚拟机之后等待 15 分钟,然后才能从中断阈值中移除虚拟机并继续发布。 等待时间有助于控制发布速度,也有助于您尽早发现和解决潜在的发布问题。请选择足够长的时间,以便监控发布状态。

    例如,如果您将目标设置为 10 个虚拟机,并将中断阈值设置为 20%,将将烘焙时间设置为 15 分钟,则在任何给定时间,系统只会安排更新 2 个虚拟机。更新每个虚拟机后,必须等待 15 分钟才能从中断阈值中移除该虚拟机,并将另一个虚拟机添加到发布中。

    如需详细了解发布,请参阅发布

操作系统政策分配任务示例

以下示例展示了如何创建操作系统政策分配任务。您可以使用这些示例通过 Google Cloud CLI 或 OS Config API 创建操作系统政策分配任务。

  • 示例 1:安装软件包。
  • 示例 2:运行脚本。
  • 示例 3:指定下载代码库,并从该代码库安装软件包。

如需查看可在您的环境中应用的操作系统政策分配任务示例的列表,请参阅 GoogleCloudPlatform/osconfig GitHub 代码库。

示例 1

创建操作系统政策分配任务,以安装从 Cloud Storage 存储分区下载的 Windows MSI。

# An OS policy assignment to install a Windows MSI downloaded from a Google Cloud Storage bucket
# on all VMs running Windows Server OS.
osPolicies:
  - id: install-msi-policy
    mode: ENFORCEMENT
    resourceGroups:
      - resources:
          - id: install-msi
            pkg:
              desiredState: INSTALLED
              msi:
                source:
                  gcs:
                    bucket: my-bucket
                    object: my-app.msi
                    generation: 1619136883923956
instanceFilter:
  inventories:
    - osShortName: windows
rollout:
  disruptionBudget:
    fixed: 10
  minWaitDuration: 300s

示例 2

创建操作系统政策分配任务,以验证 Apache Web 服务器是否正在所有 Linux 虚拟机上运行。

# An OS policy assignment that ensures Apache web server is running on Linux OSes.
# The assignment is applied only to those VMs that have the label `type:webserver` assigned to them.
osPolicies:
  - id: apache-always-up-policy
    mode: ENFORCEMENT
    resourceGroups:
      - resources:
          id: ensure-apache-is-up
          exec:
            validate:
              interpreter: SHELL
              # If Apache web server is already running, return an exit code 100 to indicate
              # that exec resource is already in desired state. In this scenario,
              # the `enforce` step will not be run.
              # Otherwise return an exit code of 101 to indicate that exec resource is not in
              # desired state. In this scenario, the `enforce` step will be run.
              script: if systemctl is-active --quiet httpd; then exit 100; else exit 101; fi
            enforce:
              interpreter: SHELL
              # Start Apache web server and return an exit code of 100 to indicate that the
              # resource is now in its desired state.
              script: systemctl start httpd && exit 100
instanceFilter:
  inclusionLabels:
    - labels:
        type: webserver
rollout:
  disruptionBudget:
    fixed: 10
  minWaitDuration: 300s

示例 3

创建在 CentOS 虚拟机上安装 Google Cloud Observability 代理的操作系统政策分配任务。

# An OS policy assignment that ensures google-cloud-ops-agent is running on all Centos VMs in the project
osPolicies:
  - id: cloudops-policy
    mode: ENFORCEMENT
    resourceGroups:
        resources:
          - id: add-repo
            repository:
              yum:
                id: google-cloud-ops-agent
                displayName: Google Cloud Ops Agent Repository
                baseUrl: https://packages.cloud.google.com/yum/repos/google-cloud-ops-agent-el7-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: google-cloud-ops-agent
          - id: exec-script
            exec:
              validate:
                script: |-
                  if [[ $(rpm --query --queryformat '%{VERSION}
                  ' google-cloud-ops-agent) == '1.0.2' ]]; then exit 100; else exit 101; fi
                interpreter: SHELL
              enforce:
                script:
                  sudo yum remove -y google-cloud-ops-agent || true; sudo yum install
                  -y 'google-cloud-ops-agent-1.0.2*' && exit 100
                interpreter: SHELL
          - id: ensure-agent-running
            exec:
              validate:
                script:
                  if (ps aux | grep 'opt[/].*google-cloud-ops-agent.*bin/'); then exit
                  100; else exit 101; fi
                interpreter: SHELL
              enforce:
                script: sudo systemctl start google-cloud-ops-agent.target && exit 100
                interpreter: SHELL
instanceFilter:
  inventories:
    - osShortName: centos
rollout:
  disruptionBudget:
    fixed: 10
  minWaitDuration: 300s

后续步骤