我不确定是否有正确的答案,而且每个场景都会有所不同,但我很好奇,因为我找不到太多关于代码优先的azure二头肌基础设施的文档。您发现的大多数示例都显示了如何在资源组中创建资源,或者使用模块定义范围并部署到另一个资源组,但如果您正在尝试做更多呢?
让我们做以下场景:使用2个订阅(1个用于prod,1个用于dev&qa),每个订阅有20个资源组,每个资源组包含多个差异资源,并且您希望在CI/CD管道中管理这一点,再加上3个环境:prod、qa和dev。您将如何做到这一点?我能想到一些场景,但不一定,但没有什么是最好的方法,也许我错过了什么。
CI/CD部分:
假设:
- az帐户集-订阅(设置我们的子帐户)
- az group create--name--location(如果资源组不存在,则创建资源组)
- az部署组create--name--resource group--template file--parameters(从我们的文件中读取以部署到资源组)
- 如果资源组不存在,可以传递一个资源组数组进行循环以创建该资源组
- 您可以将资源组列表放在从中读取的参数文件中,然后执行与上面相同的操作
- 你可以为每个资源组及其内部的资源创建一个步骤。(似乎太过分了?)
肱二头肌部分:
Bicept restrictions:要指定范围(在我们的场景中是一个资源组),我们必须使用处理多个资源组的模块,或者为每个资源组设置一个步骤,并为不同的资源组/资源设置一个main.Bicep文件。
- 您可以使用main.bicep为每个资源组及其内部的资源创建一个文件夹结构,但这意味着您有很多额外的部署步骤(似乎太多了?)
- 您可以有一个main.bicep文件,并有一个文件夹结构,该结构使用大量模块来指定您的范围,同时使用environmentparameters.json文件读取资源组、资源变量等
- 您可以为每个环境创建一个文件夹,在每个环境中都有文件夹,然后不使用parameters.json而是在每个文件中使用params来创建每个资源组及其内部的资源,因为它们对每个环境都是特定的
1最终发行:
最后,假设您想在部署资源之前添加一个步骤来使用bicep what-if来检查哪些资源将被更新或删除(这非常重要!)。上次我检查了一个问题,假设二头肌模块不起作用,所以你们不会奢侈地知道在部署假设之前会做什么改变。这是一个相当大的安全网,你会失去它,所以你想把模块策略放在一起吗?
解决这样的问题的最佳方法是什么,同时保持它的可读性,让普通的非专家能够参与进来并进行研究?我倾向于使用模块和从环境中读取parameters.json来创建文件夹结构,但我不相信这是最好的方法,尤其是如果二头肌模块不能完全工作的话。
IMO这在很大程度上取决于场景、拓扑结构、权限等;"环境";这在dev/test和prod之间会有所不同。该env有多个resourceGroup,每个env都有一个专用订阅。
在这种情况下,我将使用单个二头肌";项目";(例如带有模块的main.bicep),并使用参数文件更改部署(对于dev/test与prod)。该项目将列出环境所需的一切(想想绿地)。main.bicep
文件是一个订阅范围的部署,它将创建RG和所需的所有资源。过于简单的例子:
targetScope = 'subscription'
param sqlAdminUsername string'
param keyVaultResourceGroup
param keyVaultName string
param keyVaultSecretName string
param location string = deployment().location
resource kv 'Microsoft.KeyVault/vaults@2021-06-01-preview' existing = {
scope: resourceGroup(subscription().subscriptionId, keyVaultResourceGroup)
name: keyVaultName
}
resource sqlResourceGroup 'Microsoft.Resources/resourceGroups@2021-04-01' = {
name: 'shared-sql'
location: location
}
resource webResourceGroup 'Microsoft.Resources/resourceGroups@2021-04-01' = {
name: 'shared-web'
location: location
}
module sqlDeployment 'modules/shared-sql.bicep' = {
scope: resourceGroup(sqlResourceGroup.name)
name: 'sqlDeployment'
params: {
sqlAdminUsername: sqlAdminUsername
sqlAdminPassword: kv.getSecret(keyVaultSecretName)
location: location
}
}
module webDeployment 'modules/shared-web.bicep' = {
scope: resourceGroup(webResourceGroup.name)
name: 'webDeployment'
params: {
location: location
}
}
单个模板+模块创建RG,创建SQL Server(通过模块)和带有管理网站的应用程序服务计划(也通过模块)。然后,您可以为每个环境参数化您想要的任何内容。
re:what-if
-如果某个模块的参数是另一个模块的输出,则会跳过对该模块的评估。如果不在模块之间传递输出,则模块将由what-if
进行评估。上面的示例不传递输出-通常您不需要这样做,因为父级(即main.bicep
)知道信息输出,但有时您无法避免它-ymmv。
一旦以这种方式设计了模板,管道就非常简单了——只需将模板部署到所需的订阅即可。
那个帮助?