Azure Policy未正确定位Windows VM:合规性判断异常咨询
问题分析与解决方案
你遇到的问题核心是Policy的逻辑方向搞反了,不是equals操作符的理解错误,而是你当前的规则完全偏离了「检查混合使用权益是否启用」的目标。
为什么会出现这个奇怪的不合规提示?
Azure Policy的audit效果是:当if里的条件满足时,会把该资源标记为「不合规」。你当前的if条件是匹配所有Windows虚拟机,所以所有这类VM都会触发audit,系统提示里的内容其实是在告诉你:「这个VM的osType确实等于Windows,符合你设定的if条件,所以标记为不合规」——这是Policy的正常行为,只是你的逻辑目标错了。
正确的Policy逻辑应该怎么写?
你真正想要的是:标记那些是Windows虚拟机,但未启用混合使用权益(HUB)的资源。所以if条件需要同时满足三个规则:
- 资源类型是
Microsoft.Compute/virtualMachines - OS类型是Windows
- 并且
licenseType字段不等于Windows_Server(启用HUB的Windows VM,这个字段会被设置为Windows_Server;未启用的话,这个字段要么不存在,要么为空)
对应的Policy片段应该是这样:
"if": { "allOf": [ { "field": "type", "equals": "Microsoft.Compute/virtualMachines" }, { "field": "Microsoft.Compute/virtualMachines/storageProfile.osDisk.osType", "equals": "Windows" }, { "anyOf": [ { "field": "Microsoft.Compute/virtualMachines/licenseType", "notEquals": "Windows_Server" }, { "field": "Microsoft.Compute/virtualMachines/licenseType", "exists": false } ] } ] }, "then": { "effect": "audit" }
补充说明
这个逻辑对你提到的「迁移而来、与现有镜像产品无关联的VM」同样有效,因为不管VM的镜像来源如何,只要启用了混合使用权益,licenseType字段就会被设置为Windows_Server;未启用的话,该字段要么不存在,要么为空值,这样的资源就会被正确标记为不合规。
内容的提问来源于stack exchange,提问作者Bas van der Kruijssen
相关产品推荐
相关产品推荐

