Compartilhar via


Padrão de arquivo de variável compartilhada

Reduza a repetição de valores compartilhados nos arquivos Bicep. Para isso, carregue neles os valores de um arquivo JSON compartilhado. Ao usar matrizes, concatene os valores compartilhados com valores específicos de implantação no código Bicep.

Contexto e problema

Ao escrever o código Bicep, você pode reutilizar variáveis comuns em um conjunto de arquivos Bicep. Você pode duplicar os valores toda vez que declarar o recurso, por exemplo, copiando e colando os valores entre os arquivos Bicep. No entanto, essa abordagem é propensa a erros. Quando você faz alterações, precisa atualizar cada definição de recurso para mantê-la sincronizada com as outras.

Além disso, quando trabalha com variáveis definidas como matrizes, você pode ter um conjunto de valores comuns em vários arquivos Bicep e também precisar adicionar valores específicos para o recurso que está sendo implantado. Ao combinar as variáveis compartilhadas com as específicas do recurso, fica mais difícil de entender a distinção entre as duas categorias.

Solução

Crie um arquivo JSON que inclua as variáveis que você precisa compartilhar. Use a função loadJsonContent() para carregar o arquivo e acessar as variáveis. Para variáveis de matriz, use a função concat() para combinar os valores compartilhados com os valores personalizados do recurso específico.

Exemplo 1: prefixos de nomenclatura

Suponha que você tenha vários arquivos Bicep que definem recursos. Você precisa usar um prefixo de nomenclatura consistente para todos os recursos.

Defina um arquivo JSON que inclui os prefixos de nomenclatura comuns que se aplicam em sua empresa:

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

No arquivo Bicep, declare uma variável que importa os prefixos de nomenclatura compartilhados:

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

Ao definir os nomes de recursos, use a interpolação de cadeia de caracteres para concatenar os prefixos de nomes compartilhados com os 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 você tenha vários arquivos Bicep que definem seus próprios grupos de segurança de rede (NSG). Você tem um conjunto comum de regras de segurança que devem ser aplicadas a cada NSG e também tem regras específicas do aplicativo que devem ser adicionadas.

Defina um arquivo JSON que inclui as regras de segurança comuns que se aplicam em 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 arquivo Bicep, declare uma variável que importa as regras de segurança compartilhadas:

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

Crie uma matriz de 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 de NSG. Use a função concat() para combinar as duas matrizes e defina a propriedade securityRules:

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

Considerações

  • Ao usar essa abordagem, o arquivo JSON é incluído no modelo do ARM gerado pelo Bicep. Os modelos do ARM em JSON gerados pelo Bicep têm um limite de arquivo de 4 MB, portanto, é importante evitar o uso de arquivos de variáveis compartilhadas grandes.
  • Verifique se suas matrizes de variáveis compartilhadas não estão em conflito com os valores de matriz especificados em cada arquivo Bicep. Por exemplo, ao usar o padrão de conjunto de configuração para definir grupos de segurança de rede, certifique-se de não ter várias regras que definam a mesma prioridade e direção.

Próximas etapas

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