Udostępnij za pomocą


Jak używać Azure CLI w skryptach Bash

Polecenia referencyjne interfejsu wiersza polecenia platformy Azure mogą być wykonywane w kilku językach skryptów. Jeśli dopiero zaczynasz korzystać z powłoki Bash, a także interfejsu wiersza polecenia platformy Azure, ten artykuł stanowi doskonałe miejsce na rozpoczęcie nauki. Zapoznaj się z tym artykułem, podobnie jak w przypadku samouczka, aby dowiedzieć się, jak łatwo używać interfejsu wiersza polecenia platformy Azure w języku skryptowym Bash.

W tym artykule dowiesz się, jak:

  • Wyniki zapytania jako słowniki lub tablice JSON
  • Formatuj dane wyjściowe w formacie JSON, tabeli lub TSV
  • Wykonywanie zapytań, filtrowanie i formatowanie pojedynczych i wielu wartości
  • Użyj składni if/exists/then i case
  • Używanie pętli
  • Używanie poleceń grep, sed, paste i bc
  • Tworzenie i używanie zmiennych powłoki i środowiskowych

Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto platformy Azure.

Uruchamianie Bash

Uruchom powłokę Bash przy użyciu usługi Azure Cloud Shell lub lokalnej instalacji CLI Azure. W tym artykule założono, że uruchamiasz Bash przy użyciu usługi Azure Cloud Shell lub uruchamiasz Azure CLI lokalnie w kontenerze Docker.

Wykonywanie zapytań względem wyników słownika

Polecenie, które zawsze zwraca tylko pojedynczy obiekt, zwraca słownik JSON. Słowniki są nieurządzanymi obiektami, do których uzyskuje się dostęp za pomocą kluczy. W tym artykule zaczniemy od wykonywania zapytań względem obiektu Account przy użyciu polecenia Account Show .

az account show
az account show --output json # JSON is the default format

Następujące dane wyjściowe słownika JSON zawierają niektóre pola pominięte w celu zwięzłości i usunięto informacje identyfikujące.

bash-5.1# az account show
{
  "environmentName": "AzureCloud",
  "isDefault": true,
  "managedByTenants": [],
  "name": "My test subscription",
  "state": "Enabled",
  "user": {
    "name": "user@contoso.com",
    "type": "user"
  }
}

Formatowanie danych wyjściowych jako YAML

Użyj argumentu --output yaml (lub -o yaml), aby sformatować dane wyjściowe w formacie yaml , format serializacji danych w postaci zwykłego tekstu. YAML jest zwykle łatwiejszy do odczytania niż JSON i łatwo go odwzorować na ten format. Niektóre aplikacje i polecenia interfejsu wiersza polecenia przyjmują kod YAML jako dane wejściowe konfiguracji zamiast JSON.

az account show --output yaml

Aby uzyskać więcej informacji na temat formatowania danych wyjściowych jako yaml, zobacz Format danych wyjściowych YAML.

Formatowanie danych wyjściowych jako tabeli

Użyj argumentu --output table (lub -o table), aby sformatować dane wyjściowe jako tabelę ASCII. Zagnieżdżone obiekty nie są uwzględniane w danych wyjściowych tabeli, ale nadal można je filtrować jako część zapytania.

az account show --output table

Aby uzyskać więcej informacji na temat formatowania danych wyjściowych jako tabeli, zobacz Format danych wyjściowych tabeli.

Wykonywanie zapytań i formatowanie pojedynczych wartości i wartości zagnieżdżonych

Poniższe zapytania pokazują wykonywanie zapytań dotyczących pojedynczych wartości, w tym wartości zagnieżdżonych w danych wyjściowych słownika JSON. Ostatnie zapytanie w tym zestawie demonstruje formatowanie danych wyjściowych przy użyciu argumentu -o tsv . Ten argument zwraca wyniki jako wartości oddzielone tabulatorami i nowymi liniami. Ta akcja jest przydatna do usuwania cudzysłowów w zwróconej wartości, co ułatwia wykorzystanie danych wyjściowych w innych poleceniach i narzędziach, które muszą przetworzyć tekst w jakiejś formie (jak pokazano w dalszej części tego artykułu).

