Ejercicio: Adición de un script de implementación a una plantilla de ARM
Importante
Para realizar este ejercicio, se necesita una suscripción de Azure propia y puede que se apliquen cargos. Si aún no tiene una suscripción de Azure, cree una cuenta gratuita antes de comenzar.
Como parte del proceso de implementación de aplicaciones del equipo, debe crear una cuenta de almacenamiento y almacenar provisionalmente un archivo en el almacenamiento de blobs para que lo lea la aplicación. Hasta ahora, ha tenido que copiar manualmente el archivo cada vez que se configuraba un nuevo entorno. Decide usar un script de implementación para automatizar este paso como parte del proceso de creación del entorno.
En este ejercicio, tomará una plantilla de Azure Resource Manager (ARM) existente y agregará un nuevo script de implementación.
Durante el proceso, hará lo siguiente:
- Cree una plantilla inicial.
- Agregue los requisitos previos para los scripts de implementación, incluida una identidad administrada asignada por el usuario y una asignación de roles.
- Agregue un script de implementación.
- Implemente la plantilla y compruebe la salida.
En este ejercicio se utilizan las herramientas de Azure Resource Manager para Visual Studio Code. Asegúrese de instalar esta extensión en Visual Studio Code.
En este ejercicio se usa la extensión de Bicep para Visual Studio Code. Asegúrese de instalar esta extensión en Visual Studio Code.
Creación de la plantilla de inicio
Empiece con una plantilla existente que el equipo ya haya usado. La plantilla crea la cuenta de almacenamiento, configura services de blob y necesita HTTPS, y crea el contenedor de blobs para los archivos de configuración.
Abra Visual Studio Code.
Cree un archivo con el nombre azuredeploy.json.
Guarde el archivo vacío para que Visual Studio Code cargue las herramientas de plantilla de ARM.
Puede seleccionar Archivo>Guardar como o Ctrl+S en Windows (⌘+S en macOS). Debe acordarse de dónde ha guardado el archivo. Por ejemplo, podría crear una carpeta scripts para guardarlo ahí.
Copie la siguiente plantilla inicial en azuredeploy.json.
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.1", "apiProfile": "", "parameters": {}, "variables": { "storageAccountName": "[concat('storage', uniqueString(resourceGroup().id))]", "storageBlobContainerName": "config" }, "functions": [], "resources": [ { "name": "[variables('storageAccountName')]", "type": "Microsoft.Storage/storageAccounts", "apiVersion": "2023-01-01", "tags": { "displayName": "[variables('storageAccountName')]" }, "location": "[resourceGroup().location]", "kind": "StorageV2", "sku": { "name": "Standard_LRS", "tier": "Standard" }, "properties": { "allowBlobPublicAccess": true, "encryption": { "services": { "blob": { "enabled": true } }, "keySource": "Microsoft.Storage" }, "supportsHttpsTrafficOnly": true } }, { "type": "Microsoft.Storage/storageAccounts/blobServices", "apiVersion": "2019-04-01", "name": "[concat(variables('storageAccountName'), '/default')]", "dependsOn": [ "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]" ] }, { "type": "Microsoft.Storage/storageAccounts/blobServices/containers", "apiVersion": "2019-04-01", "name": "[concat(variables('storageAccountName'),'/default/',variables('storageBlobContainerName'))]", "dependsOn": [ "[resourceId('Microsoft.Storage/storageAccounts/blobServices', variables('storageAccountName'), 'default')]", "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]" ], "properties": { "publicAccess": "Blob" } } ] }
Guarde la plantilla.
Abra Visual Studio Code.
Cree un archivo con el nombre main.bicep.
Guarde el archivo vacío para que Visual Studio Code cargue las herramientas de Bicep.
Puede seleccionar Archivo>Guardar como o Ctrl+S en Windows (⌘+S en macOS). Debe acordarse de dónde ha guardado el archivo. Por ejemplo, podría crear una carpeta scripts para guardarlo ahí.
Copie la siguiente plantilla inicial en main.bicep.
var storageAccountName = 'storage${uniqueString(resourceGroup().id)}' var storageBlobContainerName = 'config' resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = { name: storageAccountName tags: { displayName: storageAccountName } location: resourceGroup().location kind: 'StorageV2' sku: { name: 'Standard_LRS' tier: 'Standard' } properties: { allowBlobPublicAccess: true encryption: { services: { blob: { enabled: true } } keySource: 'Microsoft.Storage' } supportsHttpsTrafficOnly: true } resource blobService 'blobServices' existing = { name: 'default' } } resource blobContainer 'Microsoft.Storage/storageAccounts/blobServices/containers@2019-04-01' = { parent: storageAccount::blobService name: storageBlobContainerName properties: { publicAccess: 'Blob' } }
Guarde la plantilla.
Adición de una identidad administrada asignada por el usuario
A continuación, tendrá que crear una identidad administrada asignada por el usuario. Dado el enfoque de infraestructura como código, puede crear la identidad en la plantilla.
Edite la sección
variables
de azuredeploy.json para incluir lo siguiente:"userAssignedIdentityName": "configDeployer",
Edite la sección
resources
de azuredeploy.json para incluir lo siguiente:{ "type": "Microsoft.ManagedIdentity/userAssignedIdentities", "apiVersion": "2018-11-30", "name": "[variables('userAssignedIdentityName')]", "location": "[resourceGroup().location]" }
Guarde la plantilla.
En las definiciones de variables de main.bicep, agregue lo siguiente:
var userAssignedIdentityName = 'configDeployer'
En las definiciones de recursos, agregue lo siguiente:
resource userAssignedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2018-11-30' = { name: userAssignedIdentityName location: resourceGroup().location }
Guarde la plantilla.
Establecimiento del rol de colaborador para la identidad administrada
Ahora que ha definido una identidad administrada, puede asignarle un rol con derechos para el grupo de recursos. Le asignará el rol Colaborador. Un rol se identifica por su identificador de definición de rol, que es un GUID. El rol Colaborador está integrado en Azure, por lo que se documenta el identificador de definición de rol.
La asignación de roles también necesita un nombre GUID. Puede usar la función guid
para crear un GUID que sea único para el grupo de recursos y el nombre del rol.
Edite la sección
variables
de azuredeploy.json para incluir lo siguiente:"roleAssignmentName": "[guid(concat(resourceGroup().id, 'contributor'))]", "contributorRoleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
Edite la sección
resources
de azuredeploy.json para incluir lo siguiente:{ "type": "Microsoft.Authorization/roleAssignments", "apiVersion": "2020-04-01-preview", "name": "[variables('roleAssignmentName')]", "dependsOn": [ "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName'))]" ], "properties": { "roleDefinitionId": "[variables('contributorRoleDefinitionId')]", "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName')), '2015-08-31-preview').principalId]", "scope": "[resourceGroup().id]", "principalType": "ServicePrincipal" } }
Guarde la plantilla.
En las definiciones de variables de main.bicep, agregue lo siguiente:
var roleAssignmentName = guid(resourceGroup().id, 'contributor') var contributorRoleDefinitionId = resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')
En las definiciones de recursos, agregue lo siguiente:
resource roleAssignment 'Microsoft.Authorization/roleAssignments@2020-04-01-preview' = { name: roleAssignmentName properties: { roleDefinitionId: contributorRoleDefinitionId principalId: userAssignedIdentity.properties.principalId principalType: 'ServicePrincipal' } }
Guarde la plantilla.
Creación del script de implementación
Ahora, tiene todos los requisitos previos para el script de implementación. Comenzará con los valores comunes que necesita el script de implementación. Hay dos dependencias: la asignación de roles y el contenedor de Blob Storage. El script necesita que ambos existan antes de que se pueda ejecutar.
Edite la sección
variables
de azuredeploy.json para incluir lo siguiente:"deploymentScriptName": "CopyConfigScript"
Edite la sección
resources
de azuredeploy.json para incluir lo siguiente:{ "type": "Microsoft.Resources/deploymentScripts", "apiVersion": "2020-10-01", "name": "[variables('deploymentScriptName')]", "location": "[resourceGroup().location]", "kind": "AzurePowerShell", "dependsOn": [ "[resourceId('Microsoft.Authorization/roleAssignments', variables('roleAssignmentName'))]", "[resourceId('Microsoft.Storage/storageAccounts/blobServices/containers', variables('storageAccountName'), 'default', variables('storageBlobContainerName'))]" ], "identity": { "type": "UserAssigned", "userAssignedIdentities": { "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities',variables('userAssignedIdentityName'))]": {} } } }
Agregue una sección
properties
al recurso para definir el script y los demás valores necesarios."properties": { "azPowerShellVersion": "3.0", "scriptContent": " Invoke-RestMethod -Uri 'https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/appsettings.json' -OutFile 'appsettings.json' $storageAccount = Get-AzStorageAccount -ResourceGroupName 'learndeploymentscript_exercise_1' | Where-Object { $_.StorageAccountName -like 'storage*' } $blob = Set-AzStorageBlobContent -File 'appsettings.json' -Container 'config' -Blob 'appsettings.json' -Context $StorageAccount.Context $DeploymentScriptOutputs = @{} $DeploymentScriptOutputs['Uri'] = $blob.ICloudBlob.Uri $DeploymentScriptOutputs['StorageUri'] = $blob.ICloudBlob.StorageUri ", "retentionInterval": "P1D" }
Guarde la plantilla.
En las definiciones de variables de main.bicep, agregue lo siguiente:
var deploymentScriptName = 'CopyConfigScript'
En las definiciones de recursos, agregue lo siguiente:
resource deploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = { name: deploymentScriptName location: resourceGroup().location kind: 'AzurePowerShell' identity: { type: 'UserAssigned' userAssignedIdentities: { '${userAssignedIdentity.id}': {} } } dependsOn: [ roleAssignment blobContainer ] }
Agregue una sección
properties
al recurso para definir el script y los demás valores necesarios.properties: { azPowerShellVersion: '3.0' scriptContent: ''' Invoke-RestMethod -Uri 'https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/appsettings.json' -OutFile 'appsettings.json' $storageAccount = Get-AzStorageAccount -ResourceGroupName 'learndeploymentscript_exercise_1' | Where-Object { $_.StorageAccountName -like 'storage*' } $blob = Set-AzStorageBlobContent -File 'appsettings.json' -Container 'config' -Blob 'appsettings.json' -Context $storageAccount.Context $DeploymentScriptOutputs = @{} $DeploymentScriptOutputs['Uri'] = $blob.ICloudBlob.Uri $DeploymentScriptOutputs['StorageUri'] = $blob.ICloudBlob.StorageUri ''' retentionInterval: 'P1D' }
Guarde la plantilla.
Adición de una salida de plantilla
Ahora que tiene un script de implementación que carga un archivo en Azure Blob Storage, es posible que tenga que hacer referencia a esa ubicación de archivo en una automatización posterior. (Es posible que ejecute una prueba para validar que el archivo está donde cree que debe estar).
Después de la sección resources
de la plantilla de ARM, agregue una salida que haga referencia al URI del archivo tal como lo notifica el script de implementación.
"outputs": {
"fileUri": {
"type": "string",
"value": "[reference(variables('deploymentScriptName')).outputs.Uri]"
}
}
En la parte inferior del archivo, después de las definiciones de recursos, agregue una salida que haga referencia al URI del archivo tal como lo notifica el script de implementación.
output fileUri string = deploymentScript.properties.outputs.Uri
Comprobación de la plantilla
La plantilla debe tener el siguiente aspecto:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.1",
"apiProfile": "",
"parameters": {},
"variables": {
"storageAccountName": "[concat('storage', uniqueString(resourceGroup().id))]",
"storageBlobContainerName": "config",
"userAssignedIdentityName": "configDeployer",
"roleAssignmentName": "[guid(concat(resourceGroup().id, 'contributor'))]",
"contributorRoleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
"deploymentScriptName": "CopyConfigScript"
},
"functions": [],
"resources": [
{
"name": "[variables('storageAccountName')]",
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2023-01-01",
"tags": {
"displayName": "[variables('storageAccountName')]"
},
"location": "[resourceGroup().location]",
"kind": "StorageV2",
"sku": {
"name": "Standard_LRS",
"tier": "Standard"
},
"properties": {
"allowBlobPublicAccess": true,
"encryption": {
"services": {
"blob": {
"enabled": true
}
},
"keySource": "Microsoft.Storage"
},
"supportsHttpsTrafficOnly": true
}
},
{
"type": "Microsoft.Storage/storageAccounts/blobServices",
"apiVersion": "2019-04-01",
"name": "[concat(variables('storageAccountName'), '/default')]",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
]
},
{
"type": "Microsoft.Storage/storageAccounts/blobServices/containers",
"apiVersion": "2019-04-01",
"name": "[concat(variables('storageAccountName'),'/default/',variables('storageBlobContainerName'))]",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', variables('storageAccountName'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
],
"properties": {
"publicAccess": "Blob"
}
},
{
"type": "Microsoft.ManagedIdentity/userAssignedIdentities",
"apiVersion": "2018-11-30",
"name": "[variables('userAssignedIdentityName')]",
"location": "[resourceGroup().location]"
},
{
"type": "Microsoft.Authorization/roleAssignments",
"apiVersion": "2020-04-01-preview",
"name": "[variables('roleAssignmentName')]",
"dependsOn": [ "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName'))]" ],
"properties": {
"roleDefinitionId": "[variables('contributorRoleDefinitionId')]",
"principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName')), '2015-08-31-preview').principalId]",
"scope": "[resourceGroup().id]",
"principalType": "ServicePrincipal"
}
},
{
"type": "Microsoft.Resources/deploymentScripts",
"apiVersion": "2020-10-01",
"name": "[variables('deploymentScriptName')]",
"location": "[resourceGroup().location]",
"kind": "AzurePowerShell",
"dependsOn": [
"[resourceId('Microsoft.Authorization/roleAssignments', variables('roleAssignmentName'))]",
"[resourceId('Microsoft.Storage/storageAccounts/blobServices/containers', variables('storageAccountName'), 'default', variables('storageBlobContainerName'))]"
],
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities',variables('userAssignedIdentityName'))]": {}
}
},
"properties": {
"azPowerShellVersion": "3.0",
"scriptContent": "
Invoke-RestMethod -Uri 'https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/appsettings.json' -OutFile 'appsettings.json'
$storageAccount = Get-AzStorageAccount -ResourceGroupName 'learndeploymentscript_exercise_1' | Where-Object { $_.StorageAccountName -like 'storage*' }
$blob = Set-AzStorageBlobContent -File 'appsettings.json' -Container 'config' -Blob 'appsettings.json' -Context $StorageAccount.Context
$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['Uri'] = $blob.ICloudBlob.Uri
$DeploymentScriptOutputs['StorageUri'] = $blob.ICloudBlob.StorageUri
",
"retentionInterval": "P1D"
}
}
],
"outputs": {
"fileUri": {
"type": "string",
"value": "[reference(variables('deploymentScriptName')).outputs.Uri]"
}
}
}
var storageAccountName = 'storage${uniqueString(resourceGroup().id)}'
var storageBlobContainerName = 'config'
var userAssignedIdentityName = 'configDeployer'
var roleAssignmentName = guid(resourceGroup().id, 'contributor')
var contributorRoleDefinitionId = resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')
var deploymentScriptName = 'CopyConfigScript'
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = {
name: storageAccountName
tags: {
displayName: storageAccountName
}
location: resourceGroup().location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
tier: 'Standard'
}
properties: {
allowBlobPublicAccess: true
encryption: {
services: {
blob: {
enabled: true
}
}
keySource: 'Microsoft.Storage'
}
supportsHttpsTrafficOnly: true
}
resource blobService 'blobServices' existing = {
name: 'default'
}
}
resource blobContainer 'Microsoft.Storage/storageAccounts/blobServices/containers@2019-04-01' = {
parent: storageAccount::blobService
name: storageBlobContainerName
properties: {
publicAccess: 'Blob'
}
}
resource userAssignedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2018-11-30' = {
name: userAssignedIdentityName
location: resourceGroup().location
}
resource roleAssignment 'Microsoft.Authorization/roleAssignments@2020-04-01-preview' = {
name: roleAssignmentName
properties: {
roleDefinitionId: contributorRoleDefinitionId
principalId: userAssignedIdentity.properties.principalId
principalType: 'ServicePrincipal'
}
}
resource deploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = {
name: deploymentScriptName
location: resourceGroup().location
kind: 'AzurePowerShell'
identity: {
type: 'UserAssigned'
userAssignedIdentities: {
'${userAssignedIdentity.id}': {}
}
}
properties: {
azPowerShellVersion: '3.0'
scriptContent: '''
Invoke-RestMethod -Uri 'https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/appsettings.json' -OutFile 'appsettings.json'
$storageAccount = Get-AzStorageAccount -ResourceGroupName 'learndeploymentscript_exercise_1' | Where-Object { $_.StorageAccountName -like 'storage*' }
$blob = Set-AzStorageBlobContent -File 'appsettings.json' -Container 'config' -Blob 'appsettings.json' -Context $storageAccount.Context
$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['Uri'] = $blob.ICloudBlob.Uri
$DeploymentScriptOutputs['StorageUri'] = $blob.ICloudBlob.StorageUri
'''
retentionInterval: 'P1D'
}
dependsOn: [
roleAssignment
blobContainer
]
}
output fileUri string = deploymentScript.properties.outputs.Uri
Si no es así, copie el ejemplo o ajuste la plantilla para que coincida con él.
Implementación de la plantilla
Para implementar esta plantilla en Azure, debe iniciar sesión en la cuenta de Azure desde el terminal de Visual Studio Code. Asegúrese de que ha instalado las herramientas de la CLI de Azure.
En el menú Terminal, seleccione Nuevo terminal. Normalmente, la ventana de terminal se abre en la mitad inferior de la pantalla.
Si el shell que se muestra en el lado derecho de la ventana de terminal es Bash, el shell correcto está abierto y puede ir a la sección siguiente.
Si apareciera un shell distinto de Bash, seleccione la flecha de la lista desplegable del shell y, a continuación, seleccione Azure Cloud Shell (Bash).
En la lista de shells de terminal, seleccione Bash.
En el terminal, vaya al directorio donde ha guardado la plantilla. Por ejemplo, si ha guardado la plantilla en la carpeta templates, puede usar este comando:
cd templates
Inicio de sesión en Azure mediante la CLI de Azure
En el terminal de Visual Studio Code, inicie sesión en Azure mediante la ejecución del siguiente comando:
az login
En el explorador que se abre, inicie sesión en su cuenta de Azure.
En el terminal de Visual Studio Code se muestra una lista de las suscripciones asociadas a esta cuenta.
En la lista, busque la suscripción que desea usar para este ejercicio.
Si ha perdido la lista del inicio de sesión, puede usar el siguiente fragmento de código para enumerar de nuevo las suscripciones.
az account list --output table
Establezca la suscripción predeterminada para todos los comandos de la CLI de Azure que ejecute en esta sesión.
az account set --subscription "Your Subscription Name or ID"
Para implementar esta plantilla en Azure, debe iniciar sesión en la cuenta de Azure desde el terminal de Visual Studio Code. Asegúrese de que ha instalado las herramientas de la CLI de Azure.
En el menú Terminal, seleccione Nuevo terminal. Normalmente, la ventana de terminal se abre en la mitad inferior de la pantalla.
Si el shell que se muestra en el lado derecho de la ventana de terminal es Bash, el shell correcto está abierto y puede ir a la sección siguiente.
Si apareciera un shell distinto de Bash, seleccione la flecha de la lista desplegable del shell y, a continuación, seleccione Azure Cloud Shell (Bash).
En la lista de shells de terminal, seleccione Bash.
En el terminal, vaya al directorio donde ha guardado la plantilla. Por ejemplo, si ha guardado la plantilla en la carpeta templates, puede usar este comando:
cd templates
Instalación de Bicep
Ejecute el comando siguiente para asegurarse de que tiene la versión más reciente de Bicep:
az bicep install && az bicep upgrade
Inicio de sesión en Azure mediante la CLI de Azure
En el terminal de Visual Studio Code, inicie sesión en Azure mediante la ejecución del siguiente comando:
az login
En el explorador que se abre, inicie sesión en su cuenta de Azure.
En el terminal de Visual Studio Code se muestra una lista de las suscripciones asociadas a esta cuenta.
En la lista, busque la suscripción que desea usar para este ejercicio.
Si ha perdido la lista del inicio de sesión, puede usar el siguiente fragmento de código para enumerar de nuevo las suscripciones.
az account list --output table
Establezca la suscripción predeterminada para todos los comandos de la CLI de Azure que ejecute en esta sesión.
az account set --subscription "Your Subscription Name or ID"
Para implementar esta plantilla en Azure, inicie sesión en la cuenta de Azure desde el terminal de Visual Studio Code. Asegúrese de haber instalado Azure PowerShell e inicie sesión en la misma cuenta que ha activado el espacio aislado.
En el menú Terminal, seleccione Nuevo terminal. Normalmente, la ventana de terminal se abre en la mitad inferior de la pantalla.
Si el shell que se muestra en el lado derecho de la ventana de terminal es powershell o pwsh, el shell correcto está abierto y puede ir a la sección siguiente.
Si apareciera un shell distinto de powershell o pwsh, seleccione la flecha de la lista desplegable del shell y, a continuación, seleccione PowerShell.
En la lista de shells de terminal, seleccione powershell o pwsh.
En el terminal, vaya al directorio donde ha guardado la plantilla. Por ejemplo, si ha guardado la plantilla en la carpeta templates, puede usar este comando:
Set-Location -Path templates
Inicio de sesión en Azure mediante Azure PowerShell
En el terminal de Visual Studio Code, inicie sesión en Azure mediante la ejecución del siguiente comando:
Connect-AzAccount
En el explorador que se abre, inicie sesión en su cuenta de Azure.
Para obtener el identificador de la suscripción que desea usar para este ejercicio, ejecute el siguiente comando:
Get-AzSubscription
El identificador de la suscripción es la segunda columna. Copie la segunda columna. Es similar a aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e.
Establezca la suscripción predeterminada para todos los comandos de Azure PowerShell que ejecute en esta sesión.
Set-AzContext -SubscriptionId {Your subscription ID}
Para implementar esta plantilla en Azure, inicie sesión en la cuenta de Azure desde el terminal de Visual Studio Code. Asegúrese de que ha instalado Azure PowerShell.
En el menú Terminal, seleccione Nuevo terminal. Normalmente, la ventana de terminal se abre en la mitad inferior de la pantalla.
Si el shell que se muestra en el lado derecho de la ventana de terminal es powershell o pwsh, el shell correcto está abierto y puede ir a la sección siguiente.
Si apareciera un shell distinto de powershell o pwsh, seleccione la flecha de la lista desplegable del shell y, a continuación, seleccione PowerShell.
En la lista de shells de terminal, seleccione powershell o pwsh.
En el terminal, vaya al directorio donde ha guardado la plantilla. Por ejemplo, si ha guardado la plantilla en la carpeta templates, puede usar este comando:
Set-Location -Path templates
Instalación de la CLI de Bicep
Para usar Bicep desde Azure PowerShell, instale la CLI de Bicep.
Inicio de sesión en Azure mediante Azure PowerShell
En el terminal de Visual Studio Code, inicie sesión en Azure mediante la ejecución del siguiente comando:
Connect-AzAccount
En el explorador que se abre, inicie sesión en su cuenta de Azure.
Para obtener el identificador de la suscripción que desea usar para este ejercicio, ejecute el siguiente comando:
Get-AzSubscription
El identificador de la suscripción es la segunda columna. Copie la segunda columna. Es similar a aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e.
Establezca la suscripción predeterminada para todos los comandos de Azure PowerShell que ejecute en esta sesión.
Set-AzContext -SubscriptionId {Your subscription ID}
A continuación debe crear un grupo de recursos que contenga los recursos que va a crear como parte de este ejercicio. Al usar un grupo de recursos nuevo, hará que la limpieza después del ejercicio sea mucho más fácil.
Desde el terminal de Visual Studio Code, ejecute este comando para crear el grupo de recursos para este ejercicio:
Creación de un grupo de recursos para el ejercicio
resourceGroupName="learndeploymentscript_exercise_1"
az group create --location eastus --name $resourceGroupName
$resourceGroupName = 'learndeploymentscript_exercise_1'
New-AzResourceGroup -Location eastus -Name $resourceGroupName
Nota:
Si usa otro nombre para el grupo de recursos, deberá asegurarse de actualizar el script. Más adelante en este módulo verá cómo evitar codificar de forma rígida los nombres de los grupos de recursos en los scripts.
Implementación de la plantilla en Azure
En código siguiente implementa la plantilla de ARM en Azure. Verá una implementación correcta.
Implemente la plantilla mediante los comandos de la CLI de Azure en el terminal de Visual Studio Code.
templateFile="azuredeploy.json"
today=$(date +"%d-%b-%Y")
deploymentName="deploymentscript-"$today
az deployment group create \
--resource-group $resourceGroupName \
--name $deploymentName \
--template-file $templateFile
En código siguiente implementa la plantilla de ARM en Azure. Verá una implementación correcta.
Implemente la plantilla mediante los comandos de la CLI de Azure en el terminal de Visual Studio Code.
templateFile="main.bicep"
today=$(date +"%d-%b-%Y")
deploymentName="deploymentscript-"$today
az deployment group create \
--resource-group $resourceGroupName \
--name $deploymentName \
--template-file $templateFile
En código siguiente implementa la plantilla en Azure. Verá una implementación correcta.
Implemente la plantilla mediante comandos de Azure PowerShell en el terminal.
$templateFile = 'azuredeploy.json'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "deploymentscript-$today"
New-AzResourceGroupDeployment `
-ResourceGroupName $resourceGroupName `
-Name $deploymentName `
-TemplateFile $templateFile
En código siguiente implementa la plantilla en Azure. Verá una implementación correcta.
Implemente la plantilla mediante comandos de Azure PowerShell en el terminal.
$templateFile = 'main.bicep'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "deploymentscript-$today"
New-AzResourceGroupDeployment `
-ResourceGroupName $resourceGroupName `
-Name $deploymentName `
-TemplateFile $templateFile
Revisión del resultado de la plantilla
Una vez que se complete la implementación, se le asignará una dirección URL que apunta al archivo que el script de implementación ha copiado en Blob Storage.
Recupere ese archivo mediante el resultado de la dirección URL de la implementación de la plantilla para confirmar que el script de implementación ha funcionado correctamente.
uri=$(az deployment group show --resource-group $resourceGroupName --name $deploymentName --query 'properties.outputs.fileUri.value' --output tsv) curl $uri
El comando devuelve el código siguiente.
{ "environment": "production", "hostname": "tailwindtraders.com", "Logging": { "LogLevel": { "Default": "Debug" } }, "ApplicationInsights": { "InstrumentationKey": "" }, "AllowedHosts": "*", "CosmosDb": { "Host": "", "Key": "", "Database": "Products" } }
También puede revisar los registros (y otros detalles sobre la implementación) desde Azure Portal o mediante el comando siguiente.
az deployment-scripts show-log --resource-group $resourceGroupName --name CopyConfigScript
Recupere ese archivo mediante el resultado de la dirección URL de la implementación de la plantilla para confirmar que el script de implementación ha funcionado correctamente.
$fileUri = (Get-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName -Name $deploymentName).Outputs.fileUri.Value Invoke-RestMethod $fileUri
El comando devuelve el código siguiente.
environment : production hostname : tailwindtraders.com Logging : @{LogLevel=} ApplicationInsights : @{InstrumentationKey=} AllowedHosts : * CosmosDb : @{Host=; Key=; Database=Products}
También puede revisar los registros (y otros detalles sobre la implementación) desde Azure Portal o mediante la línea de comandos siguiente.
Get-AzDeploymentScriptLog -ResourceGroupName $resourceGroupName -Name CopyConfigScript
Limpieza del grupo de recursos
Ahora que ha implementado correctamente una plantilla de ARM con un script de implementación, puede quitar el grupo de recursos que contiene todos los recursos y las asignaciones de roles que ha creado.
az group delete --name $resourceGroupName
Remove-AzResourceGroup -Name $resourceGroupName