Megosztás a következőn keresztül:


Erőforrások nagy léptékű létrehozása az Azure CLI használatával

Azure-erőforrás-kezelőként gyakran több Azure-erőforrást kell létrehoznia új környezetek konfigurálásakor. Előfordulhat, hogy egy Azure-erőforrás-jóváhagyási folyamat is a legjobban működik, ha az Azure-erőforrások automatikusan jönnek létre egy szkriptből.

Ebben a cikkben a következőket fogja megtudni:

  • Több Azure-erőforrás létrehozása egy tagolt CSV-fájlból kapott paraméterekből.
  • Használja a HA.. THEN utasítások függő Azure-erőforrások létrehozásához.
  • Naplószkript állapota helyi TXT-fájlba.

Ezt a mintaszkriptet Bash- és PowerShell-környezetekben, valamint a PowerShell 7-ben is teszteltük az Azure Cloud Shellben. Keresse meg a CSV-t és a teljes szkriptet az Azure-samples/azure-cli-samples fájlban.

A környezet előkészítése

Kövesse az alábbi lépéseket a környezet előkészítéséhez a példaszkript futtatásához:

  • Nyissa meg a Bash- vagy PowerShell-környezetet az Azure Cloud Shellben. További információ: A Bash rövid útmutatója az Azure Cloud Shellben.

  • Töltse le és mentse a következő CSV-fájlt egy helyi könyvtárba. Cserélje le myExistingResourceGroupName a harmadik sorban egy tényleges erőforráscsoport-névre.

    resourceNo,location,createRG,exstingRgName,createVnet,vnetAddressPrefix,subnetAddressPrefixes,vmImage,publicIpSku,Adminuser
    1,eastus,TRUE,,TRUE,10.0.0.0/16,10.0.0.0/24,Ubuntu2204,standard,
    2,eastus2,TRUE,,FALSE,,,Debian11,standard,alex-smith
    3,southcentralus,FALSE,myExistingResourceGroupName,FALSE,,,Ubuntu2204,standard,jan-smith
    [empty line for Bash]
    

    Feljegyzés

    Ahhoz, hogy megfelelő Unix-szövegfájl lehessen, és a Bash felolvassa, a CSV-fájlnak új karakterre van szüksége az utolsó adatsor végén. Ez egy üres sort eredményez a fájl végén. Az üres sornak nem kell mondania [empty line] , mivel ez a szöveg csak az üres sor meglétének megjelenítéséhez van megadva. A PowerShell-környezetekben nincs ilyen új karakterkövetelmény.

  • Töltse fel a módosított CSV-fájlt az Azure Cloud Shell-blogtárfiókba. Ennek legegyszerűbb módja az Azure Cloud Shell főmenüjének Fájlok kezelése legördülő menüjének használata. További információ a Cloud Shell storage-ról: Fájlok megőrzése az Azure Cloud Shellben.

Szkriptek áttekintése

Ez a cikk egyetlen nagy szkriptet négy szakaszra bont, hogy minden lépés elmagyarázható legyen.

  • Változó beállítása
  • Adatellenőrzés engedélyezése
  • Hurok érvényesítése
  • Azure-erőforrások létrehozása

Két szkript is rendelkezésre áll: egy a Bashhez, a második pedig a PowerShellhez. Mindkét szkript ugyanazokat az Azure CLI-parancsokat használja. Ez a környezet vagy a terminálprofil, amely különbözik. Például a Bash és do...done if...then...fia . PowerShell-környezetben a megfelelő foreach és if (something is true)...{do this}a . Az Azure Cloud Shellben az Azure Cloud Shell főmenüjében a Switch to PowerShell vagy a Switch to Bash (Váltás Bash-re) gombbal válthat a környezetek között.

Ha szeretné, lépjen közvetlenül a jelen cikk által használt CSV- és szkriptfájlokhoz az Azure-samples/azure-cli-samples fájlban.

Beállított változók

Első lépésként hozza létre a szkripthez szükséges változókat. A következő három változónak tényleges értékekre van szüksége a környezethez:

  • subscriptionID: Ez az Azure-előfizetés azonosítója.
  • csvFileLocation: Ez a CSV bemeneti fájl helye és fájlneve.
  • logFileLocation: Ez az a hely és fájlnév , amelyet a szkript a naplófájl létrehozásához használ. Ezt a fájlt nem kell létrehoznia vagy feltöltenie.

