Úvod do Azure CLI 2.0

Jak už na tomto blogu psal v úvodu do ovládání Azure přes PowerShell – GUI portálu se mi líbí a rád ho používám, ale jsou situace kdy je textový režim rychlejší a hlavně automatizovatelný skripty. PowerShell je dobře čitelný a mám moc rád jeho schopnosti parsování výstupu (například dáte celý příkaz do závorky, za ni dáte tečku a PowerShell bere výstup příkazu jako objekt, z kterého chcete vypsat atribut za tečkou). Tradiční Linux CLI je zase velmi úsporné a rychle se v něm dělá. Parsování je sice  textové, ale zažité. V dnešním článku si zkusíme CLI pro Azure.

Azure CLI 2.0

Většina moderních CLI je napsána v Python (o je třeba případ DC/OS CLI) nebo Go (například Docker CLI nebo kubectl v Kubernetes). Azure CLI 2.0 je v Pythonu, který je dobře dostupný všude (předchozí generace Azure CLI označovaná jako xplat-cli byla v Javascriptu, takže pro běh jste museli nainstalovat Node.JS a npm balíčky … to mě zas tolik neoslovilo).

Na MacOS, v Linuxu i Windows (nebo Ubuntu user space ve Windows 10) můžete po instalaci Python instalovat CLI přes pip:

pip install azure-cli

Ve Windows CMD vám ale nebude fungovat automatické doplňování. Já osobně dávám jednoznačně přednost Docker kontejneru, který má v sobě všechno potřebné a nemusím se s ničím trápit ani hledat kde co stáhnout nebo nainstalovat:

docker run -it azuresdk/azure-cli-python:latest bash

Co CLI nabízí?

$ az

     /\
    /  \    _____   _ _ __ ___
   / /\ \  |_  / | | | \'__/ _ \
  / ____ \  / /| |_| | | |  __/
 /_/    \_\/___|\__,_|_|  \___|


Welcome to the cool new Azure CLI!

Here are the base commands:

    account          : Manage subscriptions.
    acr              : Manage Azure Container Registries.
    acs              : Manage Azure Container Services.
    ad               : Synchronize on-premises directories and manage Azure Active Directory
                       resources.
    appservice       : Manage your App Service plans.
    batch            : Manage Azure Batch.
    billing          : Manage Azure Billing.
    cdn              : Manage Azure Content Delivery Networks (CDN).
    cloud            : Manage the registered Azure clouds.
    cognitiveservices: Manage Cognitive Services accounts in Azure Resource Manager.
    component        : Manage and update Azure CLI 2.0 components.
    configure        : Configure Azure CLI 2.0 or view your configuration. The command is
                       interactive, so just type `az configure` and respond to the prompts.
    consumption      : Manage Azure Consumption.
    cosmosdb         : Manage Azure Cosmos DB database accounts.
    disk             : Manage Azure Managed Disks.
    dla              : Commands to manage Data Lake Analytics accounts, jobs, and catalogs.
    dls              : Commands to manage Data Lake Store accounts, and filesystems.
    feature          : Manage resource provider features, such as previews.
    feedback         : Loving or hating the CLI?  Let us know!
    find             : Find Azure CLI commands based on a given query.
    functionapp      : Manage your function app.
    group            : Manage resource groups and template deployments.
    image            : Manage custom Virtual Machine Images.
    interactive      : Start the interactive experience.
    iot              : Connect, monitor, and control millions of IoT assets.
    keyvault         : Safeguard and maintain control of keys, secrets, and certificates.
    lab              : Commands to manage DevTest Labs.
    lock             : Manage Azure locks.
    login            : Log in to access Azure subscriptions.
    logout           : Log out to remove access to Azure subscriptions.
    managedapp       : Manage template solutions provided and maintained by the ISV using managedapp
                       and managedapp definitions.
    monitor          : Commands to manage Azure Monitor service.
    mysql            : Commands to manage Azure Database for MySQL servers.
    network          : Manages Azure Network resources.
    policy           : Manage resource policies.
    postgres         : Commands to manage Azure Database for PostgreSQL servers.
    provider         : Manage resource providers.
    redis            : Access to a secure, dedicated cache for your Azure applications.
    resource         : Manage Azure resources.
    role             : Use role assignments to manage access to your Azure resources.
    sf               : Manage and administer a Service Fabric cluster.
    snapshot         : Manage point-in-time copies of managed disks, native blobs, or other
                       snapshots.
    sql              : Manage Azure SQL Databases and Data Warehouses.
    storage          : Durable, highly available, and massively scalable cloud storage.
    tag              : Manage resource tags.
    vm               : Provision Linux or Windows virtual machines in seconds.
    vmss             : Create highly available, auto-scalable Linux or Windows virtual machines.
    webapp           : Manage web apps.

