Padrão de ficheiro de variável partilhada

Reduza a repetição de valores partilhados nos seus ficheiros bicep. Em vez disso, carregue esses valores a partir de um ficheiro JSON partilhado no seu ficheiro Bicep. Ao utilizar matrizes, concatene os valores partilhados com valores específicos da implementação no seu código Bicep.

Contexto e problema

Quando escreve o código do Bicep, poderá ter variáveis comuns que reutiliza num conjunto de ficheiros Bicep. Pode duplicar os valores sempre que declarar o recurso, como copiar e colar os valores entre os seus ficheiros bicep. No entanto, esta abordagem é propensa a erros e, quando precisa de fazer alterações, tem de atualizar cada definição de recurso para mantê-la sincronizada com as outras.

Além disso, quando trabalha com variáveis definidas como matrizes, poderá ter um conjunto de valores comuns em vários ficheiros Bicep e também tem de adicionar valores específicos para o recurso que está a implementar. Quando mistura as variáveis partilhadas com as variáveis específicas do recurso, é mais difícil para alguém compreender a distinção entre as duas categorias de variáveis.

Solução

Crie um ficheiro JSON que inclua as variáveis que precisa de partilhar. Utilize a loadJsonContent() função para carregar o ficheiro e aceder às variáveis. Para variáveis de matriz, utilize a concat() função para combinar os valores partilhados com quaisquer valores personalizados para o recurso específico.

Exemplo 1: Prefixos de nomenclatura

Suponha que tem vários ficheiros Bicep que definem recursos. Tem de utilizar um prefixo de nomenclatura consistente para todos os seus recursos.

Defina um ficheiro JSON que inclua os prefixos de nomenclatura comuns que se aplicam em toda a sua empresa:

{
  "storageAccountPrefix": "stg",
  "appServicePrefix": "app"
}

No ficheiro Bicep, declare uma variável que importe os prefixos de nomenclatura partilhados:

var sharedNamePrefixes = loadJsonContent('./shared-prefixes.json')

Quando definir os nomes dos recursos, utilize a interpolação de cadeias para concatenar os prefixos de nomes partilhados com sufixos de nomes exclusivos:

var appServiceAppName = '${sharedNamePrefixes.appServicePrefix}-myapp-${uniqueString(resourceGroup().id)}'
var storageAccountName = '${sharedNamePrefixes.storageAccountPrefix}myapp${uniqueString(resourceGroup().id)}'

Exemplo 2: Regras do grupo de segurança de rede

Suponha que tem vários ficheiros Bicep que definem os seus próprios grupos de segurança de rede (NSG). Tem um conjunto comum de regras de segurança que têm de ser aplicadas a cada NSG e, em seguida, tem de adicionar regras específicas da aplicação.

Defina um ficheiro JSON que inclua as regras de segurança comuns que se aplicam em toda a sua empresa:

{
  "securityRules": [
    {
      "name": "Allow_RDP_from_company_IP_address",
      "properties": {
        "description": "Allow inbound RDP from the company's IP address range.",
        "protocol": "Tcp",
        "sourceAddressPrefix": "203.0.113.0/24",
        "sourcePortRange": "*",
        "destinationAddressPrefix": "VirtualNetwork",
        "destinationPortRange": "3389",
        "access": "Allow",
        "priority": 100,
        "direction": "Inbound"
      }
    },
    {
      "name": "Allow_VirtualNetwork_to_Storage",
      "properties": {
        "description": "Allow outbound connections to the Azure Storage service tag.",
        "protocol": "Tcp",
        "sourceAddressPrefix": "VirtualNetwork",
        "sourcePortRange": "*",
        "destinationAddressPrefix": "Storage",
        "destinationPortRange": "*",
        "access": "Allow",
        "priority": 100,
        "direction": "Outbound"
      }
    }
    // other rules here
  ]
}

No ficheiro Bicep, declare uma variável que importe as regras de segurança partilhadas:

var sharedRules = loadJsonContent('./shared-rules.json', 'securityRules')

Crie uma matriz variável que represente as regras personalizadas para este NSG específico:

var customRules = [
  {
    name: 'Allow_Internet_HTTPS_Inbound'
    properties: {
      description: 'Allow inbound internet connectivity for HTTPS only.'
      protocol: 'Tcp'
      sourcePortRange: '*'
      destinationPortRange: '443'
      sourceAddressPrefix: 'Internet'
      destinationAddressPrefix: 'VirtualNetwork'
      access: 'Allow'
      priority: 400
      direction: 'Inbound'
    }
  }
]

Defina o recurso NSG. Utilize a concat() função para combinar as duas matrizes e definir a securityRules propriedade:

resource nsg 'Microsoft.Network/networkSecurityGroups@2021-08-01' = {
  name: nsgName
  location: location
  properties: {
    securityRules: concat(sharedRules, customRules)
  }
}

Considerações

  • Quando utilizar esta abordagem, o ficheiro JSON será incluído no modelo do ARM gerado pelo Bicep. Os modelos do ARM JSON gerados pelo Bicep têm um limite de ficheiros de 4 MB, pelo que é importante evitar a utilização de ficheiros de variáveis partilhadas grandes.
  • Certifique-se de que as matrizes de variáveis partilhadas não entram em conflito com os valores de matriz especificados em cada ficheiro Bicep. Por exemplo, ao utilizar o padrão do conjunto de configuração para definir grupos de segurança de rede, certifique-se de que não tem várias regras que definem a mesma prioridade e direção.

Passos seguintes

Saiba mais sobre o padrão do conjunto de configuração.