Manipular diferenças entre ambientes usando parâmetros Bicep

Concluído

Você já aprendeu sobre os parâmetros do Bíceps. Eles ajudam a especificar valores que podem mudar entre implantações de seus arquivos Bicep.

Os parâmetros são comumente usados para suportar as diferenças entre seus ambientes. Por exemplo, em seus ambientes que não são de produção, você geralmente deseja implantar SKUs baratas de seus recursos do Azure. Na produção, você deseja implantar SKUs que tenham melhor desempenho. E você pode querer usar nomes diferentes para recursos em cada ambiente.

Ao implantar o arquivo Bicep, você fornece valores para cada parâmetro. Há várias opções para especificar os valores para cada parâmetro do pipeline e como especificar valores separados para cada ambiente. Nesta unidade, você aprenderá sobre as abordagens para especificar valores de parâmetros Bicep em um pipeline de implantação.

Arquivos de parâmetros

Um arquivo de parâmetro é um arquivo formatado em JSON que lista os valores de parâmetro que você deseja usar para cada ambiente. Você envia o arquivo de parâmetro para o Azure Resource Manager quando envia a implantação.

Aqui está um arquivo de parâmetro de exemplo:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "reviewApiUrl": {
      "value": "https://sandbox.contoso.com/reviews"
    }
  }
}

Os arquivos de parâmetros podem ser confirmados no repositório Git junto com o arquivo Bicep. Em seguida, você pode consultar o arquivo de parâmetros em seu modelo de pipeline onde você executa sua implantação.

É uma boa ideia estabelecer uma estratégia consistente de nomenclatura de ambiente para arquivos de parâmetro. Por exemplo, você pode nomear seus parâmetros de arquivos de parâmetro. ENVIRONMENT_NAME.json, como parâmetros. Produção.json. Em seguida, você pode usar um parâmetro de modelo de pipeline para selecionar automaticamente o arquivo de parâmetro correto.

parameters: 
- name: environmentType
  type: string
- name: serviceConnectionName
  type: string
- name: resourceGroupName
  type: string

- stage: Deploy
  jobs:
  - deployment: DeployWebsite
    displayName: Deploy Website
    environment: Website
    strategy:
      runOnce:
        deploy:
          steps:
            - checkout: self
            - task: AzureCLI@2
              name: DeployBicepFile
              displayName: Deploy Bicep file
              inputs:
                azureSubscription: ${{parameters.serviceConnectionName}}
                scriptType: 'bash'
                scriptLocation: 'inlineScript'
                inlineScript: |
                  az deployment group create \
                    --resource-group ${{parameters.resourceGroupName}} \
                    --template-file deploy/main.bicep \
                    --parameters deploy/azuredeploy.parameters.${{parameters.environmentType}}.json

Quando você usa arquivos de parâmetro, seus arquivos YAML de pipeline não precisam conter uma lista de parâmetros que precisam ser passados para suas etapas de implantação individualmente. Isso é útil quando você tem um grande número de parâmetros.

Um arquivo de parâmetro mantém os valores de parâmetro juntos em um único arquivo JSON. Os arquivos de parâmetros também fazem parte do seu repositório Git, para que possam obter versões da mesma forma que todos os outros códigos.

Importante

Os arquivos de parâmetros não devem ser usados para valores seguros. Não há como proteger os valores dos segredos nos arquivos de parâmetros, e você nunca deve confirmar segredos em seu repositório Git.

Variáveis do pipeline

O Azure Pipelines permite armazenar variáveis de pipeline, que são úteis para valores que podem ser diferentes entre ambientes. Eles também são úteis para valores que você deseja definir apenas uma vez e, em seguida, reutilizar em todo o pipeline. O Azure Pipelines dá suporte a várias maneiras de definir variáveis.

Variáveis definidas em um arquivo YAML

Você pode definir variáveis e definir seus valores dentro de um arquivo YAML. Isso é útil quando você precisa reutilizar o mesmo valor várias vezes. Mas, como os arquivos de parâmetros Bicep, os arquivos YAML não são adequados para segredos.

Variáveis definidas na interface web

Você pode definir variáveis usando a interface da Web do Azure DevOps. Você pode alterar os valores das variáveis a qualquer momento, e o pipeline lerá os valores atualizados na próxima vez que for executado.

