Tips för att använda Azure CLI

Azure CLI är ett kommandoradsverktyg som gör att du kan konfigurera och hantera Azure-resurser från många gränssnittsmiljöer. När du har valt önskad gränssnittsmiljö och installerat Azure CLI kan du använda den här artikeln för att hitta användbara tips om hur du undviker vanliga fallgropar och använder Azure CLI.

Mer information om specifika Azure CLI-kommandon finns i Azure CLI-referenslistan.

Utdataformatering

Tre vanliga utdataformat används med Azure CLI-kommandon:

  1. Formatet json visar information som en JSON-sträng.

    • JSON ger dig den mest omfattande informationen.
    • Det här formatet är standard men du kan använda parametern --output för att ange ett annat alternativ.
    • Ändra det globala standardformatet till en av dina personliga inställningar med hjälp av az config , till exempel az config set core.output=table.
    • JSON-formatet bevarar de dubbla citattecknarna, vilket i allmänhet gör det olämpligt för skriptändamål.
  2. Formatet table visar utdata som en läsbar tabell. Du kan ange vilka värden som ska visas i tabellen och använda frågor för att anpassa utdata enligt följande:

    # command
    az vm show --resource-group myResourceGroup --name myVMname --query "{name: name, os:storageProfile.imageReference.offer}" --output table
    
    # output
    Name    Os
    ------  ------------
    myVMname   UbuntuServer
    
  3. Formatet tsv returnerar tab-avgränsade och newline-avgränsade värden utan extra formatering, nycklar eller andra symboler.

    • TSV-formatet är användbart för koncisa utdata och skriptändamål.
    • TSV tar bort dubbla citattecken som JSON-formatet bevarar.
    • Om du vill ange önskat format för TSV använder du parametern --query .
    export vm_ids=$(az vm list --show-details --resource-group myResourceGroup --query "[?powerState=='VM running'].id" --output tsv)
    az vm stop --ids $vm_ids
    

Mer information om dessa och andra format finns i Utdataformat för Azure CLI-kommandon.

Skicka värden till ett annat kommando

Om värdet används mer än en gång tilldelar du det till en variabel. Med variabler kan du använda värden mer än en gång eller skapa mer allmänna skript. I det här exemplet tilldelas ett ID som hittas av kommandot az vm list till en variabel.

# 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

Om värdet bara används en gång bör du överväga rördragning. (Piping skickar utdata från ett kommando som indata till ett andra kommando.)

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

Överväg följande alternativ för listor med flera värden:

  1. Om du behöver fler kontroller i resultatet använder du en "for"-loop:

    #!/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. Du kan också använda xargs och överväga att använda -P flaggan för att köra åtgärderna parallellt för bättre prestanda:

    az vm list --resource-group MyResourceGroup --show-details \
      --query "[?powerState=='VM stopped'].id" \
      --output tsv | xargs -I {} -P 10 az vm start --ids "{}"
    
  3. Slutligen har Azure CLI inbyggt stöd för att bearbeta kommandon med flera --ids parallellt för att uppnå samma effekt av xargs. @- används för att hämta värden från röret:

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

Mer information om hur du använder Bash-konstruktioner med Azure CLI, inklusive loopar, ärendeinstruktioner, if.. Sedan.. annars, och felhantering, se Lär dig att använda Bash med Azure CLI.

Använda citattecken i parametrar

När du arbetar med Azure CLI-kommandon bör du vara medveten om hur gränssnittet använder citattecken och escape-tecken. Om du stöder skript som används i olika gränssnitt kan du förstå hur de skiljer sig åt.

Kommentar

På grund av ett känt problem i PowerShell gäller vissa extra undantagsregler. Mer information finns i Citera problem med PowerShell.