az account show --query name # Querying a single value
az account show --query name -o tsv # Removes quotation marks from the output

az account show --query user.name # Querying a nested value
az account show --query user.name -o tsv # Removes quotation marks from the output

Wykonywanie zapytań i formatowanie właściwości z tablic

Poniższe zapytanie demonstruje pobieranie właściwości w tablicy JSON. Pobierz właściwości subskrypcji wyświetlane jako tabela subskrypcji.

az account list --query "[].{subscription_id:id, name:name, isDefault:isDefault}" -o table

To zapytanie zwraca wyniki podobne do następujących:

Subscription_id                       Name                                               IsDefault
------------------------------------  -------------------------------------------------  -----------
11111111-3ddc-45ce-8334-c7b28a9e1c3a  C & L Azure developer experience content projects  False
22222222-8f1c-409b-af1e-8e2e65d9b90a  DevCenter - Infrastructure - Dogfood               False
33333333-c080-42a7-8973-1aa853ab4df3  Babel                                              False

Wykonywanie zapytań i formatowanie wielu wartości, w tym wartości zagnieżdżonych

Aby uzyskać więcej niż jedną właściwość, umieść wyrażenia w nawiasach kwadratowych [ ] (lista wielokrotnego wyboru) jako listę rozdzielaną przecinkami. Poniższe zapytania przedstawiają wykonywanie zapytań dotyczących wielu wartości w danych wyjściowych słownika JSON przy użyciu wielu formatów wyjściowych.

az account show --query [name,id,user.name] # return multiple values
az account show --query [name,id,user.name] -o table # return multiple values as a table

Aby uzyskać więcej informacji na temat zwracania wielu wartości, zobacz Pobieranie wielu wartości.

Zmienianie nazw właściwości w zapytaniu

Poniższe zapytania przedstawiają użycie operatora { } (skrót wielowybierz) w celu pobrania słownika zamiast tablicy podczas wykonywania zapytań dotyczących wielu wartości. Demonstruje również zmianę nazw właściwości w wyniku zapytania.

az account show --query "{SubscriptionName: name, SubscriptionId: id, UserName: user.name}" # Rename the values returned
az account show --query "{SubscriptionName: name, SubscriptionId: id, UserName: user.name}" -o table # Rename the values returned in a table

Aby uzyskać więcej informacji na temat zmieniania nazw właściwości w zapytaniu, zobacz Zmienianie nazw właściwości w zapytaniu.

Wykonywanie zapytań dotyczących wartości logicznych

Zakłada się, że wartości typu logicznego są prawdziwe, więc składnia zapytania "[?isDefault]" polecenia az account list zwraca bieżącą subskrypcję domyślną. Aby uzyskać wartości fałszywe, należy użyć znaku ucieczki, takiego jak \.

Poniższe zapytania pokazują, jak wykonywać zapytania dotyczące wszystkich kont w ramach subskrypcji, potencjalnie zwracając tablicę JSON, jeśli istnieje wiele subskrypcji dla konkretnego konta, a następnie identyfikują, które konto posiada subskrypcję domyślną. Demonstruje również wykonywanie zapytań dotyczących kont, które nie są subskrypcją domyślną. Te zapytania opierają się na tym, czego nauczyliście się wcześniej, aby filtrować i formatować wyniki. Na koniec ostatnie zapytanie demonstruje przechowywanie wyników zapytania w zmiennej.

az account list
az account list --query "[?isDefault]" # Returns the default subscription
az account list --query "[?isDefault]" -o table # Returns the default subscription as a table
az account list --query "[?isDefault].[name,id]" # Returns the name and id of the default subscription
az account list --query "[?isDefault].[name,id]" -o table # Returns the name and id of the default subscription as a table
az account list --query "[?isDefault].{SubscriptionName: name, SubscriptionId: id}" -o table # Returns the name and id of the default subscription as a table with friendly names

az account list --query "[?isDefault == \`false\`]" # Returns all non-default subscriptions, if any
az account list --query "[?isDefault == \`false\`].name" -o table # Returns all non-default subscriptions, if any, as a table