As variáveis definidas por meio da interface da Web podem ser marcadas como secretas, o que diz ao Azure Pipelines para tentar ocultar os valores das variáveis nos logs de pipeline. Isso significa que você pode armazenar valores que seu arquivo Bicep aceita como parâmetros com o @secure() decorador.

Aviso

Por padrão, o Azure Pipelines ofusca valores de variáveis secretas em logs de pipeline, mas você também precisa seguir boas práticas. As etapas do pipeline têm acesso a todos os valores variáveis, incluindo segredos. Se o pipeline incluir uma etapa que não manipula uma variável segura com segurança, há uma chance de a variável secreta ser mostrada nos logs do pipeline.

Grupos de variáveis

Você também pode definir grupos de variáveis, que são conjuntos de variáveis. Como variáveis, você define esses grupos usando a interface Web do Azure DevOps. Você também pode usar grupos variáveis para armazenar segredos com segurança. Os grupos de variáveis podem até ser reutilizados em vários pipelines no mesmo projeto do Azure DevOps.

Ao contrário de outras variáveis, você precisa importar explicitamente um grupo de variáveis para um pipeline usando a group palavra-chave em uma variables seção, como esta:

variables:
- group: MyVariableGroup

Ao trabalhar com modelos de pipeline, você pode nomear seus grupos de variáveis para que possa carregá-los facilmente usando um parâmetro de modelo. Por exemplo, suponha que seu pipeline seja implantado em dois ambientes e você precise definir um conjunto de variáveis para cada ambiente. Você pode nomear seus grupos de variáveis com os nomes de ambiente incluídos, desta forma:

Nome do ambiente Nome do grupo de variáveis
Teste ToyWebsiteTest
Produção ToyWebsiteProduction

Em cada um desses grupos de variáveis, você adiciona variáveis com os mesmos nomes, mas com valores diferentes para cada ambiente.

Seu arquivo de modelo de pipeline usa a macro para selecionar o grupo de variáveis correto a {{ parameters.PARAMETER_NAME }} ser importado:

parameters: 
- name: environmentType
  type: string
  default: 'Test'

variables: 
- group: ToyWebsite${{ parameters.environmentType }}

Grupos de variáveis do Key Vault

Você pode vincular grupos de variáveis ao Cofre de Chaves do Azure. Os segredos no cofre de chaves são disponibilizados como variáveis no grupo de variáveis. Os segredos podem então ser usados em seus pipelines como se fossem variáveis normais.

O Key Vault torna a gestão dos seus segredos mais segura. Ele também permite que esses valores sejam gerenciados por sua equipe de segurança e para separar o acesso aos seus pipelines dos segredos que ele usa.

Mais etapas são necessárias para vincular um grupo de variáveis a um cofre de chaves. Essas etapas incluem a criação de uma conexão de serviço que tenha permissão para ler os segredos do cofre de chaves. Na unidade de resumo, fornecemos um link para mais detalhes sobre como configurar grupos de variáveis do Cofre de Chaves.

Usar variáveis em seu pipeline

Independentemente de como você define uma variável, você acessa seu valor em seu pipeline usando a $(VariableName) sintaxe. Por exemplo, ao executar uma implantação do Bicep, você pode usar uma variável para especificar o valor de um parâmetro:

- stage: Deploy
  jobs:
  - deployment: DeployWebsite
    displayName: Deploy Website
    environment: Website
    strategy:
      runOnce:
        deploy:
          steps:
            - checkout: self
            - task: AzureCLI@2
              name: DeployBicepFile
              displayName: Deploy Bicep file
              inputs:
                azureSubscription: MyServiceConnection
                scriptType: 'bash'
                scriptLocation: 'inlineScript'
                inlineScript: |
                  az deployment group create \
                    --resource-group $(ResourceGroupName) \
                    --template-file deploy/main.bicep \
                    --parameters environmentType=$(EnvironmentType)

Qual é a melhor abordagem?

Você aprendeu sobre várias maneiras de lidar com os parâmetros que seu arquivo Bicep precisa para sua implantação. É útil entender quando você pode usar qual abordagem.

Evite parâmetros desnecessários

Os parâmetros ajudam a tornar seus arquivos Bicep reutilizáveis, mas é fácil definir muitos parâmetros. Ao implantar um arquivo Bicep, você precisa fornecer um valor para cada parâmetro. Em implantações complexas em vários ambientes, fica difícil gerenciar um grande conjunto de valores de parâmetros individuais.

