Tipy pro úspěšné používání Azure CLI

Azure CLI je nástroj příkazového řádku, který umožňuje konfigurovat a spravovat prostředky Azure z mnoha prostředí prostředí. Jakmile zvolíte upřednostňované prostředí a nainstalujete Azure CLI, v tomto článku se dozvíte užitečné tipy, jak se vyhnout běžným nástrahám a úspěšně používat Azure CLI.

Další informace o konkrétních příkazech Azure CLI najdete v seznamu referenčních informací k Azure CLI.

Formátování výstupu

Tři běžné formáty výstupu se používají s příkazy Azure CLI:

  1. Formát json zobrazuje informace jako řetězec JSON.

    • JSON poskytuje nejkomplexnější informace.
    • Tento formát je výchozí, ale pomocí parametru --output můžete zadat jinou možnost.
    • Změňte globální výchozí formát na jednu z vašich osobních preferencí pomocí příkazu az config , například az config set core.output=table.
    • Formát JSON zachovává dvojité uvozovky, což obecně zneužito pro skriptovací účely.
  2. Formát table představuje výstup jako čitelné tabulky. Můžete určit, které hodnoty se zobrazí v tabulce, a pomocí dotazů přizpůsobit výstup, jak je znázorněno tady:

    # command
    az vm show --resource-group myResourceGroup --name myVMname --query "{name: name, os:storageProfile.imageReference.offer}" --output table
    
    # output
    Name    Os
    ------  ------------
    myVMname   UbuntuServer
    
  3. Formát tsv vrátí hodnoty oddělené tabulátorem a novými spojnicemi bez dalšího formátování, klíčů nebo jiných symbolů.

    • Formát TSV je užitečný pro stručné účely výstupu a skriptování.
    • TSV odstraní dvojité uvozovky, které zachová formát JSON.
    • K určení požadovaného formátu pro TSV použijte --query parametr.
    export vm_ids=$(az vm list --show-details --resource-group myResourceGroup --query "[?powerState=='VM running'].id" --output tsv)
    az vm stop --ids $vm_ids
    

Další informace o těchto a dalších formátech najdete v tématu Výstupní formáty pro příkazy Azure CLI.

Předání hodnot jinému příkazu

Pokud se hodnota používá více než jednou, přiřaďte ji proměnné. Proměnné umožňují používat hodnoty více než jednou nebo vytvářet obecnější skripty. Tento příklad přiřadí ID nalezené příkazem az vm list k proměnné.

# 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

Pokud se hodnota použije jenom jednou, zvažte propojení. (Piping předává výstup jednoho příkazu jako vstup druhému příkazu.)

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

U seznamů s více hodnotami zvažte následující možnosti:

  1. Pokud potřebujete více ovládacích prvků ve výsledku, použijte smyčku "for":

    #!/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. Případně můžete použít xargs příznak a zvážit použití příznaku -P ke spuštění operací paralelně, aby se zlepšil výkon:

    az vm list --resource-group MyResourceGroup --show-details \
      --query "[?powerState=='VM stopped'].id" \
      --output tsv | xargs -I {} -P 10 az vm start --ids "{}"
    
  3. Azure CLI má navíc integrovanou podporu pro zpracování příkazů s několika --ids paralelně, aby se dosáhlo stejného efektu xargs. @- slouží k získání hodnot z kanálu:

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

Další informace o použití konstruktorů Bash s Azure CLI, včetně smyček, příkazů case, if.. Pak.. jinak a zpracování chyb najdete v tématu Informace o použití bashe s Azure CLI.

Použití uvozovek v parametrech

Při práci s příkazy Azure CLI mějte na paměti, jak vaše prostředí používá uvozovky a řídicí znaky. Pokud podporujete skripty používané v různých prostředích, zjistěte, jak se liší.

Poznámka:

Kvůli známému problému v PowerShellu platí některá další pravidla pro zapouzdření. Další informace najdete v tématu Problémy s uvozováním v PowerShellu.