Nejlprve se nalogujeme. Pokud používáte Microsoft account nebo dvou faktorovou autentizaci nestačí zadat jméno a heslo přímo z CLI, bezpečnostní nároky jsou větší. Dostanete tedy odkaz a vygenerovaný kód. Musíte na web, zadat tento kód a přihlásit se v prohlížeči. CLI samo pozná, až to bude hotové a pak už budete zůstávat jen v řádce.

$ az login
To sign in, use a web browser to open the page https://aka.ms/devicelogin and enter the code CRCTHQJEQ to authenticate.

Vyzkoušejme si help a nakonec vypíšeme resource groupy. Výstup lze různě formátovat. Výchozí je JSON, my teď použijeme table a užitečné je také tsv (tabulátorem oddělené hodnoty – ideální pro parsování typu xargs).

$ az group --help

Group
    az group: Commands to manage resource groups.

Subgroups:
    deployment: Commands to execute or manage ARM deployments.

Commands:
    create    : Create a new resource group.
    delete    : Delete resource group.
    exists    : Checks whether resource group exists.
    export    : Captures a resource group as a template.
    list      : List resource groups, optionally filtered by a tag.
    show      : Get a resource group.
    update
    wait

$ az group list --help

Command
    az group list: List resource groups, optionally filtered by a tag.

Arguments
    --tag      : A single tag in 'key[=value]' format. Use '' to clear existing tags.

Global Arguments
    --debug    : Increase logging verbosity to show all debug logs.
    --help -h  : Show this help message and exit.
    --output -o: Output format.  Allowed values: json, jsonc, list, table, tsv.  Default: json.
    --query    : JMESPath query string. See http://jmespath.org/ for more information and examples.
    --verbose  : Increase logging verbosity. Use --debug for full debug logs.
$ az group list -o table
Name     Location        Status
-------  --------------  ---------
auto     westeurope      Succeeded
ftp      westeurope      Succeeded
funkce   southcentralus  Succeeded
mujnh    westeurope      Succeeded
mujteam  westeurope      Succeeded
search   westeurope      Succeeded
sql      westeurope      Succeeded
storage  westeurope      Succeeded
wp       westeurope      Succeeded

Tradiční parsovací hrátky

Snažil jsem se přijít na něco, kde bych mohl nasadit tradiční parsovací záležitosti v Linuxu a tohle je výsledek. Řekněme, že jsme zapomněli u zdrojů v Azure používat tagy a teď potřebujeme informace o každé resource group, která končí na písmeno „e“ 🙂

Pojďme na to. Prvním příkazem vypíšeme všechny skupiny a atributy oddělíme tabulátorem.

$ az group list -o tsv
/subscriptions/4fd63c38-a6be-4fb1-ac9e-ab1781af69ad/resourceGroups/auto westeurope      None    auto            None
/subscriptions/4fd63c38-a6be-4fb1-ac9e-ab1781af69ad/resourceGroups/ftp  westeurope      None    ftp             None
/subscriptions/4fd63c38-a6be-4fb1-ac9e-ab1781af69ad/resourceGroups/funkce       southcentralus  None    funkce         None
/subscriptions/4fd63c38-a6be-4fb1-ac9e-ab1781af69ad/resourceGroups/mujnh        westeurope      None    mujnh          None
/subscriptions/4fd63c38-a6be-4fb1-ac9e-ab1781af69ad/resourceGroups/mujteam      westeurope      None    mujteam        None
/subscriptions/4fd63c38-a6be-4fb1-ac9e-ab1781af69ad/resourceGroups/search       westeurope      None    search         None
/subscriptions/4fd63c38-a6be-4fb1-ac9e-ab1781af69ad/resourceGroups/sql  westeurope      None    sql             None
/subscriptions/4fd63c38-a6be-4fb1-ac9e-ab1781af69ad/resourceGroups/storage      westeurope      None    storage        None
/subscriptions/4fd63c38-a6be-4fb1-ac9e-ab1781af69ad/resourceGroups/wp   westeurope      None    wp              None

Čisté názvy vyparsujeme použitím awk.

