Hantera skillnader mellan miljöer med hjälp av Bicep-parametrar
Du har redan lärt dig om Bicep-parametrar. De hjälper dig att ange värden som kan ändras mellan distributioner av dina Bicep-filer.
Parametrar används ofta för att stödja skillnaderna mellan dina miljöer. I dina icke-produktionsmiljöer vill du till exempel ofta distribuera billiga SKU:er för dina Azure-resurser. I produktion vill du distribuera SKU:er som har bättre prestanda. Och du kanske vill använda olika namn för resurser i varje miljö.
När du distribuerar Bicep-filen anger du värden för varje parameter. Det finns flera alternativ för hur du anger värdena för varje parameter från arbetsflödet och hur du anger separata värden för varje miljö. I den här lektionen får du lära dig mer om metoderna för att ange Bicep-parametervärden i ett distributionsarbetsflöde.
Parameterfiler
En parameterfil är en JSON-formaterad fil som visar de parametervärden som du vill använda för varje miljö. Du skickar parameterfilen till Azure Resource Manager när du skickar distributionen.
Här är en exempelparameterfil:
{
"$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"
}
}
}
Parameterfiler kan checkas in på din Git-lagringsplats tillsammans med din Bicep-fil. Du kan sedan referera till parameterfilen i arbetsflödesmallen där du kör distributionen.
Det är en bra idé att upprätta en konsekvent strategi för miljönamngivning för parameterfiler. Du kan till exempel namnge parametrarna för parameterfiler . ENVIRONMENT_NAME.json, till exempel parametrar. Production.json. Sedan kan du använda indata för en arbetsflödesmall för att automatiskt välja rätt parameterfil baserat på ett indatavärde.
on:
workflow_call:
inputs:
environmentType:
required: true
type: string
# ...
jobs:
deploy:
runs-on: ubuntu-latest
steps:
# ...
- uses: azure/arm-deploy@v1
with:
failOnStdErr: false
resourceGroupName: ${{ inputs.resourceGroupName }}
template: ./deploy/main.bicep
parameters: ./deploy/azuredeploy.parameters.${{ inputs.environmentType }}.json
När du använder parameterfiler behöver dina YAML-arbetsflödesfiler inte innehålla en lista med parametrar som måste skickas till distributionsstegen individuellt. Detta är särskilt användbart när du har ett stort antal parametrar.
En parameterfil håller ihop parametervärdena i en enda JSON-fil. Parameterfilerna är också en del av din Git-lagringsplats, så att de kan få versionshantering på samma sätt som all annan kod.
Viktigt!
Parameterfiler ska inte användas för säkra värden. Det finns inget sätt att skydda värdena för hemligheterna i parameterfilerna och du bör aldrig checka in hemligheter till din Git-lagringsplats.
Arbetsflödesvariabler
Med GitHub Actions kan du lagra arbetsflödesvariabler, som är användbara för värden som kan skilja sig åt mellan miljöer. De är också användbara för värden som du bara vill definiera en gång och sedan återanvända i hela arbetsflödet.
Variabler som definierats i en YAML-fil
Du kan definiera variabler och ange deras värden i en YAML-fil. Detta är användbart när du behöver återanvända samma värde flera gånger. Du kan definiera en variabel för ett helt arbetsflöde, ett jobb eller ett enda steg:
env:
MyVariable1: value1
jobs:
deploy:
runs-on: ubuntu-latest
env:
MyVariable2: value2
steps:
- run: echo Hello world!
env:
MyVariable3: value3
Hemligheter som definierats i webbgränssnittet
Precis som Bicep-parameterfiler är YAML-filer inte lämpliga för hemligheter. I stället kan du definiera hemligheter med hjälp av GitHub-webbgränssnittet. Du kan ändra variabelvärdena när som helst och arbetsflödet läser de uppdaterade värdena nästa gång det körs. GitHub Actions försöker dölja hemligheternas värden i arbetsflödesloggarna. Det innebär att du kan lagra värden som Bicep-filen sedan accepterar som parametrar med dekoratören @secure()
.
Varning
Som standard fördunklar GitHub Actions hemliga variabelvärden i arbetsflödesloggar, men du måste också följa god praxis. Arbetsflödesstegen har åtkomst till hemligheternas värden. Om arbetsflödet innehåller ett steg som inte hanterar en hemlighet på ett säkert sätt finns det en risk att det hemliga värdet visas i arbetsflödesloggarna. Du bör alltid noggrant granska eventuella ändringar i en arbetsflödesdefinitionsfil för att kontrollera att hemligheterna inte hanteras felaktigt.
När du skapar en hemlighet kan du med GitHub välja om du vill begränsa den till hela Git-lagringsplatsen eller till en specifik miljö. Hemligheter med miljöomfattning följer de skyddsregler som du konfigurerar i dina miljöer, så om du konfigurerar en obligatorisk granskningsregel kan ett arbetsflöde inte komma åt hemligheterna förrän den angivna GitHub-användaren har godkänt din pipeline för distribution till den miljön.
Hemligheter med miljöomfattning kan vara till hjälp, men de fungerar inte enkelt med Azure Resource Manager:s validering före start eller konsekvensåtgärder. Dessa åtgärder måste kommunicera med Azure, vilket innebär att de behöver en arbetsbelastningsidentitet. Du vill vanligtvis ge distributionsgodkännande efter att förhandsvalidering eller konsekvensåtgärder har slutförts, så att du men har en hög grad av förtroende för de ändringar som du distribuerar. Så om du använder hemligheter med miljöomfattning sker den mänskliga granskningsprocessen för tidigt i arbetsflödet.
Därför använder du inte miljöomfattningshemligheter i den här modulens övningar. I stället skapar du lagringsplatsomfattande hemligheter med förutsägbara namn som innehåller miljönamnet. Detta gör att arbetsflödet kan identifiera rätt hemlighet som ska användas för varje miljö. I dina egna arbetsflöden kan du välja att använda hemligheter med lagringsplatsomfattning, miljöomfattande hemligheter eller till och med en blandning av båda.
Kommentar
Du kan också omfångsbegränsa hemligheter för GitHub-organisationer. Även om detta inte finns i omfånget för den här modulen länkar vi till mer information i sammanfattningen.
Använda variabler i arbetsflödet
Hur du kommer åt en variabels värde i arbetsflödet beror på typen av variabel.
Type | Syntax |
---|---|
Variabler som definierats i samma fil | ${{ env.VARIABLE_NAME }} |
Indata till ett kallat arbetsflöde | ${{ inputs.INPUT_NAME }} |
Hemligheter | ${{ secrets.SECRET_NAME }} |
När du till exempel kör en Bicep-distribution kan du använda hemligheter för att ange den Azure-arbetsbelastningsidentitet som ska användas, ett kallat arbetsflödesindata för att ange resursgruppens namn och en variabel för att ange värdet för en parameter:
jobs:
deploy:
runs-on: ubuntu-latest
env:
MyParameter: value-of-parameter
steps:
- uses: actions/checkout@v3
- uses: azure/login@v1
with:
client-id: ${{ secrets.AZURE_CLIENT_ID }}
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
- uses: azure/arm-deploy@v1
with:
failOnStdErr: false
resourceGroupName: ${{ inputs.resourceGroupName }}
template: ./deploy/main.bicep
parameters: myParameter=${{ env.MyParameter }}
Vilken är den bästa metoden?
Du har lärt dig om flera sätt att hantera de parametrar som din Bicep-fil behöver för distributionen. Det är bra att förstå när du kan använda vilken metod.
Undvik onödiga parametrar
Parametrar hjälper dig att göra dina Bicep-filer återanvändbara, men det är enkelt att definiera för många parametrar. När du distribuerar en Bicep-fil måste du ange ett värde för varje parameter. I komplexa distributioner mot flera miljöer blir det svårt att hantera en stor uppsättning enskilda parametervärden.
Överväg att göra parametrar valfria där du kan och använd standardvärden som gäller för de flesta av dina miljöer. Du kan sedan undvika behovet av att dina arbetsflöden skickar in värden för parametrarna.
Tänk också på att parametrar ofta används i Bicep när resurser behöver ansluta till andra resurser. Om du till exempel har en webbplats som behöver ansluta till ett lagringskonto måste du ange lagringskontots namn och åtkomstnyckel. Nycklar är säkra värden. Tänk dock på dessa andra metoder när du distribuerar den här kombinationen av resurser:
- Använd webbplatsens hanterade identitet för att komma åt lagringskontot. När du skapar en hanterad identitet genererar och hanterar Azure automatiskt sina autentiseringsuppgifter. Den här metoden förenklar anslutningsinställningarna. Det innebär också att du inte behöver hantera hemligheter alls, så det är det säkraste alternativet.
- Distribuera lagringskontot och webbplatsen tillsammans i samma Bicep-mall. Använd Bicep-moduler för att hålla ihop webbplatsen och lagringsresurserna. Sedan kan du automatiskt leta upp värdena för lagringskontots namn och nyckeln i Bicep-koden i stället för att skicka in parametrar.
- Lägg till lagringskontots information i ett nyckelvalv som en hemlighet. Webbplatskoden läser sedan in åtkomstnyckeln direkt från valvet. Den här metoden undviker behovet av att hantera nyckeln i arbetsflödet alls.
Använda arbetsflödesvariabler för små uppsättningar parametrar
Om du bara har några få parametrar för dina Bicep-filer kan du överväga att definiera variabler i YAML-filen.
Använda parameterfiler för stora uppsättningar parametrar
Om du har en stor uppsättning parametrar för dina Bicep-filer kan du överväga att använda parameterfiler för att hålla ihop de icke-säkra värdena för varje miljö. När du sedan behöver ändra värdena kan du uppdatera en parameterfil och checka in ändringen.
Den här metoden gör arbetsflödesstegen enklare eftersom du inte uttryckligen behöver ange värdet för varje parameter.
Lagra hemligheter på ett säkert sätt
Använd en lämplig process för att lagra och hantera hemligheter. Använd GitHub-hemligheter för att lagra hemligheter på din GitHub-lagringsplats eller använda Key Vault för att lagra hemligheter i Azure.
Kom ihåg att uttryckligen skicka varje parameter till distributionsstegen för säkra parametrar.
GitHub kan automatiskt genomsöka lagringsplatsen efter hemligheter som har checkats in av misstag, så att du kan meddelas. Du kan sedan ta bort och rotera hemligheterna. Vi länkar till mer information om den här funktionen i sammanfattningen.
Kombinera metoder
Det är vanligt att kombinera flera metoder för att hantera dina parametrar. Du kan till exempel lagra de flesta av dina parametervärden i parameterfiler och sedan ange säkra värden med hjälp av en hemlighet. I följande exempel visas kombinationen:
on:
workflow_dispatch:
inputs:
environmentType:
required: true
type: string
resourceGroupName:
required: true
type: string
secrets:
AZURE_CLIENT_ID:
required: true
AZURE_TENANT_ID:
required: true
AZURE_SUBSCRIPTION_ID:
required: true
MySecureParameter:
required: true
permissions:
id-token: write
contents: read
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: azure/login@v1
with:
client-id: ${{ secrets.AZURE_CLIENT_ID }}
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
- uses: azure/arm-deploy@v1
with:
failOnStdErr: false
resourceGroupName: ${{ inputs.resourceGroupName }}
template: ./deploy/main.bicep
parameters: >
./deploy/azuredeploy.parameters.${{ inputs.environmentType }}.json
mySecureParameter=${{ secrets.MySecureParameter }}
Dricks
I slutet av det här exemplet parameters
anges värdet som en YAML-flerradssträng med hjälp >
av tecknet. Detta gör YAML-filen enklare att läsa. Det motsvarar att inkludera hela värdet på en enda rad.