Considere tornar os parâmetros opcionais onde puder e use valores padrão que se aplicam à maioria dos seus ambientes. Você pode então evitar a necessidade de seus pipelines passarem valores para os parâmetros.

Além disso, tenha em mente que os parâmetros são frequentemente usados no Bicep quando os recursos precisam se conectar a outros recursos. Por exemplo, se você tiver um site que precisa se conectar a uma conta de armazenamento, precisará fornecer o nome da conta de armazenamento e a chave de acesso. As chaves são valores seguros. No entanto, considere estas outras abordagens ao implantar essa combinação de recursos:

  • Use a identidade gerenciada do site para acessar a conta de armazenamento. Quando você cria uma identidade gerenciada, o Azure gera e gerencia automaticamente suas credenciais. Essa abordagem simplifica as configurações de conexão. Isso também significa que você não precisa lidar com segredos, por isso é a opção mais segura.
  • Implante a conta de armazenamento e o site juntos no mesmo modelo Bicep. Use os módulos Bicep para manter o site e os recursos de armazenamento juntos. Em seguida, você pode procurar automaticamente os valores para o nome da conta de armazenamento e a chave dentro do código Bicep, em vez de passar parâmetros.
  • Adicione os detalhes da conta de armazenamento a um cofre de chaves como um segredo. Em seguida, o código do site carrega a chave de acesso diretamente do cofre. Essa abordagem evita a necessidade de gerenciar a chave no pipeline.

Usar grupos de variáveis para pequenos conjuntos de parâmetros

Se você tiver apenas alguns parâmetros para seus arquivos Bicep, considere usar um grupo de variáveis. Você pode armazenar valores secretos e não secretos em grupos de variáveis.

Use arquivos de parâmetros para grandes conjuntos de parâmetros

Se você tiver um grande conjunto de parâmetros para seus arquivos Bicep, considere o uso de arquivos de parâmetros para manter os valores não seguros juntos para cada ambiente. Em seguida, sempre que precisar alterar os valores, você pode atualizar um arquivo de parâmetros e confirmar sua alteração.

Essa abordagem mantém as etapas do pipeline mais simples, porque você não precisa definir explicitamente o valor para cada parâmetro.

Armazene segredos de forma segura

Use um processo apropriado para armazenar e manusear segredos. Se você tiver apenas alguns segredos para gerenciar, as variáveis e grupos de variáveis do Azure Pipelines geralmente funcionam bem. Mas você pode ter requisitos mais complexos, como um grande número de segredos, muitos ambientes diferentes ou restrições de controle de acesso. Para essas situações, considere armazenar os segredos de cada ambiente em cofres de chaves separados. Use grupos de variáveis para vincular os cofres ao seu pipeline.

Para parâmetros seguros, lembre-se de passar explicitamente cada parâmetro para suas etapas de implantação.

Combinar abordagens

É comum combinar várias abordagens para lidar com seus parâmetros. Por exemplo, você pode armazenar a maioria dos valores de parâmetro em arquivos de parâmetros e, em seguida, definir valores seguros usando um grupo de variáveis. O exemplo a seguir ilustra a combinação:

variables:
- group: MyVariableGroup # This group imports a parameter named MySecureParameter.

stages:

- stage: Deploy
  jobs:
  - deployment: DeployWebsite
    displayName: Deploy Website
    environment: Website
    strategy:
      runOnce:
        deploy:
          steps:
            - checkout: self
            - task: AzureCLI@2
              name: DeployBicepFile
              displayName: Deploy Bicep file
              inputs:
                azureSubscription: MyServiceConnection
                scriptType: 'bash'
                scriptLocation: 'inlineScript'
                inlineScript: |
                  az deployment group create \
                    --resource-group ${{parameters.resourceGroupName}} \
                    --template-file deploy/main.bicep \
                    --parameters deploy/azuredeploy.parameters.${{parameters.environmentName}}.json \
                                 mySecureParameter=$(MySecureParameter)

Há regras especiais sobre como os nomes de conexão de serviço podem ser especificados. Essas regras podem afetar a forma como você usa nomes em pipelines que implantam em vários ambientes. Por exemplo, você não pode usar uma variável definida dentro de um grupo de variáveis para especificar um nome de conexão de serviço. Você pode usar parâmetros de modelo de pipeline para especificar o nome da conexão de serviço a ser usada.