$ az group list -o tsv | awk '{print $4}'
auto
ftp
funkce
mujnh
mujteam
search
sql
storage
wp

Použijeme grep s RegEx, kterým nejdeme jen ty, co končí na „e“.

$ az group list -o tsv | awk '{print $4}' | grep e$
funkce
storage

Krása. Teď jen nasadíme xargs a řádek po řádku budeme volat ad group show příkaz pro jednotlivé skupiny končící na „e“ a získáme tak o nich detaily.

$ az group list -o tsv | awk '{print $4}' | grep e$ | xargs -n 1 bash -c 'az group show --name $0'
{
  "id": "/subscriptions/4fd63c38-a6be-4fb1-ac9e-ab1781af69ad/resourceGroups/funkce",
  "location": "southcentralus",
  "managedBy": null,
  "name": "funkce",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null
}
{
  "id": "/subscriptions/4fd63c38-a6be-4fb1-ac9e-ab1781af69ad/resourceGroups/storage",
  "location": "westeurope",
  "managedBy": null,
  "name": "storage",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null
}

V mém případě jsou to resource group, ale podobným postupem byste třeba zastavili VM, jejichž název obsahuje nějaký výraz. Můžete filtrovat, řadit, vyhledávat a nad výsledky provádět nějaké operace. Stačí využít tradiční filozofii  Linuxu – jednoúčelové nástroje předávající si výstupy.

JMESPATH a pokročilé JSON dotazy

Azure CLI 2.0 podporuje velmi mocný query jazyk JMESPATH. Je pro mě úplně nový a určitě se k němu na tomto blogu vrátím podrobněji, protože vypadá velmi dobře. Takhle například můžeme vypsat názvy těch resource group, které jsou v regionu westeurope:

$ az group list --query "[?location == 'westeurope'].name"
[
  "auto",
  "ftp",
  "mujnh",
  "mujteam",
  "search",
  "sql",
  "storage",
  "wp"
]

Pokud se vám na mě nechce čekat, online zkoušečka je tady: http://jmespath.org/

Spustíme si VM a upravíme firewall

Vyzkoušejme si jednoduché vytvoření VM. Nejdřív si založíme resource group.

$ az group create --name azurecli --location westeurope
{
  "id": "/subscriptions/4fd63c38-a6be-4fb1-ac9e-ab1781af69ad/resourceGroups/azurecli",
  "location": "westeurope",
  "managedBy": null,
  "name": "azurecli",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null
}

Vytvořme si Debian VM.

$ az vm create --name mojevm --resource-group azurecli --image Debian --admin-username tomas  --public-ip-address-dns-name mojevmdnsjmeno --authentication-type password --admin-password Azure12345678 --size Standard_DS1
{
  "fqdn": "mojevmdnsjmeno.westeurope.cloudapp.azure.com",
  "id": "/subscriptions/4fd63c38-a6be-4fb1-ac9e-ab1781af69ad/resourceGroups/azurecli/providers/Microsoft.Compute/virtualMachines/mojevm",
  "macAddress": "00-0D-3A-24-6B-6E",
  "privateIpAddress": "10.0.0.4",
  "publicIpAddress": "52.166.9.117",
  "resourceGroup": "azurecli"
}

Podívejme se, jaké všechny zdroje v naší resource group máme.

$ az resource list --resource-group azurecli -o table
Name               ResourceGroup    Location    Type                                     Status
-----------------  ---------------  ----------  ---------------------------------------  --------
mojevm             azurecli         westeurope  Microsoft.Compute/virtualMachines
mojevmVMNic        azurecli         westeurope  Microsoft.Network/networkInterfaces
mojevmNSG          azurecli         westeurope  Microsoft.Network/networkSecurityGroups
mojevmPublicIP     azurecli         westeurope  Microsoft.Network/publicIPAddresses
mojevmVNET         azurecli         westeurope  Microsoft.Network/virtualNetworks
vhd14848333064786  azurecli         westeurope  Microsoft.Storage/storageAccounts

Můžeme si třeba vypsat informace o Network Security Group, ale protože ve výpisu je toho hodně, použiji JMESPath query, abych si našel jen připojené interface.