az account list --query "[?isDefault].id" -o tsv # Returns the subscription id without quotation marks
subscriptionId="$(az account list --query "[?isDefault].id" -o tsv)" # Captures the subscription id as a variable.
echo $subscriptionId # Returns the contents of the variable.
az account list --query "[? contains(name, 'Test')].id" -o tsv # Returns the subscription id of a non-default subscription containing the substring 'Test'
subscriptionId="$(az account list --query "[? contains(name, 'Test')].id" -o tsv) # Captures the subscription id as a variable. 
az account set -s $subscriptionId # Sets the current active subscription

Tworzenie obiektów przy użyciu zmiennych i losowości

Ustawianie losowej wartości do użycia w kolejnych poleceniach

Ustawienie i użycie losowej wartości do użycia w zmiennych umożliwia wielokrotne uruchamianie skryptów bez konfliktów nazewnictwa. Konflikty nazewnictwa występują, ponieważ wartość musi być unikatowa w usłudze lub ponieważ usunięty obiekt nadal istnieje na platformie Azure do momentu zakończenia procesu usuwania.

$RANDOM jest funkcją w powłoce bash (a nie stałą), która zwraca losową znakowaną 16-bitową liczbę całkowitą (z zakresu od 0 do 32767). Polecenie let to wbudowane w Bashu polecenie umożliwiające obliczanie wyrażeń arytmetycznych. Użycie następującego polecenia powoduje utworzenie wystarczająco unikatowej wartości dla większości celów.

let "randomIdentifier=$RANDOM*$RANDOM"

Praca z spacjami i cudzysłowami

Spacje są używane do oddzielania poleceń, opcji i argumentów. Użyj cudzysłowów, aby poinformować powłokę Bash o ignorowaniu wszystkich znaków specjalnych, z których spacja jest jednym z nich. Gdy powłoka Bash widzi pierwszy znak cudzysłowia, ignoruje znaki specjalne do zamykającego znaku cudzysłowia. Jednak czasami chcesz, aby powłoka Bash analizowała niektóre znaki specjalne, takie jak znaki dolara, cudzysłowy odwrotne i ukośniki odwrotne. W tym scenariuszu użyj cudzysłowów podwójnych.

Następujące polecenia używają polecenia az group create , aby zilustrować użycie pojedynczych i podwójnych cudzysłowów. Te polecenia służą do obsługi spacji i oceniania znaków specjalnych podczas pracy ze zmiennymi i tworzenia obiektu.

resourceGroup='msdocs-learn-bash-$randomIdentifier'
echo $resourceGroup # The $ is ignored in the creation of the $resourceGroup variable
resourceGroup="msdocs-learn-bash-$randomIdentifier"
echo $resourceGroup # The $randomIdentifier is evaluated when defining the $resourceGroup variable
location="East US" # The space is ignored when defining the $location variable
echo The value of the location variable is $location # The value of the $location variable is evaluated
echo "The value of the location variable is $location" # The value of the $location variable is evaluated
echo "The value of the location variable is \$location" # The value of the $location variable is not evaluated
echo 'The value of the location variable is $location' # The value of the $location variable is not evaluated
az group create --name $resourceGroup --location $location # Notice that the space in the $location variable is not ignored and the command fails as it treats the value after the space as a new command 
az group create --name $resourceGroup --location "$location" # Notice that the space in the $location variable is ignored and the location argument accepts the entire string as the value 

W danych wyjściowych słownika JSON przejrzyj właściwości utworzonej grupy zasobów.

Używanie instrukcji If Then Else w celu określenia, czy zmienna ma wartość null

Aby ocenić ciągi, użyj polecenia != i , aby oszacować liczby, użyj polecenia -ne. Poniższa instrukcja If Then Else ocenia, czy ustawiono zmienną $resourceGroup. Jeśli tak, zwraca wartość zmiennej. Jeśli nie, ustawia zmienną.

if [ $resourceGroup != '' ]; then
   echo $resourceGroup
else
   resourceGroup="msdocs-learn-bash-$randomIdentifier"
fi

