Tips voor het geslaagde gebruik van de Azure CLI

Azure CLI is een opdrachtregelprogramma waarmee u Azure-resources vanuit veel shell-omgevingen kunt configureren en beheren. Nadat u de gewenste shell-omgeving hebt gekozen en de Azure CLI hebt geïnstalleerd, gebruikt u dit artikel om nuttige tips te ontdekken over het voorkomen van veelvoorkomende valkuilen en het gebruik van de Azure CLI.

Zie de azure CLI-referentielijst voor meer informatie over specifieke Azure CLI-opdrachten.

Uitvoeropmaak

Er worden drie algemene uitvoerindelingen gebruikt met Azure CLI-opdrachten:

  1. De json indeling toont informatie als een JSON-tekenreeks.

    • JSON biedt u de meest uitgebreide informatie.
    • Deze indeling is de standaardindeling, maar u kunt de --output parameter gebruiken om een andere optie op te geven.
    • Wijzig de algemene standaardindeling in een van uw persoonlijke voorkeuren met behulp van az config , zoals az config set core.output=table.
    • De JSON-indeling behoudt de dubbele aanhalingstekens, waardoor deze over het algemeen niet geschikt is voor scriptdoeleinden.
  2. De table indeling geeft uitvoer weer als een leesbare tabel. U kunt opgeven welke waarden in de tabel worden weergegeven en query's gebruiken om de uitvoer aan te passen, zoals hier wordt weergegeven:

    # command
    az vm show --resource-group myResourceGroup --name myVMname --query "{name: name, os:storageProfile.imageReference.offer}" --output table
    
    # output
    Name    Os
    ------  ------------
    myVMname   UbuntuServer
    
  3. De tsv opmaak retourneert door tabs gescheiden en nieuwe regels gescheiden waarden zonder extra opmaak, toetsen of andere symbolen.

    • De TSV-indeling is handig voor beknopte uitvoer- en scriptdoeleinden.
    • De TSV stript dubbele aanhalingstekens die de JSON-indeling behoudt.
    • Als u de gewenste indeling voor TSV wilt opgeven, gebruikt u de --query parameter.
    export vm_ids=$(az vm list --show-details --resource-group myResourceGroup --query "[?powerState=='VM running'].id" --output tsv)
    az vm stop --ids $vm_ids
    

Zie Uitvoerindelingen voor Azure CLI-opdrachten voor meer informatie over deze en andere indelingen.

Waarden doorgeven aan een andere opdracht

Als de waarde meerdere keren wordt gebruikt, wijst u deze toe aan een variabele. Met variabelen kunt u waarden meer dan één keer gebruiken of meer algemene scripts maken. In dit voorbeeld wordt een id toegewezen die is gevonden met de opdracht az vm list aan een variabele.

# assign the list of running VMs to a variable
running_vm_ids=$(az vm list --resource-group MyResourceGroup --show-details \
    --query "[?powerState=='VM running'].id" --output tsv)

# verify the value of the variable
echo $running_vm_ids

Als de waarde slechts eenmaal wordt gebruikt, kunt u leidingen overwegen. (Piping geeft de uitvoer van één opdracht door als invoer aan een tweede opdracht.)

az vm list --query "[?powerState=='VM running'].name" --output tsv | grep my_vm

Houd rekening met de volgende opties voor lijsten met meerdere waarden:

  1. Als u meer besturingselementen voor het resultaat nodig hebt, gebruikt u een 'for'-lus:

    #!/usr/bin/env bash
    for vmList in $(az vm list --resource-group MyResourceGroup --show-details --query "[?powerState=='VM running'].id"   --output tsv); do
        echo stopping $vmList
        az vm stop --ids $vmList
        if [ $? -ne 0 ]; then
            echo "Failed to stop $vmList"
            exit 1
        fi
        echo $vmList stopped
    done
    
  2. U kunt ook de -P vlag gebruiken xargs en gebruiken om de bewerkingen parallel uit te voeren voor verbeterde prestaties:

    az vm list --resource-group MyResourceGroup --show-details \
      --query "[?powerState=='VM stopped'].id" \
      --output tsv | xargs -I {} -P 10 az vm start --ids "{}"
    
  3. Ten slotte biedt Azure CLI ingebouwde ondersteuning voor het verwerken van opdrachten met meerdere --ids parallel om hetzelfde effect van xargs te bereiken. @- wordt gebruikt om waarden op te halen uit de pijp:

    az vm list --resource-group MyResourceGroup --show-details \
      --query "[?powerState=='VM stopped'].id" \
      --output tsv | az vm start --ids @-
    

Voor meer informatie over het gebruik van Bash-constructies met de Azure CLI, inclusief lussen, case-instructies, if.. Dan.. zie Meer informatie over het gebruik van Bash met de Azure CLI.

Aanhalingstekens gebruiken in parameters

Wanneer u met Azure CLI-opdrachten werkt, moet u weten hoe uw shell aanhalingstekens en escapetekens gebruikt. Als u scripts ondersteunt die in verschillende shells worden gebruikt, begrijpt u hoe deze verschillen.

Notitie

Vanwege een bekend probleem in PowerShell zijn enkele extra escaperegels van toepassing. Zie Quoting issues with PowerShell (Quoting issues with PowerShell)

Hier volgen enkele suggesties om onverwachte resultaten te voorkomen:

  • Als u een parameter opgeeft die witruimte bevat, verpakt u deze tussen aanhalingstekens.

  • In Bash of PowerShell worden zowel enkele als dubbele aanhalingstekens correct geïnterpreteerd. In de Windows-opdrachtprompt worden alleen dubbele aanhalingstekens correct geïnterpreteerd. Enkele aanhalingstekens worden behandeld als onderdeel van de waarde.

  • Als uw opdracht alleen wordt uitgevoerd op Bash (of Zsh), gebruikt u enkele aanhalingstekens om de inhoud in de JSON-tekenreeks te behouden. Enkele aanhalingstekens zijn nodig bij het opgeven van inline JSON-waarden. Deze JSON is bijvoorbeeld juist in Bash: '{"key": "value"}'.

  • Als uw opdracht wordt uitgevoerd bij een Windows-opdrachtprompt, moet u dubbele aanhalingstekens gebruiken. Als de waarde dubbele aanhalingstekens bevat, moet u deze escapen. Het equivalent van de bovenstaande JSON-tekenreeks is "{\"key\": \"value\"}"

  • Als uw waarde een lege tekenreeks is, gebruikt '""'u in PowerShell.

  • Gebruik in Bash of PowerShell, als uw waarde een lege aanhalingstekenreeks ''is."''"

  • Gebruik de conventie van @<file> Azure CLI om vanuit een bestand te laden en de interpretatiemechanismen van de shell te omzeilen.

    az ad app create --display-name myName --native-app --required-resource-accesses @manifest.json
    
  • Bash evalueert dubbele aanhalingstekens in geëxporteerde variabelen. Als dit gedrag niet is wat u wilt, escapet u aan de variabele: "\$variable".

  • Sommige Azure CLI-opdrachten nemen een lijst met door spaties gescheiden waarden.

    • Als de sleutelnaam of -waarde spaties bevat, verpakt u het hele paar: "my key=my value". Voorbeeld:

      az web app config app settings set --resource-group myResourceGroup --name myWebAppName --settings "client id=id1" "my name=john"
      
    • Wanneer een CLI-parameter aangeeft dat deze een door spaties gescheiden lijst accepteert, wordt een van de volgende twee indelingen verwacht:

      1. Niet-aanhalingsteken, door spaties gescheiden lijst --parameterName firstValue secondValue
      2. Door spaties gescheiden lijst tussen aan citeren --parameterName "firstValue" "secondValue"

      Dit voorbeeld is een tekenreeks met daarin een spatie. Het is geen door spaties gescheiden lijst: --parameterName "firstValue secondValue"

  • Er zijn speciale tekens van PowerShell, zoals bij @. Als u Azure CLI wilt uitvoeren in PowerShell, voegt u deze toe ` vóór het speciale teken om deze te escapen. U kunt de waarde ook tussen enkele of dubbele aanhalingstekens "/"plaatsen.

    # The following three examples will work in PowerShell
    --parameterName `@parameters.json
    --parameterName '@parameters.json'
    --parameterName "@parameters.json"
    
    # This example will not work in PowerShell
    --parameterName @parameters.json
    
  • Wanneer u de --query parameter met een opdracht gebruikt, moeten sommige tekens van JMESPath worden ontsnapt in de shell.

    Deze drie opdrachten zijn correct en gelijkwaardig in Bash:

    az version --query '"azure-cli"'
    az version --query \"azure-cli\"
    az version --query "\"azure-cli\""
    

    Hier volgen twee voorbeelden van onjuiste opdrachten in Bash:

    # Wrong, as the dash needs to be quoted in a JMESPath query
    az version --query azure-cli
    az version: error: argument --query: invalid jmespath_type value: 'azure-cli'
    
    # Wrong, as the dash needs to be quoted in a JMESPath query, but quotes are interpreted by Bash
    az version --query "azure-cli"
    az version: error: argument --query: invalid jmespath_type value: 'azure-cli'
    

    Zie De uitvoer van azure CLI-opdrachten opvragen voor meer voorbeelden tussen Bash, PowerShell en Cmd


  • De beste manier om een quotingprobleem op te lossen, is door de opdracht uit te voeren met de --debug vlag. Met deze vlag worden de werkelijke argumenten weergegeven die zijn ontvangen door de Azure CLI in de syntaxis van Python.

    # Correct
    $ az '{"key":"value"}' --debug
    Command arguments: ['{"key":"value"}', '--debug']
    
    # Correct
    $ az "{\"key\":\"value\"}" --debug
    Command arguments: ['{"key":"value"}', '--debug']
    
    # Wrong, as quotes and spaces are interpreted by Bash
    $ az {"key": "value"} --debug
    Command arguments: ['{key:', 'value}', '--debug']
    
    # Wrong, as quotes are interpreted by Bash
    $ az {"key":"value"} --debug
    Command arguments: ['{key:value}', '--debug']
    

Afbreekstreepjes gebruiken in parameters

Als de waarde van een parameter begint met een afbreekstreepje, probeert Azure CLI deze te parseren als parameternaam. Als u deze wilt parseren als waarde, gebruikt = u om de parameternaam en -waarde samen te voegen: --password="-VerySecret".

Asynchrone bewerkingen

Bewerkingen in Azure kunnen een merkbare hoeveelheid tijd in beslag nemen. Het configureren van een virtuele machine in een datacenter is bijvoorbeeld niet onmiddellijk. Azure CLI wacht totdat de opdracht is voltooid om andere opdrachten te accepteren. Veel opdrachten bieden daarom een --no-wait parameter zoals hier wordt weergegeven:

az group delete --name MyResourceGroup --no-wait

Wanneer u een resourcegroep verwijdert, worden ook alle resources verwijderd die bij deze groep horen. Het verwijderen van deze resources kan lang duren. Wanneer u de opdracht uitvoert met de --no-wait parameter, accepteert de console nieuwe opdrachten zonder de verwijdering te onderbreken.

Veel opdrachten bieden een wachtoptie, waarbij de console wordt onderbroken tot aan een bepaalde voorwaarde is voldaan. In het volgende voorbeeld wordt de opdracht az vm wait gebruikt ter ondersteuning van het parallel maken van onafhankelijke resources:

az vm create --resource-group VMResources --name virtual-machine-01 --image centos --no-wait
az vm create --resource-group VMResources --name virtual-machine-02 --image centos --no-wait

subscription=$(az account show --query "id" -o tsv)
vm1_id="/subscriptions/$subscription/resourceGroups/VMResources/providers/Microsoft.Compute/virtualMachines/virtual-machine-01"
vm2_id="/subscriptions/$subscription/resourceGroups/VMResources/providers/Microsoft.Compute/virtualMachines/virtual-machine-02"
az vm wait --created --ids $vm1_id $vm2_id

Nadat beide id's zijn gemaakt, kunt u de console opnieuw gebruiken.

Werken achter een proxy

Als u Azure CLI gebruikt via een proxyserver die gebruikmaakt van zelfondertekende certificaten, kan de Python-aanvraagbibliotheek die door de Azure CLI wordt gebruikt, de volgende fout veroorzaken: SSLError("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",) Als u deze fout wilt oplossen, stelt u de omgevingsvariabele REQUESTS_CA_BUNDLE in op het pad van het CA-bundelcertificaatbestand in PEM-indeling.

Besturingssysteem Standaardbundel van certificeringsinstantie
Windows 32-bits C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\Lib\site-packages\certifi\cacert.pem
Windows 64-bits C:\Program Files\Microsoft SDKs\Azure\CLI2\Lib\site-packages\certifi\cacert.pem
Ubuntu/Debian Linux /opt/az/lib/python<version>/site-packages/certifi/cacert.pem
CentOS/RHEL/SUSE Linux /usr/lib64/az/lib/python<version>/site-packages/certifi/cacert.pem
macOS /usr/local/Cellar/azure-cli/<cliversion>/libexec/lib/python<version>/site-packages/certifi/cacert.pem

Voeg het certificaat van de proxyserver toe aan het CA-bundelcertificaatbestand of kopieer de inhoud naar een ander certificaatbestand. Stel vervolgens in op REQUESTS_CA_BUNDLE de nieuwe bestandslocatie. Hier volgt een voorbeeld:

<Original cacert.pem>

-----BEGIN CERTIFICATE-----
<Your proxy's certificate here>
-----END CERTIFICATE-----

Voor sommige proxy's is verificatie vereist. De indeling van de HTTP_PROXY of HTTPS_PROXY omgevingsvariabelen moet de verificatie bevatten, zoals HTTPS_PROXY="https://username:password@proxy-server:port". Zie Proxy's configureren voor de Azure-bibliotheken voor meer informatie.