Här följer några förslag för att undvika oväntade resultat:

  • Om du anger en parameter som innehåller blanksteg omsluter du den inom citattecken.

  • I Bash eller PowerShell tolkas både enkla och dubbla citattecken korrekt. I Windows-kommandotolken tolkas endast dubbla citattecken korrekt – enkla citattecken behandlas som en del av värdet.

  • Om kommandot bara ska köras på Bash (eller Zsh) använder du enkla citattecken för att bevara innehållet i JSON-strängen. Enkla citattecken krävs när du anger infogade JSON-värden. Den här JSON-filen är till exempel korrekt i Bash: '{"key": "value"}'.

  • Om kommandot körs i en Windows-kommandotolk måste du använda dubbla citattecken. Om värdet innehåller dubbla citattecken måste du undvika det. Motsvarigheten till ovanstående JSON-sträng är "{\"key\": \"value\"}"

  • Om värdet är en tom sträng i PowerShell använder du '""'.

  • Om värdet är en tom citatsträng ''i Bash eller PowerShell använder du "''".

  • Använd Azure CLI:s @<file> konvention för att läsa in från en fil och kringgå gränssnittets tolkningsmekanismer.

    az ad app create --display-name myName --native-app --required-resource-accesses @manifest.json
    
  • Bash utvärderar dubbla citattecken i exporterade variabler. Om det här beteendet inte är det du vill använda kan du undvika variabeln: "\$variable".

  • Vissa Azure CLI-kommandon tar en lista över blankstegsavgränsade värden.

    • Om nyckelnamnet eller värdet innehåller blanksteg omsluter du hela paret: "my key=my value". Till exempel:

      az web app config app settings set --resource-group myResourceGroup --name myWebAppName --settings "client id=id1" "my name=john"
      
    • När en CLI-parameter anger att den accepterar en blankstegsavgränsad lista förväntas ett av två format:

      1. Okvoterad, blankstegsavgränsad lista --parameterName firstValue secondValue
      2. Lista över blankstegsavgränsade --parameterName "firstValue" "secondValue"

      Det här exemplet är en sträng med ett blanksteg i. Det är inte en blankstegsavgränsad lista: --parameterName "firstValue secondValue"

  • Det finns specialtecken i PowerShell, till exempel på @. Om du vill köra Azure CLI i PowerShell lägger du till ` före specialtecknet för att undvika det. Du kan också omsluta värdet med enkla eller dubbla citattecken "/".

    # 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
    
  • När du använder parametern --query med ett kommando måste vissa tecken i JMESPath vara undantagna i gränssnittet.

    Dessa tre kommandon är korrekta och likvärdiga i Bash:

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

    Här är två exempel på felaktiga kommandon i 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'
    

    Fler exempeljämförelser mellan Bash, PowerShell och Cmd finns i Fråga azure CLI-kommandoutdata


  • Det bästa sättet att felsöka ett citatproblem är att köra kommandot med --debug flaggan. Den här flaggan visar de faktiska argument som tas emot av Azure CLI i Pythons syntax.

    # 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']
    

Använda bindestreckstecken i parametrar

Om en parameters värde börjar med ett bindestreck försöker Azure CLI parsa det som ett parameternamn. Om du vill parsa det som värde använder du = för att sammanfoga parameternamnet och värdet: --password="-VerySecret".

Asynkrona åtgärder

Åtgärder i Azure kan ta en märkbar tid. Till exempel är det inte omedelbart att konfigurera en virtuell dator i ett datacenter. Azure CLI väntar tills kommandot har slutförts för att acceptera andra kommandon. Många kommandon erbjuder därför en --no-wait parameter som visas här:

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

När du tar bort en resursgrupp tas även alla resurser som tillhör den bort. Det kan ta lång tid att ta bort dessa resurser. När du kör kommandot med parametern --no-wait accepterar konsolen nya kommandon utan att avbryta borttagningen.

Många kommandon erbjuder ett väntealternativ och pausar konsolen tills något villkor uppfylls. I följande exempel används kommandot az vm wait för att skapa oberoende resurser parallellt:

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

När båda ID:na har skapats kan du använda konsolen igen.

Arbeta bakom en proxy

Om du använder Azure CLI via en proxyserver som använder självsignerade certifikat kan python-begärandebiblioteket som används av Azure CLI orsaka följande fel: SSLError("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",). Du kan åtgärda det här felet genom att ange miljövariabeln REQUESTS_CA_BUNDLE till sökvägen till CA-paketcertifikatfilen i PEM-format.

OS Standardpaket för certifikatutfärdare
Windows 32-bitars C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\Lib\site-packages\certifi\cacert.pem
Windows 64-bitars 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

Lägg till proxyserverns certifikat i CA-paketcertifikatfilen eller kopiera innehållet till en annan certifikatfil. Ange REQUESTS_CA_BUNDLE sedan till den nya filplatsen. Här är ett exempel:

<Original cacert.pem>

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

Vissa proxyservrar kräver autentisering. Formatet för HTTP_PROXY miljövariablerna eller HTTPS_PROXY bör innehålla autentiseringen, till exempel HTTPS_PROXY="https://username:password@proxy-server:port". Mer information finns i Konfigurera proxyservrar för Azure-biblioteken.

Samtidig körning

Om du kör Azure CLI-kommandon samtidigt på samma dator kan skrivkonflikter inträffa om flera Azure CLI-kommandon skriver till samma MSAL-tokencache.

För att undvika potentiella fel kan du isolera Azure CLI-konfigurationsmappen för varje skript genom att ange miljövariabeln AZURE_CONFIG_DIR för varje skript till en separat katalog. Azure CLI-kommandon i skriptet sparar konfigurations- och tokencacheminnet på den konfigurerade platsen i stället för standardmappen ~/.azure .

export AZURE_CONFIG_DIR=/my/config/dir

Allmänna uppdateringsparametrar

Azure CLI-kommandogrupper har ofta ett uppdateringskommando. Azure Virtual Machines innehåller till exempel kommandot az vm update. De flesta uppdateringskommandon erbjuder de tre allmänna parametrarna: --add, --setoch --remove.

Parametrarna --set och --add tar en lista över blankstegsavgränsade nyckel/värde-par: key1=value1 key2=value2. Om du vill se vilka egenskaper du kan uppdatera använder du ett show-kommando, till exempel az vm show.

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

Om du vill förenkla kommandot bör du överväga att använda en JSON-sträng. Om du till exempel vill koppla en ny datadisk till en virtuell dator använder du följande värde:

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}"

Allmänna resurskommandon (az resource)

En tjänst som du vill arbeta med kanske inte har Stöd för Azure CLI. Du kan använda az resource-kommandona för att arbeta med dessa resurser.

Om du bara behöver skapa eller uppdatera kommandon använder du az deployment group create. Exempel på arbete finns i Azure-snabbstartsmallar.

REST API-kommandon (az rest)

Om allmänna uppdateringsparametrar och az-resursen inte uppfyller dina behov kan du använda kommandot az rest för att anropa REST-API:et. Kommandot autentiserar automatiskt med den inloggade autentiseringsuppgiften och anger rubriken Content-Type: application/json. Mer information finns i Referens för Azure REST API.

Det här exemplet fungerar med Microsoft Graph API. Om du vill uppdatera omdirigerings-URI:er för ett program anropar du REST-API:et för uppdateringsprogrammet , som i den här koden:

# 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"]}}'

När du använder --uri-parameters för begäranden i form av OData, se till att fly $ i olika miljöer: i Bash, escape $ as \$ och in PowerShell, escape $ as `$

Skriptexempel

Här är exempel på hur du använder variabler och loopar genom en lista när du arbetar med Azure Virtual Machines. För djupgående exempel på hur du använder Bash-konstruktioner med Azure CLI, inklusive loopar, ärendeinstruktioner, if.. Sedan.. annars, och felhantering, se Lär dig att använda Bash med Azure CLI.

Använd dessa skript för att spara ID:t till variabler:

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

Använd dessa skript för att loopa igenom en lista:

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
)

Se även