Używanie polecenia If Then do utworzenia lub usunięcia grupy zasobów

Poniższy skrypt tworzy nową grupę zasobów tylko wtedy, gdy jedna z określoną nazwą jeszcze nie istnieje.

if [ $(az group exists --name $resourceGroup) = false ]; then 
   az group create --name $resourceGroup --location "$location" 
else
   echo $resourceGroup
fi

Poniższy skrypt usuwa istniejącą nową grupę zasobów, jeśli jedna z określoną nazwą już istnieje. Możesz użyć argumentu --no-wait , aby zwrócić kontrolę bez oczekiwania na ukończenie polecenia. Jednak w tym artykule chcemy poczekać na usunięcie grupy zasobów przed kontynuowaniem. Aby uzyskać więcej informacji na temat operacji asynchronicznych, zobacz Porady dotyczące pomyślnego korzystania z interfejsu wiersza polecenia platformy Azure — operacje asynchroniczne. Przedstawiamy użycie argumentu --no-wait na końcu tego artykułu.

if [ $(az group exists --name $resourceGroup) = true ]; then 
   az group delete --name $resourceGroup -y # --no-wait
else
   echo The $resourceGroup resource group does not exist
fi

Używanie języka Grep do określenia, czy grupa zasobów istnieje, i utwórz grupę zasobów, jeśli nie

Następujące polecenie potokuje dane wyjściowe az group list polecenia do grep polecenia . Jeśli określona grupa zasobów nie istnieje, polecenie tworzy grupę zasobów przy użyciu wcześniej zdefiniowanych zmiennych.

az group list --output tsv | grep $resourceGroup -q || az group create --name $resourceGroup --location "$location"

Używanie instrukcji CASE, aby określić, czy grupa zasobów istnieje, i w razie nieistnienia, utworzyć grupę zasobów.

Poniższa instrukcja CASE tworzy nową grupę zasobów tylko wtedy, gdy jedna z określoną nazwą jeszcze nie istnieje. Jeśli jedna z określoną nazwą istnieje, instrukcja CASE powtarza, że grupa zasobów istnieje.

var=$(az group list --query "[? contains(name, '$resourceGroup')].name" --output tsv)
case $resourceGroup in
$var)
echo The $resourceGroup resource group already exists.;;
*)
az group create --name $resourceGroup --location "$location";;
esac

Używanie pętli for i przeszukiwanie tablic

W tej sekcji artykułu utworzymy konto magazynowe, a następnie użyjemy pętli for do tworzenia kontenerów i obiektów blob. Demonstrujemy również wykonywanie zapytań dotyczących tablic JSON i pracę ze zmiennymi środowiskowymi.

Utwórz konto magazynowe

Następujące polecenie używa polecenia az storage account create, aby utworzyć konto pamięci masowej, które wykorzystamy do tworzenia kontenerów pamięci masowej.

storageAccount="learnbash$randomIdentifier"
az storage account create --name $storageAccount --location "$location" --resource-group $resourceGroup --sku Standard_LRS --encryption-services blob

Pobierz klucze konta magazynowego

Następujące komendy używają polecenia az storage account keys list, aby zwrócić wartości kluczy dla konta magazynu. Następnie przechowujemy wartość klucza w zmiennej do wykorzystania przy tworzeniu kontenerów magazynowych.

az storage account keys list --resource-group $resourceGroup --account-name $storageAccount --query "[].value" -o tsv # returns both storage account key values

az storage account keys list --resource-group $resourceGroup --account-name $storageAccount --query "[0].value" -o tsv # returns a single storage account key value

accountKey=$(az storage account keys list --resource-group $resourceGroup --account-name $storageAccount --query "[0].value" -o tsv)

echo $accountKey

Tworzenie kontenera magazynowego

Zaczniemy od utworzenia pojedynczego kontenera magazynu za pomocą polecenia az storage container create, a następnie użyjemy az storage container list, aby wykonać zapytanie o nazwę utworzonego kontenera.

container="learningbash"
az storage container create --account-name $storageAccount --account-key $accountKey --name $container

az storage container list --account-name $storageAccount --account-key $accountKey --query [].name