Az előtaggal msdocs- rendelkező változók lecserélhetők a választott előtagra. Minden üres ("") változó a CSV bemeneti fájlból származó értékeket használja. Ezek az üres változók a szkript által igényelt helyőrzők.

# Variable block

# Replace these three variable values with actual values
subscriptionID=00000000-0000-0000-0000-00000000
csvFileLocation="myFilePath\myFileName.csv"
logFileLocation="myFilePath\myLogName.txt"

# Variable values that contain a prefix can be replaced with the prefix of your choice.
#   These prefixes have a random ID appended to them in the script.
# Variable values without a prefix will be overwritten by the contents of your CSV file.
location=""
createRG=""
newRgName="msdocs-rg-"
existingRgName=""

createVnet=""
vnetName="msdocs-vnet-"
subnetName="msdocs-subnet-"
vnetAddressPrefix=""
subnetAddressPrefixes=""

vmName="msdocs-vm-"
vmImage=""
publicIpSku=""
adminUser=""
adminPassword="msdocs-PW-@"

# Set your Azure subscription 
az account set --subscription $subscriptionID

CSV-fájlértékek ellenőrzése

Mielőtt elkezdené tesztelni a létrehozási szkriptet, győződjön meg arról, hogy a CSV-fájl megfelelően van formázva, és a változók megfelelő értékekhez lesznek rendelve. Ez a szkript IF.-t használ. AZ THEN utasítással egyszerre egyetlen forgatókönyvet/CSV-sort tekinthet meg.

# Verify CSV columns are being read correctly

# Take a look at the CSV contents
cat $csvFileLocation

# Validate select CSV row values
while IFS=, read -r resourceNo location createRG existingRgName createVnet vnetAddressPrefix subnetAddressPrefixes vmImage publicIpSku adminUser
do
  # Generate a random ID
  let "randomIdentifier=$RANDOM*$RANDOM"

  # Return the values for the first data row
  # Change the $resourceNo to check different scenarios in your CSV
  if [ "$resourceNo" = "1" ]; then
    echo "resourceNo = $resourceNo"
    echo "location = $location"
    echo "randomIdentifier = $randomIdentifier"
    echo ""
    
    echo "RESOURCE GROUP INFORMATION:"
    echo "createRG = $createRG"
    if [ "$createRG" = "TRUE" ]; then 
      echo "newRGName = $newRgName$randomIdentifier"
    else
      echo "exsitingRgName = $existingRgName"
    fi
    echo ""

    echo "VNET INFORMATION:"
    echo "createVnet = $createVnet"
    if [ "$createVnet" = "TRUE" ]; then 
      echo "vnetName = $vnetName$randomIdentifier"
      echo "subnetName = $subnetName$randomIdentifier"
      echo "vnetAddressPrefix = $vnetAddressPrefix"
      echo "subnetAddressPrefixes = $subnetAddressPrefixes"
    fi
    echo ""

    echo "VM INFORMATION:"
    echo "vmName = $vmName$randomIdentifier"
    echo "vmImage = $vmImage"
    echo "vmSku = $publicIpSku"
    if [ `expr length "$adminUser"` == "1" ]; then
      echo "SSH keys will be generated."
    else
      echo "vmAdminUser = $adminUser"
      echo "vmAdminPassword = $adminPassword$randomIdentifier"        
    fi
  fi  
# skip the header line
done < <(tail -n +2 $csvFileLocation)

A cikkben megadott CSV használatával az érvényesítési kimenet a következő: (A 00000001 véletlenszerű azonosító minden tesztnél eltérő lesz.)

resourceNo = 1
location = eastus

RESOURCE GROUP INFORMATION:
createRG = TRUE
newRGName = msdocs-rg-00000001

VNET INFORMATION:
createVnet = TRUE
vnetName = msdocs-vnet-00000001
subnetName = msdocs-subnet-00000001
vnetAddressPrefix = 10.0.0.0/16
subnetAddressPrefix = 10.0.0.0/24

VM INFORMATION:
vmName = msdocs-vm-00000001
vmImage = Ubuntu2204
vmSku = standard
SSH keys will be created

Szkriptlogika érvényesítése

Ha biztos a szkriptelési képességeiben, kihagyhatja ezt a lépést. Mivel azonban ez a szkript úgy lett kialakítva, hogy nagy léptékben hozzon létre Azure-erőforrásokat, a szkripttel vagy write-host utasításokkal echo való ciklusok időt és váratlan számlázható Azure-erőforrásokat takaríthatnak meg.

