Kurz: Vytvoření certifikátu podepsaného svým držitelem pomocí skriptů nasazení
Naučte se používat skripty nasazení v šablonách Azure Resource Manageru (šablony ARM). Skripty nasazení je možné použít k provádění vlastních kroků, které není možné provádět pomocí šablon ARM. Například vytvoření certifikátu podepsaného svým držitelem. V tomto kurzu vytvoříte šablonu pro nasazení trezoru klíčů Azure a pak použijete Microsoft.Resources/deploymentScripts
prostředek ve stejné šabloně k vytvoření certifikátu a následnému přidání certifikátu do trezoru klíčů. Další informace o skriptu nasazení najdete v tématu Použití skriptů nasazení v šablonách ARM.
Důležité
Dva prostředky skriptu nasazení, účet úložiště a instance kontejneru, se vytvoří ve stejné skupině prostředků pro spouštění skriptů a řešení potíží. Tyto prostředky obvykle odstraní služba skriptů, když se spuštění skriptu dostane do stavu terminálu. Prostředky se vám budou účtovat, dokud se prostředky nebudou odstraňovat. Další informace najdete v tématu Vyčištění prostředků skriptu nasazení.
Tento kurz se zabývá následujícími úkony:
- Otevření šablony rychlého startu
- Úprava šablony
- Nasazení šablony
- Ladění neúspěšného skriptu
- Vyčištění prostředků
Modul Learn, který se zabývá skripty nasazení, najdete v tématu Rozšíření šablon ARM pomocí skriptů nasazení.
Předpoklady
K dokončení tohoto článku potřebujete:
Visual Studio Code s rozšířením Resource Manager Tools Viz Rychlý start: Vytváření šablon ARM pomocí editoru Visual Studio Code.
Spravovaná identita přiřazená uživatelem. Tato identita se používá k provádění akcí specifických pro Azure ve skriptu. Pokud ho chcete vytvořit, podívejte se na spravovanou identitu přiřazenou uživatelem. Při nasazování šablony potřebujete ID identity. Formát identity je:
/subscriptions/<SubscriptionID>/resourcegroups/<ResourceGroupName>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<IdentityID>
Pomocí následujícího skriptu rozhraní příkazového řádku získejte ID zadáním názvu skupiny prostředků a názvu identity.
echo "Enter the Resource Group name:" && read resourceGroupName && az identity list -g $resourceGroupName
Otevření šablony pro rychlý start
Šablonu nemusíte vytvářet od začátku, ale můžete místo toho otevřít některou šablonu pro rychlý start Azure. Šablony pro rychlý start Azure jsou úložištěm pro šablony ARM.
Šablona použitá v tomto rychlém startu se nazývá Vytvoření služby Azure Key Vault a tajný klíč. Šablona vytvoří trezor klíčů a pak do trezoru klíčů přidá tajný kód.
V nástroji Visual Studio Code vyberte File (Soubor) >Open File (Otevřít soubor).
Do pole File name (Název souboru) vložte následující adresu URL:
https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.keyvault/key-vault-create/azuredeploy.json
Výběrem Open (Otevřít) soubor otevřete.
Vyberte File (Soubor) >Save As (Uložit jako) a soubor uložte jako azuredeploy.json na místní počítač.
Úprava šablony
Proveďte v šabloně následující změny:
Vyčištění šablony (volitelné)
Původní šablona přidá tajný kód do trezoru klíčů. Pokud chcete tento kurz zjednodušit, odeberte následující prostředek:
Microsoft.KeyVault/vaults/secrets
Odeberte následující dvě definice parametrů:
secretName
secretValue
Pokud se rozhodnete tyto definice neodebrat, je potřeba zadat hodnoty parametrů během nasazení.
Konfigurace zásad přístupu trezoru klíčů
Skript nasazení přidá do trezoru klíčů certifikát. Nakonfigurujte zásady přístupu trezoru klíčů tak, aby udělily oprávnění spravované identitě:
Přidejte parametr pro získání ID spravované identity:
"identityId": { "type": "string", "metadata": { "description": "Specifies the ID of the user-assigned managed identity." } },
Poznámka:
Rozšíření šablony Resource Manageru editoru Visual Studio Code zatím nedokáže formátovat skripty nasazení. Nepoužívejte Shift+Alt+F k formátování
deploymentScripts
prostředků, jako je následující.Přidejte parametr pro konfiguraci zásad přístupu trezoru klíčů, aby spravovaná identita dokázala přidat certifikáty do trezoru klíčů:
"certificatesPermissions": { "type": "array", "defaultValue": [ "get", "list", "update", "create" ], "metadata": { "description": "Specifies the permissions to certificates in the vault. Valid values are: all, get, list, update, create, import, delete, recover, backup, restore, manage contacts, manage certificate authorities, get certificate authorities, list certificate authorities, set certificate authorities, delete certificate authorities." } }
Aktualizujte stávající zásady přístupu trezoru klíčů na:
"accessPolicies": [ { "objectId": "[parameters('objectId')]", "tenantId": "[parameters('tenantId')]", "permissions": { "keys": "[parameters('keysPermissions')]", "secrets": "[parameters('secretsPermissions')]", "certificates": "[parameters('certificatesPermissions')]" } }, { "objectId": "[reference(parameters('identityId'), '2018-11-30').principalId]", "tenantId": "[parameters('tenantId')]", "permissions": { "keys": "[parameters('keysPermissions')]", "secrets": "[parameters('secretsPermissions')]", "certificates": "[parameters('certificatesPermissions')]" } } ],
Jsou definovány dvě zásady, jedna pro přihlášeného uživatele a druhá pro spravovanou identitu. Přihlášený uživatel potřebuje jenom oprávnění seznamu k ověření nasazení. Pro zjednodušení kurzu se ke spravované identitě i přihlášeným uživatelům přiřadí stejný certifikát.
Přidání skriptu nasazení
Přidejte tři parametry, které skript nasazení používá:
"certificateName": { "type": "string", "defaultValue": "DeploymentScripts2019" }, "subjectName": { "type": "string", "defaultValue": "CN=contoso.com" }, "utcValue": { "type": "string", "defaultValue": "[utcNow()]" }
deploymentScripts
Přidejte prostředek:Poznámka:
Vzhledem k tomu, že vložené skripty nasazení jsou uzavřeny v dvojitých uvozovkách, musí být řetězce uvnitř skriptů nasazení uzavřeny v jednoduchých uvozovkách. Řídicí znak PowerShellu je backtick (
`
).{ "type": "Microsoft.Resources/deploymentScripts", "apiVersion": "2020-10-01", "name": "createAddCertificate", "location": "[resourceGroup().location]", "dependsOn": [ "[resourceId('Microsoft.KeyVault/vaults', parameters('keyVaultName'))]" ], "identity": { "type": "UserAssigned", "userAssignedIdentities": { "[parameters('identityId')]": { } } }, "kind": "AzurePowerShell", "properties": { "forceUpdateTag": "[parameters('utcValue')]", "azPowerShellVersion": "3.0", "timeout": "PT30M", "arguments": "[format(' -vaultName {0} -certificateName {1} -subjectName {2}', parameters('keyVaultName'), parameters('certificateName'), parameters('subjectName'))]", // can pass an argument string, double quotes must be escaped "scriptContent": " param( [string] [Parameter(Mandatory=$true)] $vaultName, [string] [Parameter(Mandatory=$true)] $certificateName, [string] [Parameter(Mandatory=$true)] $subjectName ) $ErrorActionPreference = 'Stop' $DeploymentScriptOutputs = @{} $existingCert = Get-AzKeyVaultCertificate -VaultName $vaultName -Name $certificateName if ($existingCert -and $existingCert.Certificate.Subject -eq $subjectName) { Write-Host 'Certificate $certificateName in vault $vaultName is already present.' $DeploymentScriptOutputs['certThumbprint'] = $existingCert.Thumbprint $existingCert | Out-String } else { $policy = New-AzKeyVaultCertificatePolicy -SubjectName $subjectName -IssuerName Self -ValidityInMonths 12 -Verbose # private key is added as a secret that can be retrieved in the Resource Manager template Add-AzKeyVaultCertificate -VaultName $vaultName -Name $certificateName -CertificatePolicy $policy -Verbose # it takes a few seconds for KeyVault to finish $tries = 0 do { Write-Host 'Waiting for certificate creation completion...' Start-Sleep -Seconds 10 $operation = Get-AzKeyVaultCertificateOperation -VaultName $vaultName -Name $certificateName $tries++ if ($operation.Status -eq 'failed') { throw 'Creating certificate $certificateName in vault $vaultName failed with error $($operation.ErrorMessage)' } if ($tries -gt 120) { throw 'Timed out waiting for creation of certificate $certificateName in vault $vaultName' } } while ($operation.Status -ne 'completed') $newCert = Get-AzKeyVaultCertificate -VaultName $vaultName -Name $certificateName $DeploymentScriptOutputs['certThumbprint'] = $newCert.Thumbprint $newCert | Out-String } ", "cleanupPreference": "OnSuccess", "retentionInterval": "P1D" } }
Prostředek
deploymentScripts
závisí na prostředku trezoru klíčů a prostředku přiřazení role. Má tyto vlastnosti:identity
: Skript nasazení používá spravovanou identitu přiřazenou uživatelem k provádění operací ve skriptu.kind
: Zadejte typ skriptu. V současné době se podporují jenom skripty PowerShellu.forceUpdateTag
: Určete, jestli se má spustit skript nasazení, i když se zdroj skriptu nezměnil. Může to být aktuální časové razítko nebo identifikátor GUID. Další informace najdete v tématu Spuštění skriptu více než jednou.azPowerShellVersion
: Určuje verzi modulu Azure PowerShellu, která se má použít. Skript nasazení v současné době podporuje verzi 2.7.0, 2.8.0 a 3.0.0.timeout
: Zadejte maximální povolenou dobu provádění skriptu určenou ve formátu ISO 8601. Výchozí hodnota je P1D.arguments
: Zadejte hodnoty parametrů. Hodnoty jsou oddělené mezerami.scriptContent
: Zadejte obsah skriptu. Pokud chcete spustit externí skript, použijteprimaryScriptURI
místo toho. Další informace naleznete v tématu Použití externího skriptu.$DeploymentScriptOutputs
Deklarace se vyžaduje pouze při testování skriptu na místním počítači. Deklarace proměnné umožňuje spuštění skriptu na místním počítači a vdeploymentScript
prostředku bez nutnosti provádět změny. Hodnota přiřazená$DeploymentScriptOutputs
je k dispozici jako výstupy v nasazeních. Další informace najdete v tématu Práce s výstupy ze skriptů nasazení PowerShellu nebo Práce s výstupy ze skriptů nasazení rozhraní příkazového řádku.cleanupPreference
: Určete předvolbu, kdy chcete odstranit prostředky skriptu nasazení. Výchozí hodnota je Always, což znamená, že prostředky skriptu nasazení se odstraní i přes stav terminálu (Úspěch, Selhání, Zrušeno). V tomto kurzu se používá OnSuccess, abyste získali šanci zobrazit výsledky spuštění skriptu.retentionInterval
: Zadejte interval, pro který služba uchovává prostředky skriptu po dosažení stavu terminálu. Prostředky budou odstraněny po uplynutí této doby trvání. Doba trvání je založena na vzoru ISO 8601. Tento kurz používá P1D, což znamená jeden den. Tato vlastnost se používá, pokudcleanupPreference
je nastavena na OnExpiration. Tato vlastnost není aktuálně povolená.
Skript nasazení má tři parametry:
keyVaultName
certificateName
, asubjectName
. Vytvoří certifikát a pak ho přidá do trezoru klíčů.$DeploymentScriptOutputs
slouží k ukládání výstupní hodnoty. Další informace najdete v tématu Práce s výstupy ze skriptů nasazení PowerShellu nebo Práce s výstupy ze skriptů nasazení rozhraní příkazového řádku.Dokončenou šablonu najdete tady.
Pokud chcete zobrazit proces ladění, umístěte do kódu chybu přidáním následujícího řádku do skriptu nasazení:
Write-Output1 $keyVaultName
Správný příkaz je
Write-Output
místoWrite-Output1
.Soubor uložte tak, že vyberete File (Soubor) >Save (Uložit).
Nasazení šablony
Přihlášení ke službě Azure Cloud Shell
Vyberte upřednostňované prostředí tak , že v levém horním rohu vyberete PowerShell nebo Bash (pro rozhraní příkazového řádku). Po přepnutí se vyžaduje restartování prostředí.
Vyberte Nahrát nebo stáhnout soubory a potom vyberte Nahrát. Viz předchozí snímek obrazovky. Vyberte soubor, který jste uložili v předchozí části. Po nahrání souboru můžete použít
ls
příkaz acat
příkaz k ověření úspěšného nahrání souboru.Spuštěním následujícího skriptu Azure CLI nebo Azure PowerShellu šablonu nasaďte.
echo "Enter a project name that is used to generate resource names:" && read projectName && echo "Enter the location (i.e. centralus):" && read location && echo "Enter your email address used to sign in to Azure:" && read upn && echo "Enter the user-assigned managed identity ID:" && read identityId && adUserId=$((az ad user show --id ${upn}) | jq -r '.id') && resourceGroupName="${projectName}rg" && keyVaultName="${projectName}kv" && az group create --name $resourceGroupName --location $location && az deployment group create --resource-group $resourceGroupName --template-file "$HOME/azuredeploy.json" --parameters identityId=$identityId keyVaultName=$keyVaultName objectId=$adUserId
Služba skriptů nasazení musí pro spuštění skriptu vytvořit další prostředky skriptu nasazení. Příprava a proces čištění může trvat až jednu minutu, než se dokončí kromě skutečné doby provádění skriptu.
Nasazení selhalo,
Write-Output1
protože v skriptu se používá neplatný příkaz. Zobrazí se chybová zpráva:The term 'Write-Output1' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
Výsledek spuštění skriptu nasazení je uložen v prostředcích skriptu nasazení pro účely řešení potíží.
Ladění neúspěšného skriptu
Přihlaste se k portálu Azure.
Otevřete skupinu prostředků. Jedná se o název projektu s připojeným argumentem rg . Ve skupině prostředků se zobrazí dva další prostředky. Tyto prostředky se označují jako prostředky skriptu nasazení.
Oba soubory mají příponu azscripts . Jeden je účet úložiště a druhý je instance kontejneru.
Výběrem možnosti Zobrazit skryté typy vypíšete
deploymentScripts
prostředek.Vyberte účet úložiště s příponou azscripts .
Vyberte dlaždici Sdílené složky . Zobrazí se složka azscripts , která obsahuje soubory spouštění skriptu nasazení.
Vyberte azscripts. Zobrazí se dvě složky azscriptinput a azscriptoutput. Vstupní složka obsahuje systémový soubor skriptu PowerShellu a soubory skriptu nasazení uživatele. Výstupní složka obsahuje soubor executionresult.json a výstupní soubor skriptu. V souboru executionresult.json se zobrazí chybová zpráva. Výstupní soubor tam není, protože spuštění selhalo.
Odeberte čáru Write-Output1
a znovu nasaďte šablonu.
Po úspěšném spuštění druhého nasazení se prostředky skriptu nasazení odeberou službou skriptů, protože cleanupPreference
vlastnost je nastavena na OnSuccess.
Vyčištění prostředků
Pokud už nasazené prostředky Azure nepotřebujete, vyčistěte je odstraněním skupiny prostředků.
- Na portálu Azure Portal vyberte v nabídce nalevo Skupina prostředků.
- Do pole Filtrovat podle názvu zadejte název skupiny prostředků.
- Vyberte název skupiny prostředků.
- V nabídce nahoře vyberte Odstranit skupinu prostředků.
Další kroky
V tomto kurzu jste se naučili používat skript nasazení v šablonách ARM. Informace o tom, jak nasazovat prostředky Azure na základě podmínek, najdete v tomto tématu: