Tanques el mòdul amb l'eina que més temps t'estalviarà durant la resta del curs i la resta de la teva carrera a Azure: la línia d'ordres. A la lliçó anterior va quedar clar que portal, CLI, PowerShell i plantilles parlen tots amb la mateixa API d'Azure Resource Manager. El que canvia és la velocitat, la precisió i —sobretot— la capacitat de repetir exactament el mateix demà.

Aquí aprendràs a instal·lar i fer servir Azure CLI, a consultar-ne les sortides amb --query, a manejar diverses subscripcions sense equivocar-te d'entorn, quan té més sentit Azure PowerShell, i com funciona Cloud Shell (i per què et crea un compte d'emmagatzematge). I acabaràs escrivint un script complet, comentat, parametritzat i idempotent que desplega la base de la plataforma de Contoso Airlines i sap esborrar-la després per no gastar de més.

Contingut

  1. Per què automatitzar des de la línia d'ordres
  2. Instal·lar Azure CLI i comprovar-ne la versió
  3. Iniciar sessió i treballar amb diverses subscripcions
  4. Anatomia d'una ordre az i ajuda integrada
  5. Formats de sortida i consultes amb --query
  6. Azure PowerShell i quan triar cada eina
  7. Cloud Shell
  8. Script complet: la base de Contoso Airlines
  9. Neteja: esborrar sense deixar rastre de despesa
  10. Errors Comuns i Consells
  11. Exercicis
  12. Conclusió

  1. Per què automatitzar des de la línia d'ordres

El portal és excel·lent per explorar. Per treballar, té tres problemes:

Problema del portal Què aporta la línia d'ordres
No és repetible: 40 clics avui, 40 clics diferents demà Un script produeix sempre el mateix resultat
No és auditable: ningú no sap quines opcions vas marcar L'script viu a Git, es revisa i es compara
No escala: crear 20 recursos iguals és una tarda perduda Un bucle for ho fa en un minut
És lent per a consultes: "dona'm totes les VM sense etiqueta propietario" no té botó Una consulta --query ho resol en una línia

A més, la CLI és el pont natural cap al que ve després: les canalitzacions de desplegament del mòdul 5 executen ordres az, i els diagnòstics del mòdul 7 es recolzen en consultes de línia d'ordres.

Regla d'or, repetida a posta: el que fas una vegada, fes-ho al portal; el que faràs dues vegades, escriu-ho.

  1. Instal·lar Azure CLI i comprovar-ne la versió

Azure CLI és multiplataforma i està escrita en Python, però s'instal·la com un paquet natiu a cada sistema.

Windows

# Opció recomanada: gestor de paquets de Windows.
winget install --exact --id Microsoft.AzureCLI

# Alternativa amb MSI silenciós, útil en desplegaments corporatius.
# Baixa l'instal·lador oficial i executa'l amb /quiet.

Després d'instal·lar-la, tanca i torna a obrir el terminal perquè s'actualitzi la variable PATH.

macOS

# Amb Homebrew, el gestor de paquets més habitual a macOS.
brew update && brew install azure-cli

Linux (Debian/Ubuntu)

# Script oficial d'instal·lació: afegeix el repositori de Microsoft i instal·la el paquet.
# Revisa sempre un script abans d'executar-lo amb privilegis (bona pràctica general).
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash

Per a RHEL, Fedora o CentOS es fa servir dnf; per a openSUSE, zypper. La documentació oficial detalla cada cas.

Comprovar la instal·lació

# Mostra la versió de la CLI, de les seves extensions i de Python.
az version

Sortida d'exemple:

{
  "azure-cli": "2.64.0",
  "azure-cli-core": "2.64.0",
  "azure-cli-telemetry": "1.1.0",
  "extensions": {}
}

Mantenir-la actualitzada

# Actualitza la CLI a l'última versió estable (funciona a la majoria de plataformes).
az upgrade

# Desactiva la pregunta de telemetria i les confirmacions interactives als scripts.
az config set core.collect_telemetry=false

Azure CLI s'actualitza cada poques setmanes. Treballar amb una versió molt antiga provoca errors del tipus "unrecognized arguments" quan segueixes documentació recent: si un paràmetre no existeix a la teva instal·lació, el primer que cal provar és actualitzar-la.

  1. Iniciar sessió i treballar amb diverses subscripcions

# Obre el navegador per autenticar-te de manera interactiva.
# Un cop iniciada la sessió, la CLI desa un testimoni local i ja no el demana a cada ordre.
az login

