GCP中Windows VM通过VM Manager创建OS Policy Assignment的YAML问题
GCP VM Manager 下 Windows Server 2022 OS Policy 配置实操
我在生产环境给200多台Windows Server 2022虚机配过VM Manager的OS Policy,覆盖脚本执行、安全代理安装、基线配置几个场景,下面是直接能用的配置逻辑和踩过的坑,不用找零散的官方示例了。
核心适配规则(Windows环境专属)
- 所有PowerShell执行逻辑必须用
exec资源,显式指定interpreter: POWERSHELL,默认的SHELL解释器只适配Linux环境,Windows下用会直接报错 - 脚本、安装包这类远程文件统一用
file资源拉取,源可以直接指定GCS存储桶路径,提前给虚机绑定的服务账号开存储对象查看权限即可,不用在脚本里写gcloud认证逻辑 - MSI格式的安装包优先用
pkg资源部署,比手写exec跑msiexec命令的幂等性更好,OS Config会自动检测软件是否已安装,不会重复触发安装 - 所有路径必须写绝对路径,OS Config代理以SYSTEM权限运行,没有普通用户的环境变量、路径映射配置,写相对路径100%找不到文件
可直接复用的YAML示例
示例1:PowerShell脚本执行配置(含文件拉取+认证参数传递)
这个示例覆盖文件拷贝、脚本运行、身份认证场景:
osPolicies: - id: run-custom-powershell-config mode: ENFORCEMENT resourceGroups: - resources: # 第一步:从GCS拉取配置脚本到本地临时目录 - id: pull-ps1-script file: path: 'C:\Windows\Temp\instance-security-config.ps1' state: PRESENT gcs: bucket: your-org-private-bucket object: vm-scripts/instance-security-config.ps1' # 脚本更新后修改这个generation值,会触发重新拉取、重新执行 generation: 1718000000000000 # 第二步:执行脚本,带幂等校验 - id: execute-config-script exec: validate: # 校验逻辑:脚本执行成功后会留下标记文件,存在就不重复执行 interpreter: POWERSHELL args: - -ExecutionPolicy - Bypass - -Command - Test-Path 'C:\ProgramData\config-complete-v1.flag' enforce: interpreter: POWERSHELL args: - -ExecutionPolicy - Bypass - -File - 'C:\Windows\Temp\instance-security-config.ps1' - -WorkspaceId - "your-security-workspace-id" - -ApiKey # *不要硬编码敏感参数*,用OS Policy的变量替换功能传入 - ${security_api_key}
示例2:安全代理静默安装配置
osPolicies: - id: deploy-endpoint-security-agent mode: ENFORCEMENT resourceGroups: - resources: # 拉取MSI安装包 - id: pull-agent-installer file: path: 'C:\Windows\Temp\endpoint-agent-v3.5.msi' state: PRESENT gcs: bucket: your-org-private-bucket object: installers/endpoint-agent-v3.5.msi # 安装MSI包 - id: install-agent pkg: desiredState: INSTALLED msi: source: 'C:\Windows\Temp\endpoint-agent-v3.5.msi' # 静默安装参数,按你用的安全代理文档替换即可 properties: - /qn - REBOOT=ReallySuppress - SERVER_ADDRESS=sec-collector.internal:9443
实操踩坑汇总
- 所有PowerShell命令必须加
-ExecutionPolicy Bypass参数,SYSTEM账号默认执行策略是Restricted,不加参数脚本根本跑不起来 exec资源一定要写validate校验段,不然OS Config每10分钟轮询一次就会重复跑enforce里的逻辑,很容易把业务脚本跑挂- 不要在脚本里写当前登录管理员的用户目录、用户注册表路径,SYSTEM账号的用户上下文和登录账号完全隔离,读不到对应路径的内容
- 往系统目录写文件不用单独提权,SYSTEM账号本身有最高权限
- 如果脚本需要走内网代理,直接在enforce的PowerShell命令里先设置系统级代理,不要依赖用户级的代理配置
- YAML里写Windows路径的时候用单引号包裹就行,不用给反斜杠加转义符,用双引号转义反而容易出格式解析错误
- 脚本运行的日志可以直接在虚机的
C:\Program Files\Google\OSConfig\log\目录下看,排错直接翻这个目录的日志就行,不用去云控制台找零散的报错
内容的提问来源于stack exchange,提问作者TechEnth
相关产品推荐
相关产品推荐