A CSV-fájlokat többféleképpen is át lehet iterálni a Bash használatával. Ez a példa IFS egy while loop.

# Validate script logic

# Create the log file
echo "SCRIPT LOGIC VALIDATION.">$logFileLocation

# Loop through each row in the CSV file
while IFS=, read -r resourceNo location createRG existingRgName createVnet vnetAddressPrefix subnetAddressPrefixes vmImage publicIpSku adminUser
do
  # Generate a random ID
  let "randomIdentifier=$RANDOM*$RANDOM"
    
  # Log resource number and random ID
  echo "resourceNo = $resourceNo">>$logFileLocation
  echo "randomIdentifier = $randomIdentifier">>$logFileLocation

  # Check if a new resource group should be created
  if [ "$createRG" == "TRUE" ]; then
    echo "Will create RG $newRgName$randomIdentifier.">>$logFileLocation
    existingRgName=$newRgName$randomIdentifier
  fi

  # Check if a new virtual network should be created, then create the VM
  if [ "$createVnet" == "TRUE" ]; then
    echo "Will create VNet $vnetName$randomIdentifier in RG $existingRgName.">>$logFileLocation
    echo "Will create VM $vmName$randomIdentifier in Vnet $vnetName$randomIdentifier in RG $existingRgName.">>$logFileLocation
  else
    echo "Will create VM $vmName$randomIdentifier in RG $existingRgName.">>$logFileLocation
  fi
# Skip the header line.
done < <(tail -n +2 $csvFileLocation)

# Clear the console and display the log file
Clear
cat $logFileLocation

A cikkben megadott CSV használatával az érvényesítési kimenet a következő: (A 00000001, 2, 3 véletlenszerű azonosítók minden tesztnél eltérőek lesznek, de az egyes resourceNo erőforrásoknak azonos véletlenszerű azonosítóval kell rendelkeznie.)

resourceNo = 1
createRG = TRUE
createVnet = TRUE
Will create RG msdocs-rg-00000001
Will create VNet msdocs-vnet-00000001 in RG msdocs-rg-00000001
Will create VM msdocs-vm-00000001 within Vnet msdocs-vnet-00000001 in RG msdocs-rg-00000001

resourceNo = 2
createRG = TRUE
createVnet = FALSE
Will create RG msdocs-rg-00000002
Will create VM msdocs-vm-00000002 without Vnet in RG msdocs-rg-00000002

resourceNo = 3
createRG = FALSE
createVnet = FALSE
Will create VM msdocs-vm-00000003 without Vnet in RG <myExistingResourceGroup>

Azure-erőforrások létrehozása

Létrehozta a változóblokkot, érvényesítette a CSV-értékeket, és elvégezte a tesztelést a következővel echo : vagy write-host. Hajtsa végre a szkript negyedik és utolsó részét a CSV bemeneti fájlban meghatározott Azure-erőforrások létrehozásához.

# Create Azure resources

# Create the log file
echo "CREATE AZURE RESOURCES.">$logFileLocation