Variants útils:

# Sense navegador (servidors, SSH): mostra un codi per introduir a microsoft.com/devicelogin.
az login --use-device-code

# Especificar l'inquilí quan la teva identitat pertany a diversos directoris.
az login --tenant contoso-airlines.onmicrosoft.com

Per a automatització desatesa (canalitzacions de CI/CD) no es fa servir az login interactiu, sinó una entitat de servei o una identitat administrada. Es veuen a les lliçons 04-02 i 05-03. No posis mai credencials d'usuari en un script.

Diverses subscripcions: l'error més car de tots

Si la teva identitat té accés a Contoso Airlines - Producción i a Contoso Airlines - Desarrollo, cada ordre az s'executa contra la subscripció activa. Confondre's aquí és com s'esborren coses en producció.

# Veure totes les subscripcions accessibles. IsDefault marca l'activa.
az account list --output table
Name                              CloudName    SubscriptionId                        State    IsDefault
--------------------------------  -----------  ------------------------------------  -------  ---------
Contoso Airlines - Producción     AzureCloud   8f4c2b7a-1d3e-4a55-9c11-0a7b6e2d4f90  Enabled  True
Contoso Airlines - Desarrollo     AzureCloud   3b91e5d0-7c42-4f88-a2e6-5d9c1a8b3e77  Enabled  False
# Canviar la subscripció activa (accepta nom o identificador).
az account set --subscription "Contoso Airlines - Desarrollo"

# Confirmar on ets abans de tocar res. Fes-ne un hàbit.
az account show --query "{Subscripcio:name, Id:id, Usuari:user.name}" --output table

Dues defenses pràctiques:

  1. Comença tots els teus scripts fixant la subscripció explícitament amb az account set. No et refiïs de la que estigui activa.
  2. Fes servir el paràmetre --subscription a les ordres crítiques, per no dependre de l'estat global:
az group delete --name rg-contoso-reservas-dev \
  --subscription "Contoso Airlines - Desarrollo" --yes

  1. Anatomia d'una ordre az i ajuda integrada

Totes les ordres d'Azure CLI segueixen la mateixa estructura:

az <grup> [<subgrup>] <ordre> [--paràmetres]

Exemple desglossat:

az storage account create --name sttarjetascontosodev --resource-group rg-contoso-reservas-dev --location westeurope --sku Standard_LRS
Part Valor Què és
az — El programa
storage grup La família de servei
account subgrup L'objecte concret dins d'aquella família
create ordre L'acció (create, list, show, update, delete)
--name, --resource-group... paràmetres Les dades de l'operació

Els verbs es repeteixen a tota la CLI, i això fa que sigui predictible: si saps az vm list, intueixes az storage account list, az webapp list i az sql db list.

Abreviatures freqüents: -n per a --name, -g per a --resource-group, -l per a --location, -o per a --output.

Ajuda integrada

# Ajuda d'un grup: mostra subgrups i ordres disponibles.
az storage --help

# Ajuda d'una ordre concreta: llista TOTS els seus paràmetres, quins són obligatoris i exemples.
az storage account create --help

# Cerca intel·ligent per llenguatge natural, amb exemples reals d'ús.
az find "az storage account"
az find "crear un compte d'emmagatzematge"

I el mode interactiu, molt útil mentre aprens (requereix instal·lar l'extensió):

# Autocompletat, descripcions de paràmetres i exemples mentre escrius.
az interactive

  1. Formats de sortida i consultes amb --query

Per defecte, la CLI retorna JSON, que és complet però incòmode de llegir. El paràmetre --output (o -o) canvia el format:

Valor Resultat Quan fer-lo servir
json (per defecte) JSON amb format Veure tots els camps disponibles
jsonc JSON acolorit Lectura al terminal
table Taula llegible Ús diari i informes ràpids
tsv Valors separats per tabuladors, sense capçaleres ni cometes Scripts: alimentar variables
yaml YAML Configuracions llegibles
none Res Quan només importa que l'operació funcioni

JMESPath: el llenguatge de --query

--query fa servir JMESPath, un llenguatge de consulta sobre JSON. Anem amb exemples progressius sobre els recursos de Contoso.

Pas 1 — seleccionar una propietat d'un objecte:

# Retorna només la ubicació d'un grup de recursos, sense cometes (tsv), llesta per a una variable.
az group show --name rg-contoso-reservas-dev --query location --output tsv

Pas 2 — recórrer una llista i quedar-se amb un camp:

# Noms de tots els grups de recursos. [] recorre la llista.
az group list --query "[].name" --output tsv

Pas 3 — construir un objecte amb noms propis:

# Reanomena els camps de sortida. Les claus de l'esquerra són etiquetes teves.
az group list \
  --query "[].{Nom:name, Regio:location, Estat:properties.provisioningState}" \
  --output table
Nom                        Regio       Estat
-------------------------  ----------  ---------
rg-contoso-reservas-dev    westeurope  Succeeded
rg-contoso-reservas-pro    westeurope  Succeeded

Pas 4 — filtrar amb condicions (?):

# Només els grups etiquetats com a producció.
az group list \
  --query "[?tags.entorno=='produccion'].{Nom:name, Propietari:tags.propietario}" \
  --output table

# Només els comptes d'emmagatzematge de West Europe.
az storage account list \
  --query "[?location=='westeurope'].{Compte:name, Grup:resourceGroup, Sku:sku.name}" \
  --output table

Pas 5 — detectar el que falta (auditoria de governança):

# Recursos SENSE l'etiqueta obligatòria "propietario": l'informe que demana la Marta Ríos.
# == `null` compara amb nul; els accents greus marquen un literal JSON.
az resource list \
  --query "[?tags.propietario == \`null\`].{Recurs:name, Tipus:type, Grup:resourceGroup}" \
  --output table

Pas 6 — combinar amb funcions i ordenació:

# Comptar quants recursos hi ha en total.
az resource list --query "length(@)" --output tsv

# Els recursos ordenats per nom, mostrant només tipus i grup.
az resource list \
  --query "sort_by([].{Nom:name, Tipus:type, Grup:resourceGroup}, &Nom)" \
  --output table

Pas 7 — fer servir el resultat en un script:

# Desar un valor en una variable de shell. --output tsv evita les cometes del JSON.
CLAU_REGIO=$(az group show --name rg-contoso-reservas-dev --query location --output tsv)
echo "El grup és a: $CLAU_REGIO"

Truc d'aprenentatge: executa primer l'ordre sense --query i amb --output json per veure l'estructura completa, i només llavors escriu la consulta. És molt més ràpid que endevinar els noms dels camps.

  1. Azure PowerShell i quan triar cada eina

Azure PowerShell és l'altre client oficial, basat en el mòdul Az. Fa el mateix que la CLI, però amb la filosofia de PowerShell: en comptes de text, retorna objectes amb propietats sobre els quals pots operar directament.

Instal·lació i primeres ordres

# Instal·la el mòdul Az per a l'usuari actual (no requereix permisos d'administrador).
Install-Module -Name Az -Scope CurrentUser -Repository PSGallery -Force

# Inicia sessió (obre el navegador).
Connect-AzAccount

# Veure les subscripcions disponibles i seleccionar-ne una.
Get-AzSubscription
Set-AzContext -Subscription "Contoso Airlines - Desarrollo"

# Crear el grup de recursos de Contoso amb les seves etiquetes.
New-AzResourceGroup -Name "rg-contoso-reservas-dev" -Location "westeurope" -Tag @{
    entorno       = "desarrollo"
    proyecto      = "contoso-reservas"
    "centro-coste" = "CC-1042"
    propietario   = "[email protected]"
}

# Llistar recursos i filtrar per etiqueta, aprofitant els objectes de PowerShell.
Get-AzResource -TagName "proyecto" -TagValue "contoso-reservas" |
    Select-Object Name, ResourceType, ResourceGroupName |
    Format-Table

Fixa't en la diferència de filosofia: a la CLI filtres amb --query (JMESPath sobre JSON); a PowerShell filtres amb Where-Object i selecciones amb Select-Object, perquè ja tens objectes.

Comparativa

Aspecte Azure CLI (az) Azure PowerShell (Az)
Sintaxi az grup subgrup ordre Verb-AzSubstantiu (New-AzResourceGroup)
Sortida JSON (text) Objectes de .NET
Filtratge --query amb JMESPath Where-Object, Select-Object
Shell natiu Bash, Zsh; funciona en qualsevol shell PowerShell (Windows, Linux i macOS)
Corba d'entrada Més suau si véns de Linux Més suau si véns de Windows
Integració Excel·lent en canalitzacions multiplataforma i contenidors Excel·lent amb Windows Server, Microsoft 365 i Exchange
Documentació de Microsoft Exemples en totes dues Exemples en totes dues

Com triar, sense dogmatismes:

  • Si el teu equip és d'administradors de sistemes Windows i ja automatitza amb PowerShell, fes servir PowerShell.
  • Si el teu equip ve de Linux, Docker o desenvolupament multiplataforma, fes servir la CLI.
  • Si escrius scripts per a canalitzacions de CI/CD en contenidors Linux, la CLI sol ser més lleugera i directa.
  • L'important és ser coherent dins d'un mateix projecte. A Contoso, en Diego i la Marta acorden fer servir Azure CLI, i aquest és el criteri del curs a partir d'aquí.

  1. Cloud Shell

Azure Cloud Shell és un terminal allotjat a Azure, accessible des de la icona >_ de la barra superior del portal (o a shell.azure.com). Avantatges immediats:

  • Ja està autenticat amb la teva identitat: no cal fer az login.
  • Porta les eines instal·lades i actualitzades: Azure CLI, Azure PowerShell, Bicep, Terraform, kubectl, Git, Python, Node.js, i editors com vim, nano i l'editor gràfic integrat (code .).
  • Funciona des de qualsevol navegador, inclòs el mòbil.

Bash o PowerShell

Pots triar l'intèrpret al desplegable superior i canviar-lo en qualsevol moment. Les ordres az funcionen en tots dos; les Az* de PowerShell, només en el mode PowerShell.

El compte d'emmagatzematge que crea

La primera vegada que obres Cloud Shell, et demana crear (o associar) un compte d'emmagatzematge. Això no és cap caprici:

  • Cloud Shell corre en un contenidor efímer: quan acaba la sessió, el contenidor es destrueix.
  • Perquè els teus fitxers sobrevisquin, munta un recurs compartit d'Azure Files al teu directori $HOME, dins d'una imatge de disc anomenada normalment acc_<usuari>.img.
  • El que desis a $HOME (~/clouddrive) persisteix entre sessions; el que instal·lis fora d'allà, no.

Avís de cost: aquest compte d'emmagatzematge és un recurs teu i es factura, encara que l'import sigui molt petit (uns cèntims al mes per uns pocs GB). Cloud Shell en si no costa res; el seu emmagatzematge, sí. Si deixes de fer-lo servir, pots esborrar el grup de recursos que es crea automàticament (sol anomenar-se cloud-shell-storage-<regió>).

Altres característiques i límits

Aspecte Detall
Temps d'inactivitat La sessió es tanca després d'uns 20 minuts sense interacció
Persistència Només $HOME / clouddrive; la resta del sistema de fitxers es perd
Càrrega i descàrrega de fitxers Botó de Carrega/Baixa a la barra de Cloud Shell
Editor integrat code . obre un editor gràfic dins del navegador
Sessions simultànies Limitades; una sessió Bash i una de PowerShell alhora
Regió de l'emmagatzematge Es tria en crear-lo; convé posar-lo a prop teu

Quan fer servir Cloud Shell: per aprendre (no instal·les res), per a tasques puntuals des d'un equip aliè, per a emergències des del mòbil. Quan no: per a feina diària intensiva o scripts llargs, on una CLI local amb el teu editor i el teu repositori Git és més còmoda.

  1. Script complet: la base de Contoso Airlines

Ara l'exercici central del mòdul: un script que crea tota la base de la plataforma de Contoso Airlines. És parametritzat (tot en variables al principi), idempotent (es pot executar diverses vegades sense trencar res ni duplicar recursos) i està comentat línia a línia.

Desa'l com a desplegar-base-contoso.sh.

#!/usr/bin/env bash
# =============================================================================
# desplegar-base-contoso.sh
# Crea la base de la plataforma de Contoso Airlines:
#   - Grup de recursos amb les etiquetes obligatòries
#   - Compte d'emmagatzematge per a les targetes d'embarcament en PDF
#   - Contenidor privat "tarjetas-embarque"
#
# És IDEMPOTENT: executar-lo dues vegades deixa el mateix resultat que executar-lo una.
# Ús:   ./desplegar-base-contoso.sh [dev|pro]
# =============================================================================

# 'set -e' avorta l'script davant del primer error, en comptes de continuar a cegues.
# 'set -u' avorta si es fa servir una variable no definida (evita errades perilloses).
# 'set -o pipefail' propaga l'error de qualsevol ordre dins d'una canonada.
set -euo pipefail

# ------------------------------------------------------------------
# 1. PARÀMETRES. Tot el configurable, en un sol lloc i a dalt.
# ------------------------------------------------------------------
ENTORN="${1:-dev}"                        # Primer argument; "dev" si no s'indica
SUBSCRIPCIO="Contoso Airlines - Desarrollo"
REGIO="westeurope"                        # Regió principal decidida a la lliçó 01-02
PROJECTE="contoso-reservas"
CENTRE_COST="CC-1042"
PROPIETARI="[email protected]"

# Noms derivats, seguint la convenció de nomenclatura de Contoso.
GRUP="rg-${PROJECTE}-${ENTORN}"            # p. ex. rg-contoso-reservas-dev
# Els comptes d'emmagatzematge només admeten minúscules i números (3-24 caràcters)
# i el seu nom és ÚNIC A TOT AZURE: hi afegim un sufix aleatori estable per si de cas.
SUFIX="$(echo -n "${GRUP}" | cksum | cut -c1-4)"
COMPTE_ALM="sttarjetascontoso${ENTORN}${SUFIX}"
CONTENIDOR="tarjetas-embarque"

# Traducció de l'entorn curt al valor d'etiqueta que exigeix l'esquema de Contoso.
if [ "${ENTORN}" = "pro" ]; then
  ENTORN_TAG="produccion"
else
  ENTORN_TAG="desarrollo"
fi

echo "=== Desplegament de la base de Contoso Airlines (${ENTORN_TAG}) ==="

# ------------------------------------------------------------------
# 2. CONTEXT. No et refiïs mai de la subscripció que estigués activa.
# ------------------------------------------------------------------
az account set --subscription "${SUBSCRIPCIO}"
echo "Subscripció activa: $(az account show --query name --output tsv)"

# ------------------------------------------------------------------
# 3. PROVEÏDORS. Necessaris en subscripcions noves; és innocu repetir-ho.
# ------------------------------------------------------------------
az provider register --namespace Microsoft.Storage --wait

# ------------------------------------------------------------------
# 4. GRUP DE RECURSOS.
#    'az group create' ja és idempotent: si existeix, n'actualitza les etiquetes.
# ------------------------------------------------------------------
echo "--> Grup de recursos: ${GRUP}"
az group create \
  --name "${GRUP}" \
  --location "${REGIO}" \
  --tags entorno="${ENTORN_TAG}" \
         proyecto="${PROJECTE}" \
         centro-coste="${CENTRE_COST}" \
         propietario="${PROPIETARI}" \
  --output none

# ------------------------------------------------------------------
# 5. COMPTE D'EMMAGATZEMATGE.
#    Comprovem primer si existeix, perquè l'script sigui idempotent
#    i per no fallar si el nom global ja està ocupat per una altra persona.
# ------------------------------------------------------------------
echo "--> Compte d'emmagatzematge: ${COMPTE_ALM}"
if az storage account show --name "${COMPTE_ALM}" --resource-group "${GRUP}" --output none 2>/dev/null; then
  echo "    Ja existeix: no es torna a crear."
else
  # --sku Standard_LRS  : l'opció més econòmica (redundància local). Mòdul 2.
  # --kind StorageV2    : tipus de compte actual, admet blobs, cues, taules i fitxers.
  # --min-tls-version   : força TLS 1.2 com a mínim.
  # --allow-blob-public-access false : NINGÚ no pot llegir els PDF de manera anònima.
  # --https-only true   : rebutja el trànsit sense xifrar.
  az storage account create \
    --name "${COMPTE_ALM}" \
    --resource-group "${GRUP}" \
    --location "${REGIO}" \
    --sku Standard_LRS \
    --kind StorageV2 \
    --min-tls-version TLS1_2 \
    --https-only true \
    --allow-blob-public-access false \
    --tags entorno="${ENTORN_TAG}" \
           proyecto="${PROJECTE}" \
           centro-coste="${CENTRE_COST}" \
           propietario="${PROPIETARI}" \
    --output none
  echo "    Creat."
fi

# ------------------------------------------------------------------
# 6. CONTENIDOR DE BLOBS.
#    --auth-mode login fa servir LA TEVA identitat d'Entra ID en comptes de la clau del
#    compte: és la manera recomanada i no exposa secrets a l'script.
#    (Requereix tenir un rol de dades, p. ex. "Col·laborador de dades de Blob".)
# ------------------------------------------------------------------
echo "--> Contenidor: ${CONTENIDOR}"
az storage container create \
  --name "${CONTENIDOR}" \
  --account-name "${COMPTE_ALM}" \
  --auth-mode login \
  --public-access off \
  --output none

# ------------------------------------------------------------------
# 7. RESUM. Comprovació final llegible del que s'ha desplegat.
# ------------------------------------------------------------------
echo ""
echo "=== Desplegament completat ==="
az resource list \
  --resource-group "${GRUP}" \
  --query "[].{Recurs:name, Tipus:type, Regio:location}" \
  --output table

echo ""
echo "Per eliminar TOT el que s'ha creat i deixar de pagar, executa:"
echo "  az group delete --name ${GRUP} --yes --no-wait"

Com executar-lo

# Donar permisos d'execució (només la primera vegada).
chmod +x desplegar-base-contoso.sh

# Desplegar l'entorn de desenvolupament.
./desplegar-base-contoso.sh dev

Què fa que aquest script sigui idempotent

Tècnica utilitzada Per què importa
az group create sobre un grup existent No falla: n'actualitza les etiquetes
Comprovació prèvia amb az storage account show Evita l'error de "nom ja en ús" en tornar-lo a executar
Noms derivats de variables, no escrits a mà El mateix script serveix per a dev i per a pro
set -euo pipefail Atura l'script davant de la primera errada en comptes de deixar un desplegament a mitges
--output none Sortida neta; només s'imprimeix el que decidim

Si t'hi fixes, aquest script fa una cosa molt semblant a una plantilla d'infraestructura com a codi, però de manera imperativa (pas a pas). El nivell següent és fer-ho declaratiu amb Bicep, i això és exactament la lliçó 05-06.

  1. Neteja: esborrar sense deixar rastre de despesa

Aquest apartat és obligatori, no opcional. El cost del que has creat en aquest mòdul és de cèntims, però l'hàbit val diners reals quan treballis amb màquines virtuals i bases de dades.

# Esborra el grup i ABSOLUTAMENT TOT el que conté. És irreversible.
# --yes     : no demana confirmació (fes-lo servir només quan n'estiguis segur).
# --no-wait : retorna el control immediatament; l'esborrat continua en segon pla.
az group delete --name rg-contoso-reservas-dev --yes --no-wait

Comprovacions abans i després:

# Abans: veure exactament què es destruirà.
az resource list --resource-group rg-contoso-reservas-dev --output table

# Després: confirmar que el grup ja no existeix (retorna "false").
az group exists --name rg-contoso-reservas-dev

I una comprovació d'higiene que convé fer periòdicament a tota la subscripció:

# Llista TOTS els grups de recursos amb les seves etiquetes: buscant orfes i oblits.
az group list --query "[].{Grup:name, Regio:location, Entorn:tags.entorno, Propietari:tags.propietario}" --output table

# Busca discos que ja no estan connectats a cap màquina virtual: despesa pura.
az disk list --query "[?diskState=='Unattached'].{Disc:name, Grup:resourceGroup, GB:diskSizeGb}" --output table

# Busca adreces IP públiques sense associar: també es facturen.
az network public-ip list --query "[?ipConfiguration==null].{IP:name, Grup:resourceGroup}" --output table

Aquestes tres últimes ordres són, literalment, tres de les fonts de despesa inútil més habituals en comptes d'Azure reals. Desa-les.

Recorda a més: si vas crear un bloqueig CanNotDelete a la lliçó anterior, l'esborrat fallarà fins que l'eliminis amb az lock delete. Està dissenyat perquè sigui així.

Errors Comuns i Consells

  • Executar ordres a la subscripció equivocada. Comença sempre amb az account set i confirma amb az account show. És l'error que més mal fa.
  • Treballar amb una CLI desactualitzada. Si un paràmetre "no existeix", executa az upgrade abans de buscar als fòrums.
  • Posar majúscules o guions al nom del compte d'emmagatzematge. Només minúscules i números, 3-24 caràcters, i únic a tot Azure.
  • Fer servir --output json dins dels scripts. Per alimentar variables fes servir --output tsv: evita cometes i salts de línia inesperats.
  • Escriure claus d'accés o contrasenyes dins de l'script. Fes servir --auth-mode login, identitats administrades (lliçó 04-02) o Key Vault (lliçó 04-03).
  • Oblidar que Cloud Shell es tanca als 20 minuts d'inactivitat i que només persisteix $HOME. Desa la teva feina a ~/clouddrive o, millor, en un repositori Git.
  • Oblidar que l'emmagatzematge de Cloud Shell es factura. Són pocs diners, però si deixes de fer-lo servir, esborra'l.
  • Escriure consultes --query a cegues. Executa primer l'ordre en JSON, mira l'estructura i després consulta.
  • Esborrar amb --yes sense mirar abans. Executa az resource list --resource-group ... per veure què desapareixerà.
  • Consell final de cost: adopta el costum d'acabar cada sessió de pràctiques amb az group delete. Un grup de recursos per pràctica, esborrat al final: és la disciplina més rendible que pots adquirir en aquest curs.

Exercicis

Exercici 1: Consultes de governança

Escriu les ordres d'Azure CLI que resolguin aquestes peticions de la Marta Ríos:

  1. Mostrar en una taula el nom i la regió de tots els grups de recursos de la subscripció activa.
  2. Llistar tots els recursos etiquetats amb proyecto=contoso-reservas, mostrant nom, tipus i grup.
  3. Detectar els recursos que no tinguin l'etiqueta centro-coste.
  4. Desar en una variable de shell anomenada REGIO_PRO la regió del grup rg-contoso-reservas-pro.

Exercici 2: Adaptar l'script

Partint de l'script desplegar-base-contoso.sh de l'apartat 8:

  1. Afegeix una variable CRITICITAT i aplica-la com a etiqueta al grup i al compte d'emmagatzematge, amb valor alta si l'entorn és pro i baja en cas contrari.
  2. Afegeix un pas que, només si l'entorn és pro, apliqui un bloqueig CanNotDelete sobre el grup.
  3. Explica per què el pas 3 de l'script (az provider register) és segur encara que s'executi cada vegada.

Exercici 3: Comparar eines i netejar

  1. Escriu l'equivalent en Azure PowerShell d'aquestes dues ordres de la CLI:
az group create --name rg-contoso-millas-dev --location westeurope --tags entorno=desarrollo proyecto=contoso-millas
az group delete --name rg-contoso-millas-dev --yes
  1. Justifica en tres línies quina eina triaries per a una canalització de CI/CD que s'executa en un contenidor Linux, i per què.
  2. Escriu les ordres que auditen una subscripció buscant discos sense connectar i adreces IP públiques sense associar, i explica per què aquests dos recursos són fonts clàssiques de despesa inútil.

Solucions

Solució 1:

# 1. Grups de recursos amb nom i regió.
az group list --query "[].{Grup:name, Regio:location}" --output table

# 2. Recursos del projecte.
az resource list --tag proyecto=contoso-reservas \
  --query "[].{Recurs:name, Tipus:type, Grup:resourceGroup}" --output table

# 3. Recursos SENSE l'etiqueta centro-coste.
az resource list \
  --query "[?tags.\"centro-coste\" == \`null\`].{Recurs:name, Tipus:type, Grup:resourceGroup}" \
  --output table

# 4. Regió del grup de producció en una variable.
REGIO_PRO=$(az group show --name rg-contoso-reservas-pro --query location --output tsv)
echo "$REGIO_PRO"

Nota sobre el punt 3: com que el nom de l'etiqueta porta un guionet, cal posar-lo entre cometes dins de l'expressió JMESPath.

Solució 2:

  1. Variable i etiqueta de criticitat:
# Al costat de la resta de paràmetres:
if [ "${ENTORN}" = "pro" ]; then
  CRITICITAT="alta"
else
  CRITICITAT="baja"
fi

# I s'afegeix al bloc de --tags d'az group create i d'az storage account create:
#   criticidad="${CRITICITAT}"
  1. Bloqueig condicional en producció:
if [ "${ENTORN}" = "pro" ]; then
  echo "--> Aplicant bloqueig CanNotDelete al grup de producció"
  # 'az lock create' falla si ja existeix un bloqueig amb aquest nom;
  # ho comprovem primer per mantenir la idempotència de l'script.
  if ! az lock show --name "no-borrar-produccion" --resource-group "${GRUP}" --output none 2>/dev/null; then
    az lock create \
      --name "no-borrar-produccion" \
      --lock-type CanNotDelete \
      --resource-group "${GRUP}" \
      --notes "Plataforma de venda en produccio. Retirar nomes amb autoritzacio." \
      --output none
  fi
fi
  1. az provider register és idempotent: si el proveïdor ja està registrat, l'operació no canvia res i acaba correctament. Registrar-lo no costa diners ni té efectes secundaris, per la qual cosa incloure'l garanteix que l'script funcioni també en una subscripció acabada de crear.

Solució 3:

  1. Equivalents en Azure PowerShell:
New-AzResourceGroup -Name "rg-contoso-millas-dev" -Location "westeurope" -Tag @{
    entorno  = "desarrollo"
    proyecto = "contoso-millas"
}

Remove-AzResourceGroup -Name "rg-contoso-millas-dev" -Force
  1. Per a una canalització en un contenidor Linux triaria Azure CLI: la imatge és més lleugera que instal·lar el mòdul Az de PowerShell, la sintaxi encaixa de manera natural amb Bash, la majoria de tasques de canalització són d'una línia, i pràcticament tots els exemples de canalitzacions d'Azure DevOps i GitHub Actions estan escrits amb az.

  2. Auditoria de despesa inútil:

az disk list --query "[?diskState=='Unattached'].{Disc:name, Grup:resourceGroup, GB:diskSizeGb}" --output table
az network public-ip list --query "[?ipConfiguration==null].{IP:name, Grup:resourceGroup}" --output table

Són fonts clàssiques de despesa perquè es facturen per existir, no per fer-se servir. En esborrar una màquina virtual, els seus discos gestionats i la seva IP pública no s'eliminen automàticament si no es va marcar l'opció corresponent: queden orfes, invisibles en el dia a dia i cobrant cada mes. Una revisió mensual amb aquestes dues ordres sol ser l'optimització més rendible i més ràpida d'aplicar.

Conclusió

Amb aquesta lliçó tanques el mòdul 1 i ja tens la caixa d'eines completa. Saps per què automatitzar (repetible, auditable, escalable), has instal·lat Azure CLI i n'has comprovat la versió, saps iniciar sessió i —molt important— canviar i confirmar la subscripció activa abans de tocar res. Coneixes l'anatomia d'una ordre az i la seva ajuda integrada (--help, az find), i manejes --output table per llegir i --query amb JMESPath per filtrar, reanomenar camps, detectar recursos sense etiquetar i alimentar variables als scripts. Saps què aporta Azure PowerShell i amb quin criteri triar entre l'un i l'altre, i com funciona Cloud Shell: els seus dos intèrprets, el compte d'emmagatzematge que crea i factura, la persistència limitada a $HOME i el tancament per inactivitat. I has escrit un script real, parametritzat, comentat i idempotent que crea el grup rg-contoso-reservas-dev, el compte d'emmagatzematge de targetes d'embarcament i el seu contenidor privat, amb les etiquetes obligatòries de Contoso Airlines, a més de la rutina de neteja que evita factures sorpresa.

Recapitulant el mòdul complet: has entès què és el núvol i què és Azure i has conegut el cas de Contoso Airlines; has distingit IaaS, PaaS, SaaS i serverless, el model de responsabilitat compartida i la geografia d'Azure, fixant West Europe com a regió principal i North Europe com a parella; has creat i protegit el teu compte amb MFA i un pressupost amb alertes; et mous amb soltesa pel portal; domines Azure Resource Manager, la jerarquia de subscripció, grup de recursos i recurs, els bloquejos i l'esquema d'etiquetatge de Contoso; i ara automatitzes des de la línia d'ordres.

Tens els fonaments: el compte, la governança, la nomenclatura, els grups de recursos i l'eina per desplegar. El que falta és la plataforma en si. Al mòdul 2, Serveis principals d'Azure, comencem a construir-la de debò: desplegarem les màquines virtuals del motor de disponibilitat heretat, aprendrem a escalar i donar alta disponibilitat al còmput, publicarem Contoso Reserves i l'API de Disponibilitat a App Service, desarem les targetes d'embarcament a Azure Storage amb la redundància adequada, i construirem la xarxa virtual amb les seves subxarxes i grups de seguretat, a més de la connectivitat híbrida amb les oficines de Barcelona i Palma. Ens hi veiem.

Curs d'Azure

Mòdul 1: Introducció a Azure

Mòdul 2: Serveis principals d'Azure

Mòdul 3: Bases de dades d'Azure

Mòdul 4: Seguretat a Azure

Mòdul 5: Azure DevOps

Mòdul 6: Serveis avançats d'Azure

Mòdul 7: Monitoratge i gestió

Mòdul 8: Gestió i optimització de costos

Mòdul 9: Estudis de cas i millors pràctiques

© Copyright 2026. Tots els drets reservats