Pokud se chcete vyhnout neočekáženým výsledkům, tady je několik návrhů:

  • Pokud zadáte parametr, který obsahuje prázdné znaky, zabalte ho do uvozovek.

  • V prostředí Bash nebo PowerShell jsou jednoduché i dvojité uvozovky interpretovány správně. V příkazovém řádku Windows se správně interpretují pouze dvojité uvozovky – jednoduché uvozovky se považují za součást hodnoty.

  • Pokud se váš příkaz spustí jenom na Bash (nebo Zsh), použijte jednoduché uvozovky, abyste zachovali obsah uvnitř řetězce JSON. Jednoduché uvozovky jsou nezbytné při zadávání vložených hodnot JSON. Tento kód JSON je například správný v prostředí Bash: '{"key": "value"}'.

  • Pokud příkaz běží na příkazovém řádku Windows, musíte použít dvojité uvozovky. Pokud hodnota obsahuje dvojité uvozovky, musíte utéct. Ekvivalentem výše uvedeného řetězce JSON je "{\"key\": \"value\"}"

  • Pokud je hodnota v PowerShellu prázdný řetězec, použijte '""'.

  • Pokud je hodnota v Bashu nebo PowerShellu prázdným řetězcem ''uvozovek , použijte "''".

  • Použijte konvenci Azure CLI @<file> k načtení ze souboru a obejití mechanismů interpretace prostředí.

    az ad app create --display-name myName --native-app --required-resource-accesses @manifest.json
    
  • Bash vyhodnocuje dvojité uvozovky v exportovaných proměnných. Pokud toto chování není to, co chcete, uchytejte proměnnou: "\$variable".

  • Některé příkazy Azure CLI přebírají seznam hodnot oddělených mezerami.

    • Pokud název klíče nebo hodnota obsahuje mezery, zabalte celý pár: "my key=my value". Příklad:

      az web app config app settings set --resource-group myResourceGroup --name myWebAppName --settings "client id=id1" "my name=john"
      
    • Když parametr rozhraní příkazového řádku uvádí, že přijímá seznam oddělený mezerami, očekává se jeden ze dvou formátů:

      1. Seznam oddělený mezerami --parameterName firstValue secondValue
      2. Seznam oddělený mezerami --parameterName "firstValue" "secondValue"

      Tento příklad je řetězec s mezerou. Nejedná se o seznam oddělený mezerami: --parameterName "firstValue secondValue"

  • Existují speciální znaky PowerShellu, například na adrese @. Pokud chcete spustit Azure CLI v PowerShellu, přidejte ` ho před speciální znak, který ho unikne. Hodnotu můžete uzavřít také do jednoduchých nebo dvojitých uvozovek "/".

    # 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
    
  • Pokud použijete --query parametr s příkazem, některé znaky JMESPath musí být v prostředí uchycené.

    Tyto tři příkazy jsou v Bash správné a ekvivalentní:

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

    Tady jsou dva příklady nesprávných příkazů v 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'
    

    Další příklady porovnání mezi Bashem, PowerShellem a Cmd najdete v tématu Dotazování výstupu příkazu Azure CLI.


  • Nejlepším způsobem, jak vyřešit problém s uvozováním, je spustit příkaz s příznakem --debug . Tento příznak odhalí skutečné argumenty přijaté rozhraním příkazového řádku Azure v syntaxi Pythonu.

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

Použití znaků spojovníku v parametrech

Pokud hodnota parametru začíná pomlčkou, Azure CLI se ji pokusí analyzovat jako název parametru. Chcete-li jej analyzovat jako hodnotu, použijte = ke zřetězení názvu a hodnoty parametru: --password="-VerySecret".

Asynchronních operace

Operace v Azure můžou trvat značné množství času. Například konfigurace virtuálního počítače v datacentru není okamžitá. Azure CLI čeká, až se příkaz dokončí, aby přijímal další příkazy. Mnoho příkazů proto nabízí --no-wait parametr, jak je znázorněno tady:

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

Když odstraníte skupinu prostředků, odeberou se také všechny prostředky, které do ní patří. Odebrání těchto prostředků může trvat dlouho. Při spuštění příkazu s parametrem --no-wait konzola přijímá nové příkazy bez přerušení odebrání.

Mnoho příkazů nabízí možnost čekání, která konzolu pozastaví, dokud nebude splněna určitá podmínka. Následující příklad používá příkaz az vm wait k podpoře paralelního vytváření nezávislých prostředků:

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

Po vytvoření obou ID můžete konzolu znovu použít.

Práce za proxy serverem

Pokud používáte Azure CLI přes proxy server, který používá certifikáty podepsané svým držitelem, může knihovna požadavků Pythonu používaná Azure CLI způsobit následující chybu: SSLError("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",) Pokud chcete tuto chybu vyřešit, nastavte proměnnou REQUESTS_CA_BUNDLE prostředí na cestu k souboru certifikátu certifikační autority ve formátu PEM.

Operační systém Výchozí sada certifikační autority
Windows 32bitová verze C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\Lib\site-packages\certifi\cacert.pem
Windows 64bitová verze 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

Připojte certifikát proxy serveru k souboru certifikátu certifikační autority nebo zkopírujte obsah do jiného souboru certifikátu. Pak nastavte REQUESTS_CA_BUNDLE nové umístění souboru. Tady je příklad:

<Original cacert.pem>

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

Některé proxy servery vyžadují ověření. Formát proměnných HTTP_PROXY prostředí HTTPS_PROXY by měl zahrnovat ověřování, například HTTPS_PROXY="https://username:password@proxy-server:port". Podrobnosti najdete v tématu Konfigurace proxy pro knihovny Azure.

Souběžné spuštění

Pokud spouštíte příkazy Azure CLI souběžně na stejném počítači, může dojít ke konfliktům zápisu, pokud do stejné mezipaměti tokenů MSAL zapisuje více příkazů Azure CLI.

Abyste se vyhnuli potenciálním selháním, můžete izolovat konfigurační složku Azure CLI pro každý skript nastavením proměnné AZURE_CONFIG_DIR prostředí pro každý skript do samostatného adresáře. Příkazy Azure CLI v daném skriptu ukládají konfiguraci a mezipaměť tokenů do nakonfigurovaného umístění místo výchozí ~/.azure složky.

export AZURE_CONFIG_DIR=/my/config/dir

Obecné parametry aktualizace

Skupiny příkazů Azure CLI často obsahují příkaz update. Azure Virtual Machines například zahrnuje příkaz az vm update. Většina aktualizačních příkazů nabízí tři obecné parametry: --add, --seta --remove.

--add Parametry --set mají seznam dvojic klíč-hodnota oddělených mezerami: key1=value1 key2=value2. Pokud chcete zjistit, jaké vlastnosti můžete aktualizovat, použijte příkaz show, například az vm show.

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

Pokud chcete tento příkaz zjednodušit, zvažte použití řetězce JSON. Pokud například chcete k virtuálnímu počítači připojit nový datový disk, použijte následující hodnotu:

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

Obecné příkazy prostředků (az resource)

Služba, se kterou chcete pracovat, nemusí mít podporu Azure CLI. K práci s těmito prostředky můžete použít příkazy az resource .

Pokud potřebujete jenom příkazy pro vytvoření nebo aktualizaci, použijte příkaz az deployment group create. Pracovní příklady najdete v tématu Šablony pro rychlý start Azure.

Příkazy rozhraní REST API (az rest)

Pokud obecné parametry aktualizace a az resource nevyhovují vašim potřebám, můžete k volání rozhraní REST API použít příkaz az rest . Příkaz se automaticky ověří pomocí přihlášených přihlašovacích údajů a nastaví hlavičku Content-Type: application/json. Další informace najdete v referenčních informacích k rozhraní Azure REST API.

Tento příklad funguje s rozhraním Microsoft Graph API. Pokud chcete aktualizovat identifikátory URI přesměrování pro aplikaci, zavolejte rozhraní REST API pro aktualizaci aplikace , jak je znázorněno v tomto kódu:

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

Při použití --uri-parameters pro požadavky ve formě OData nezapomeňte utéct $ v různých prostředích: v Bash, escape $ as \$ a in PowerShell, escape $ as `$

Příklady skriptu

Tady jsou příklady použití proměnných a procházení seznamu při práci se službou Azure Virtual Machines. Podrobné příklady použití konstruktorů Bash s Azure CLI, včetně smyček, příkazů case, if. Pak.. jinak a zpracování chyb najdete v tématu Informace o použití bashe s Azure CLI.

Pomocí těchto skriptů uložte ID do proměnných:

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

Pomocí těchto skriptů můžete procházet seznam:

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
)

Viz také