# Loop through each CSV row
while IFS=, read -r resourceNo location createRG existingRgName createVnet vnetAddressPrefix subnetAddressPrefixes vmImage publicIpSku adminUser
do
  # Generate a random ID
  let "randomIdentifier=$RANDOM*$RANDOM"

  # Log resource number, random ID and display start time
  echo "resourceNo = $resourceNo">>$logFileLocation
  echo "randomIdentifier = $randomIdentifier">>$logFileLocation
  echo "Starting creation of resourceNo $resourceNo at $(date +"%Y-%m-%d %T")."

  # Check if a new resource group should be created
  if [ "$createRG" == "TRUE" ]; then
    echo "Creating RG $newRgName$randomIdentifier at $(date +"%Y-%m-%d %T").">>$logFileLocation
    az group create --location $location --name $newRgName$randomIdentifier >>$logFileLocation
    existingRgName=$newRgName$randomIdentifier
    echo "  RG $newRgName$randomIdentifier creation complete"
  fi

  # Check if a new virtual network should be created, then create the VM
  if [ "$createVnet" == "TRUE" ]; then
    echo "Creating VNet $vnetName$randomIdentifier in RG $existingRgName at $(date +"%Y-%m-%d %T").">>$logFileLocation
    az network vnet create \
        --name $vnetName$randomIdentifier \
        --resource-group $existingRgName \
        --address-prefix $vnetAddressPrefix \
        --subnet-name $subnetName$randomIdentifier \
        --subnet-prefixes $subnetAddressPrefixes >>$logFileLocation
    echo "  VNet $vnetName$randomIdentifier creation complete"
    
    echo "Creating VM $vmName$randomIdentifier in Vnet $vnetName$randomIdentifier in RG $existingRgName at $(date +"%Y-%m-%d %T").">>$logFileLocation
    az vm create \
        --resource-group $existingRgName \
        --name $vmName$randomIdentifier \
        --image $vmImage \
        --vnet-name $vnetName$randomIdentifier \
        --subnet $subnetName$randomIdentifier \
        --public-ip-sku $publicIpSku \
        --generate-ssh-keys >>$logFileLocation
    echo "  VM $vmName$randomIdentifier creation complete"
  else
    echo "Creating VM $vmName$randomIdentifier in RG $existingRgName at $(date +"%Y-%m-%d %T").">>$logFileLocation
    az vm create \
        --resource-group $existingRgName \
        --name $vmName$randomIdentifier \
        --image $vmImage \
        --public-ip-sku $publicIpSku \
        --admin-username $adminUser\
        --admin-password $adminPassword$randomIdentifier >>$logFileLocation
    echo "  VM $vmName$randomIdentifier creation complete"    
  fi
# skip the header line
done < <(tail -n +2 $csvFileLocation)

# Clear the console (optional) and display the log file
# clear
cat $logFileLocation

A konzol kimenetében hiányzik a CSV-fájl utolsó sora? Ezt az okozhatja, hogy az utolsó sor után hiányzik a sor folytatása karakter. Adjon hozzá egy üres sort a CSV-fájl végéhez a probléma megoldásához.

Konzolkimenet a naplófájl olvasása előtt :

Starting creation of resourceNo 1 at YYYY-MM-DD HH:MM:SS.
  RG msdocs-rg-00000001 creation complete
  VNet msdocs-vnet-00000001 creation complete
  VM msdocs-vm-00000001 creation complete

Starting creation of resourceNo 2 at YYYY-MM-DD HH:MM:SS.
  RG msdocs-rg-00000002 creation complete
  VM msdocs-vm-00000002 creation complete

Starting creation of resourceNo 3 at YYYY-MM-DD HH:MM:SS.
  VM msdocs-vm-00000003 creation complete

A naplófájl tartalmának a következőhöz hasonlóan kell kinéznie:

Starting creation of resourceNo 1 at YYYY-MM-DD HH:MM:SS.
  Creating RG msdocs-rg-00000001 at YYYY-MM-DD HH:MM:SS.
  {
  Resource group create output
  }
  Creating VNet msdocs-vnet-00000001 in RG msdocs-rg-000000001 at YYYY-MM-DD HH:MM:SS.
  {
  VNet create output
  }  
  Creating VM msdocs-vm-00000001 in RG msdocs-rg-00000001 at YYYY-MM-DD HH:MM:SS.
  {
  VM create output
  }

Starting creation of resourceNo 2 at YYYY-MM-DD HH:MM:SS.
  Creating RG msdocs-rg-00000002 at YYYY-MM-DD HH:MM:SS.
  {
  Resource group create output
  }
  Creating VM msdocs-vm-00000002 in RG msdocs-rg-00000002 at YYYY-MM-DD HH:MM:SS.
  {
  VM create output
  }

Starting creation of resourceNo 3 at YYYY-MM-DD HH:MM:SS.
  Creating msdocs-vm-00000003 creation complete
  {
  VM create output
  }

Hibaelhárítás

A Bashben az "Azure-erőforrások létrehozása" lépés az 1. lépés után leáll

Az Ubuntu 22.04.3 LTS-ben és a Debian 12-es verziójában (bookworm) a szkriptlogika ellenőrzése a várt módon működik, és mind a három erőforrás esetében visszaadja az eredményeket. Az Azure-erőforrások létrehozása azonban az első erőforrás után leáll. A probléma lehetséges oka, hogy a virtuális hálózat létrehozása az 1. lépésben néhány másodpercet vesz igénybe. Az Ubuntu és a Debian is a második erőforrásra lép anélkül, hogy megvárná a virtuális hálózat befejezését. Erről bővebben is olvashat a várakozási idő alatt, és nem várja meg, amíg a ciklus folyamatai befejeződnek , vagy megvárja, amíg a folyamat befejeződik a bash-szkriptben.