Gelijktijdige uitvoering

Als u Azure CLI-opdrachten gelijktijdig uitvoert op dezelfde computer, kunnen schrijfconflicten optreden als meerdere Azure CLI-opdrachten naar dezelfde MSAL-tokencache schrijven.

Als u potentiële fouten wilt voorkomen, kunt u de Azure CLI-configuratiemap voor elk script isoleren door de omgevingsvariabele AZURE_CONFIG_DIR voor elk script in te stellen op een afzonderlijke map. Azure CLI-opdrachten in dat script slaan de configuratie en tokencache op de geconfigureerde locatie op in plaats van de standaardmap ~/.azure .

export AZURE_CONFIG_DIR=/my/config/dir

Algemene updateparameters

Azure CLI-opdrachtgroepen bevatten vaak een updateopdracht. Azure Virtual Machines bevat bijvoorbeeld de opdracht az vm update. De meeste updateopdrachten bieden de drie algemene parameters: --add, --seten --remove.

De --set parameters --add nemen een lijst met door spaties gescheiden sleutel-waardeparen: key1=value1 key2=value2. Als u wilt zien welke eigenschappen u kunt bijwerken, gebruikt u een showopdracht, zoals az vm show.

az vm show --resource-group VMResources --name virtual-machine-01

U kunt de opdracht vereenvoudigen door een JSON-tekenreeks te gebruiken. Als u bijvoorbeeld een nieuwe gegevensschijf wilt koppelen aan een virtuele machine, gebruikt u de volgende waarde:

az vm update --resource-group VMResources --name virtual-machine-01 \
--add storageProfile.dataDisks "{\"createOption\": \"Attach\", \"managedDisk\":
   {\"id\":
   \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/yg/providers/Microsoft.Compute/disks/yg-disk\"},
   \"lun\": 1}"

Algemene resourceopdrachten (az resource)

Een service waarmee u wilt werken, heeft mogelijk geen Ondersteuning voor Azure CLI. U kunt de az-resourceopdrachten gebruiken om met deze resources te werken.

Als u alleen opdrachten voor maken of bijwerken nodig hebt, gebruikt u de az deployment group create. Zie Azure Quickstart-sjablonen voor werkvoorbeelden.

REST API-opdrachten (az rest)

Als algemene updateparameters en az resource niet aan uw behoeften voldoen, kunt u de opdracht az rest gebruiken om de REST API aan te roepen. Met de opdracht wordt automatisch geverifieerd met behulp van de aangemelde referentie en wordt de header Content-Type: application/jsoningesteld. Zie azure REST API-naslaginformatie voor meer informatie.

Dit voorbeeld werkt met de Microsoft Graph API. Als u omleidings-URI's voor een toepassing wilt bijwerken, roept u de REST API van de updatetoepassing aan, zoals in deze code:

# Get the application
az rest --method GET \
    --uri 'https://graph.microsoft.com/v1.0/applications/b4e4d2ab-e2cb-45d5-a31a-98eb3f364001'

# Update `redirectUris` for `web` property
az rest --method PATCH \
    --uri 'https://graph.microsoft.com/v1.0/applications/b4e4d2ab-e2cb-45d5-a31a-98eb3f364001' \
    --body '{"web":{"redirectUris":["https://myapp.com"]}}'

Wanneer u --uri-parameters voor aanvragen in de vorm van OData gebruikt, moet u ervoor zorgen dat u in verschillende omgevingen escapet$: in Bash, escape as \$ en in PowerShell, escape $$ as `$

Voorbeeldscripts

Hier volgen voorbeelden voor het gebruik van variabelen en het doorlopen van een lijst bij het werken met azure Virtual Machines. Voor uitgebreide voorbeelden van het gebruik van Bash-constructies met de Azure CLI, inclusief lussen, case-instructies, if.. Dan.. zie Meer informatie over het gebruik van Bash met de Azure CLI.

Gebruik deze scripts om id's op te slaan in variabelen:

ECHO OFF
SETLOCAL
FOR /F "tokens=* USEBACKQ" %%F IN (
   `az vm list --resource-group VMResources --show-details --query "[?powerState=='VM running'].id" --output tsv`
) DO (
    SET "vm_ids=%%F %vm_ids%"  :: construct the id list
)
az vm stop --ids %vm_ids% :: CLI stops all VMs in parallel

Gebruik deze scripts om een lijst te doorlopen:

ECHO OFF
SETLOCAL
FOR /F "tokens=* USEBACKQ" %%F IN (
    `az vm list --resource-group VMResources --show-details --query "[?powerState=='VM running'].id" --output tsv`
) DO (
    ECHO Stopping %%F
    az vm stop --ids %%F
)

Zie ook