$ az network nsg show  --name mojevmNSG --resource-group azurecli --query "networkInterfaces[]"
[
  {
    "dnsSettings": null,
    "enableAcceleratedNetworking": null,
    "enableIpForwarding": null,
    "etag": null,
    "id": "/subscriptions/4fd63c38-a6be-4fb1-ac9e-ab1781af69ad/resourceGroups/azurecli/providers/Microsoft.Network/networkInterfaces/mojevmVMNic",
    "ipConfigurations": null,
    "location": null,
    "macAddress": null,
    "name": null,
    "networkSecurityGroup": null,
    "primary": null,
    "provisioningState": null,
    "resourceGroup": "azurecli",
    "resourceGuid": null,
    "tags": null,
    "type": null,
    "virtualMachine": null
  }
]

Vypišme si pravidla této NSG.

$ az network nsg rule list --nsg-name mojevmNSG --resource-group azurecli
[
  {
    "access": "Allow",
    "description": null,
    "destinationAddressPrefix": "*",
    "destinationPortRange": "22",
    "direction": "Inbound",
    "etag": "W/\"1dd03b2d-0910-488f-882c-c55c69661526\"",
    "id": "/subscriptions/4fd63c38-a6be-4fb1-ac9e-ab1781af69ad/resourceGroups/azurecli/providers/Microsoft.Network/networkSecurityGroups/mojevmNSG/securityRules/default-allow-ssh",
    "name": "default-allow-ssh",
    "priority": 1000,
    "protocol": "Tcp",
    "provisioningState": "Succeeded",
    "resourceGroup": "azurecli",
    "sourceAddressPrefix": "*",
    "sourcePortRange": "*"
  }
]

Přidejme pravidlo pro webový provoz.

$ az network nsg rule create --access Allow --destination-address-prefix "*" --destination-port-range 80 --direction InBound --source-address-prefix "*" --source-port-range "*" --protocol Tcp --priority 201 --name web --nsg-name mojevmNSG -
-resource-group azurecli
{
  "access": "Allow",
  "description": null,
  "destinationAddressPrefix": "*",
  "destinationPortRange": "80",
  "direction": "Inbound",
  "etag": "W/\"e0239a44-2d18-4cd0-a316-222b79c0467e\"",
  "id": "/subscriptions/4fd63c38-a6be-4fb1-ac9e-ab1781af69ad/resourceGroups/azurecli/providers/Microsoft.Network/networkSecurityGroups/mojevmNSG/securityRules/web",
  "name": "web",
  "priority": 201,
  "protocol": "Tcp",
  "provisioningState": "Succeeded",
  "resourceGroup": "azurecli",
  "sourceAddressPrefix": "*",
  "sourcePortRange": "*"
}

Jakmile nás to už nebude bavit, můžeme zase všechno smazat.

$ az group delete --name azurecli --no-wait

Interaktivní režim

Azure CLI 2.0 nabízí (myslím že aktuálně v Preview) interaktivní režim. Místo spouštění CLI z vašeho prostředí (bash, cmd apod.) můžete skočit do interaktivního režimu. Výhodou je jednak to, že můžete být rychlejší (nemusíte psát pořád „az“) ale hlavně tento režim vám napovídá jak příkazy pokračují, navrhuje na co a jak se zeptat. Skočíme do interaktivního režimu.

$ az interactive

Jakmile napíšete nějaké slovo, Azure radí jak dál.

Když slovo dokončíte, Azure CLI vám dole poradí co to vlastně dělá a navrhne další klíčová slova.

Někdy vám CLI napoví jaké typické příkazy se používají. Například tady v dolní části navrhuje jak omezit jaké VM se vypisují.

Výsledky jsou velmi přehledné můžete scrollovat.

Stisknutím F3 se můžete podívat na některé klávesové zkratky.

Cloud Shell

Klasický počítač s Windows, Linux nebo Mac vám snadno umožní nainstalovat a používat Azure CLI 2.0. Ale co když jste na cestách a používáte počítač, který není váš nebo nechcete či nemůžete CLI nainstalovat? Co když potřebujete příkazovou řádku i z mobilního zařízení? Právě pro tyto situace je k dispozici Cloud Shell. Přímo v Azure portálu kliknete na jeho ikonku a z HTML5 budete připojeni do systému s Azure CLI a dokonce už budete rovnou zalogovaní.

Pokud to děláte poprvé, musíte nejprve namapovat storage. Proč? Ať se připojíte odkudkoli zůstané vám přístup do vašeho domovského adresáře (proto ona perzistentní storage). Můžete tak mít k dispozici například vaše bash sktipty apod.

Pak už běžně CLI používáte.

Stejně tak můžete využít CLI z Azure aplikace ve vašem mobilu.

 

Takhle se tedy pracuje s Azure CLI 2.0. Vyzkoušejte si.