A Bash-szkript figyelmen kívül hagyja a HA utasítást

A Bash megkülönbözteti a kis- és nagybetűk megkülönböztetettségét. A szó true nem egyenlő TRUE. Az is greater than , nem >, és equals nem ===is .-gt Győződjön meg arról, hogy a CSV-oszlop értékeiben nincs tipográfiai hiba vagy kezdő/záró szóköz.

A változó értékek nem változnak minden ciklusban

Ezt gyakran a CSV-fájlban lévő további szóközök okozzák. A CSV-fájlok sorai így néznek ki: column1,column2,column3 vagy column1,,column3, de szokás szerint könnyen létrehozhat egy tesztfájlt, amely minden vessző, például column1, column2, column3egy szóköz után tartalmaz szóközt. Ha a CSV-ben van egy kezdő vagy záró szóköz, az oszlop értéke valójában <space>columnValue. A szkriptlogika if [ "$columnName" = "columnValue" ] "hamis" értéket ad vissza. Távolítsa el a CSV-sorok összes kezdő és záró szóközét a probléma megoldásához.

Érvénytelen CIDR-jelölés

ÉrvénytelenCIDRNotation hibaüzenet jelenik meg, ha helytelen címelőtagot ad át.az network vnet create Ez kihívást jelenthet, ha vizuálisan a címelőtag helyesen jelenik meg egy echo utasítás visszaadásakor. A CSV-ből beolvasott tényleges érték hibaelhárításához próbálja ki ezt a szkriptet:

while IFS=, read -r resourceNo location createRG existingRgName createVnet vnetAddressPrefix subnetAddressPrefixes vmImage publicIpSku adminUser
do
    echo "resourceNo = $resourceNo"

    if [ "$createVnet" == "TRUE" ]; then
      startTest="abc"
      endTest="xyz"
      echo $startTest$vnetAddressPrefix$endTest
    fi
done < <(tail -n +2 $setupFileLocation)

Ha az eredmények nem a várt abc10.0.0.0/24xyzmódon jelennek megxzy10.0.0.0, akkor előfordulhat, hogy a CSV-fájl rejtett karaktert vagy vesszőt rejt. Adjon hozzá egy ugyanazzal az előtagértékkel rendelkező tesztoszlopot, rendezze át a CSV-oszlopokat, és másolja/illessze be a CSV-tartalmat egy egyszerű Jegyzettömb-szerkesztőbe vagy abból. A cikk írásakor a CSV-oszlopok átrendezése végül kijavította a hibát.

Argumentumok várhatók vagy szükségesek

Ez a hiba akkor jelenik meg, ha nem adott meg egy kötelező paramétert, vagy egy tipográfiai hiba miatt az Azure CLI helytelenül elemzi a referenciaparancsot. Szkript használata esetén ez a hiba akkor is jelenik meg, ha az alábbiak közül az egyik igaz:

  • Hiányzik vagy helytelen sor folytatási karakter.
  • A vonal folytatási karakterének jobb oldalán vannak záró szóközök.
  • A változó neve egy speciális karaktert tartalmaz, például egy kötőjelet (-).

InvalidTemplateDeployment

Amikor olyan helyen próbál létrehozni egy Azure-erőforrást, amely nem ajánlja fel ezt az erőforrást, a következőhöz hasonló hibaüzenet jelenik meg: "A kapacitáskorlátozások esetében a következő termékváltozatok nem érhetők el: Standard_DS1_v2" jelenleg nem érhető el a "westus" helyen."

Íme a teljes hiba példa:

{"error":{"code":"InvalidTemplateDeployment","message":"The template deployment 'vm_deploy_<32 character ID>'
is not valid according to the validation procedure. The tracking id is '<36 character ID>'.
See inner errors for details.","details":[{"code":"SkuNotAvailable","message":"The requested VM size for resource
'Following SKUs have failed for Capacity Restrictions: Standard_DS1_v2' is currently not available
in location '<your specified location>'. Please try another size or deploy to a different location
or different zone. See https://aka.ms/azureskunotavailable for details."}]}}

A hiba kijavításához módosítsa a helyet, vagy válasszon egy másik paraméterértéket, amelyet a kívánt helyhez kínál.

Lásd még