Przekazywanie danych do kontenera

Poniższy skrypt tworzy trzy przykładowe pliki przy użyciu pętli for.

for i in `seq 1 3`; do
    echo $randomIdentifier > container_size_sample_file_$i.txt
done

Poniższy skrypt używa polecenia az storage blob upload-batch, aby przesłać obiekty blob do kontenera pamięci masowej.

az storage blob upload-batch \
    --pattern "container_size_sample_file_*.txt" \
    --source . \
    --destination $container \
    --account-key $accountKey \
    --account-name $storageAccount

Poniższy skrypt używa polecenia az storage blob list , aby wyświetlić listę obiektów blob w kontenerze.

az storage blob list \
    --container-name $container \
    --account-key $accountKey \
    --account-name $storageAccount \
    --query "[].name"

Poniższy skrypt wyświetla łączną liczbę bajtów w kontenerze przechowywania.

bytes=`az storage blob list \
    --container-name $container \
    --account-key $accountKey \
    --account-name $storageAccount \
    --query "[*].[properties.contentLength]" \
    --output tsv | paste -s -d+ | bc`

echo "Total bytes in container: $bytes"
echo $bytes

Tworzenie wielu kontenerów przy użyciu pętli

Następnie utworzymy wiele kontenerów przy użyciu pętli, demonstrując kilka sposobów, jak można zapisać pętlę.

for i in `seq 1 4`; do 
az storage container create --account-name $storageAccount --account-key $accountKey --name learnbash-$i
done

for value in {5..8}
for (( i=5; i<10; i++));
do
az storage container create --account-name $storageAccount --account-key $accountKey --name learnbash-$i
done

az storage container list --account-name $storageAccount --account-key $accountKey --query [].name

Używanie funkcji EXPORT do definiowania zmiennych środowiskowych

W poprzednich skryptach kontenera przechowywania określiliśmy nazwę konta i klucz konta w każdym poleceniu. Zamiast tego możesz przechowywać poświadczenia uwierzytelniania przy użyciu odpowiednich zmiennych środowiskowych: AZURE_STORAGE_ACCOUNT i AZURE_STORAGE_KEY. Aby wykonać tę akcję, użyj polecenia EXPORT.

export AZURE_STORAGE_ACCOUNT=$storageAccount
export AZURE_STORAGE_KEY=$accountKey
az storage container list # Uses the environment variables to display the list of containers.

Poniższy skrypt tworzy ciąg metadanych, a następnie używa polecenia az storage container metadata update , aby zaktualizować kontener za pomocą tego ciągu, ponownie przy użyciu zmiennych środowiskowych.

metadata="key=value pie=delicious" # Define metadata
az storage container metadata update \
    --name $container \
    --metadata $metadata # Update the metadata
az storage container metadata show \
    --name $containerName # Show the metadata

Następujące polecenie używa polecenia az storage container delete , aby usunąć jeden nazwany kontener, a następnie usunąć wiele kontenerów w pętli.

az storage container delete \
    --name $container

Pobierz listę kontenerów zawierających określony prefiks i zapisz wyniki w zmiennej.

containerPrefix="learnbash"
containerList=$(az storage container list \
    --query "[].name" \
    --prefix $containerPrefix \
    --output tsv)

Usuń listę kontenerów w pętli przy użyciu argumentu --prefix .

for row in $containerList
do
    tmpName=$(echo $row | sed -e 's/\r//g')
    az storage container delete \
    --name $tmpName 
done

Obsługa błędów

Aby zakończyć działanie skryptu natychmiast, jeśli polecenie zwróci stan niezerowy, uruchom następujące polecenie:

set -e

Aby uzyskać więcej informacji na temat ustawiania opcji powłoki i innych pomocy, uruchom następujące polecenia:

help set
help help

Uprzątnij zasoby

Po ukończeniu tego artykułu usuń grupę zasobów i wszystkie jej zasoby. Użyj argumentu --no-wait .

if [ $(az group exists --name $resourceGroup) = true ]; then 
   az group delete --name $resourceGroup -y  --no-wait
else
   echo The $resourceGroup resource group does not exist
fi

Zobacz także