使用BICEP实现Azure资源自动创建 - policy和role assignment

网友投稿 271 2022-09-29

使用BICEP实现Azure资源自动创建 - policy和role assignment

BICEP可以拿出来写的东西其实还是挺多的,时不时用到点啥东西就可以拿出来分享下,这次用到的就是使用BICEP创建policy和role assignment,这两个资源和之前创建的VM,storage等还是有点区别的,VM,storage一般都只需要部署到resource group里即可,但是policy和role assignment是可能在subscription甚至manage group层面来部署的,如果想在这个层面部署资源,那么就要说下BICEP里scope的概念

这点其实和ARM Template是完全一致的,之前介绍的内容里都是把资源部署到resource group层面,但是如果想部署resource group呢?这种情况下就应该用subscription级别的部署,ARM Template和BICEP中有四个可以部署的scope,分别是

resource groupsubscriptionmanage grouptenant

部署用到的命令分别是

az deployment group create az deployment sub create az deployment mg create az deployment tenant create

除了部署用到的命令不一样之外,在BICEP模板中也要指定好target scope

就拿这次要介绍的policy和role assignment举例

首先来看policy的部署,本次示例目的是在subscription级别部署一个policy,然后assign给某一个subscription,因此在部署的模板里就要指定部署的target是subscription level

targetScope = 'subscription' //注意这里指定了部署范围是subscriptionvar policyDefinitionName = 'DenyStorageCoolTier'var policyAssignmentName = 'DenyStorageCoolTier'resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2020-03-01' = { name: policyDefinitionName properties: { policyType: 'Custom' mode: 'All' parameters: {} displayName: 'deny cool access tier' description: 'deny cool access tier for storage accounts in subcription' policyRule: { if: { allOf: [ { field: 'type' equals: 'Microsoft.Storage/storageAccounts' } { field: 'kind' equals: 'BlobStorage' } { field: 'Microsoft.Storage/storageAccounts/accessTier' equals: 'cool' } ] } then: { effect: 'deny' } } }}resource policyAssignment 'Microsoft.Authorization/policyAssignments@2020-03-01' = { name: policyAssignmentName properties: { policyDefinitionId: policyDefinition.id }}

而在部署的时候要用到的命令就变成了az deployment sub,首先来用what if检查下

az deployment sub what-if --template-file .\denycool.bicep --location eastasia

部署完成

az deployment sub create --template-file .\denycool.bicep --location eastasia

在portal也可以看到相关的资源了

同样的,如果是role assignment,比如要给service principal授权访问subscription甚至是manage group,都可以通过指定target scope然后配合对应部署命令的形式,或者更灵活的方法是写成module,然后直接在BICEP文件里就指定scope

targetScope = 'subscription'@description('Service principal object id')param principalId string@description('roleDefinition for the assignment - reader role assigned')param roleDefinitionId string = 'acdd72a7-3385-48ef-bd42-f606fba81ae7'var roleAssignmentName = guid(subscription().id, principalId, roleDefinitionId)resource roleAssignment 'Microsoft.Authorization/roleAssignments@2021-04-01-preview' = { name: roleAssignmentName properties: { principalType: 'ServicePrincipal' roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', roleDefinitionId) principalId: principalId description: 'assign reader role to service principal for resource access purpose' }}

主义需要在参数里指定被授权的service principal的object id

az deployment sub what-if --template-file .\role.bicep --location eastasia --parameters principalId= ''

az deployment sub create --template-file .\role.bicep --location eastasia --parameters principalId= ''

之后在portal是可以看到对应的信息的

如果想在mg层面授权的话,那么就把target scope改成mg,然后使用对应的az deployment mg 命令来部署就行了,总体来说并不复杂

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:3分钟搞懂中台#yyds干货盘点#
下一篇:java实现日历应用程序设计
相关文章

 发表评论

暂时没有评论,来抢沙发吧~