Bagikan melalui


Cara membuat sumber daya dalam skala besar menggunakan Azure CLI

Sebagai manajer sumber daya Azure, Anda sering harus membuat beberapa sumber daya Azure saat mengonfigurasi lingkungan baru. Anda mungkin juga memiliki proses persetujuan sumber daya Azure yang berfungsi paling baik saat sumber daya Azure dibuat secara otomatis dari skrip.

Dalam artikel ini Anda akan mempelajari hal berikut:

  • Buat beberapa sumber daya Azure dari parameter yang diterima dari file CSV yang dibatasi.
  • Gunakan IF.. Pernyataan THEN untuk membuat sumber daya Azure dependen.
  • Mencatat kemajuan skrip ke file TXT lokal.

Contoh skrip ini telah diuji di Azure Cloud Shell di lingkungan Bash dan PowerShell, dan PowerShell 7. Temukan CSV dan skrip lengkap di Azure-samples/azure-cli-samples.

Menyiapkan lingkungan Anda

Ikuti langkah-langkah ini untuk menyiapkan lingkungan Anda untuk menjalankan contoh skrip:

  • Buka lingkungan Bash atau PowerShell di Azure Cloud Shell. Untuk informasi selengkapnya, lihat Mulai Cepat untuk Bash di Azure Cloud Shell.

  • Unduh dan simpan ke direktori lokal file CSV berikut. Ganti myExistingResourceGroupName sebaris tiga dengan nama grup sumber daya aktual.

    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]
    

    Catatan

    Untuk menjadi file teks Unix yang tepat dan dibaca oleh Bash, file CSV memerlukan karakter baris baru di akhir baris data terakhir. Ini menghasilkan baris kosong di akhir file. Baris kosong Anda tidak perlu mengatakan [empty line] karena teks ini hanya disediakan untuk menunjukkan kepada Anda bahwa ada baris kosong. Lingkungan PowerShell tidak memiliki persyaratan karakter baris baru ini.

  • Unggah file CSV yang dimodifikasi ke akun penyimpanan blog Azure Cloud Shell Anda. Cara term mudah untuk melakukan ini adalah dengan menggunakan menu drop-down Kelola file di menu utama Azure Cloud Shell. Untuk informasi selengkapnya tentang penyimpanan Cloud Shell, lihat Menyimpan file di Azure Cloud Shell.

Ringkasan skrip

Artikel ini memecah satu skrip besar menjadi empat bagian sehingga setiap langkah dapat dijelaskan.

  • Penyiapan variabel
  • Validasi Data
  • Validasi perulangan
  • Pembuatan sumber daya Azure

Ada juga dua skrip yang disediakan: satu untuk Bash dan yang kedua untuk PowerShell. Kedua skrip menggunakan perintah Azure CLI yang sama. Ini adalah lingkungan, atau profil terminal, yang berbeda. Misalnya, Bash menggunakan do...done dan if...then...fi. Di lingkungan PowerShell, Anda menggunakan yang setara foreach dan if (something is true)...{do this}. Di Azure Cloud Shell Anda dapat beralih antar lingkungan dengan menggunakan tombol Beralih ke PowerShell atau Beralih ke Bash di menu utama Azure Cloud Shell.

Jika mau, buka langsung file CSV dan skrip yang digunakan oleh artikel ini di Azure-samples/azure-cli-samples.

Mengatur variabel

Mulailah dengan membuat variabel yang diperlukan untuk skrip. Tiga variabel berikut membutuhkan nilai aktual untuk lingkungan Anda:

  • subscriptionID: Ini adalah ID langganan Azure Anda.
  • csvFileLocation: Ini adalah lokasi dan nama file file file input CSV Anda.
  • logFileLocation: Ini adalah lokasi dan nama file yang akan digunakan skrip untuk membuat file log. Anda tidak perlu membuat atau mengunggah file ini.

Variabel dengan msdocs- awalan dapat diganti dengan awalan pilihan Anda. Semua variabel kosong ("") menggunakan nilai dari file input CSV. Variabel kosong ini adalah tempat penampung yang diperlukan oleh skrip.

# 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

Memvalidasi nilai file CSV

Sebelum Anda mulai menguji skrip buat, pastikan file CSV Anda diformat dengan benar dan variabel akan diberi nilai yang benar. Skrip ini menggunakan IF.. Pernyataan THEN sehingga Anda dapat melihat satu skenario/baris CSV pada satu waktu.

# 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)

Menggunakan CSV yang disediakan dalam artikel ini, output validasi adalah sebagai berikut: ( 00000001 ID acak akan berbeda untuk setiap pengujian.)

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

Memvalidasi logika skrip

Jika Anda yakin dengan kemampuan pembuatan skrip, Anda dapat melewati langkah ini. Namun, karena skrip ini dirancang untuk membuat sumber daya Azure dalam skala besar, perulangan melalui skrip dengan echo atau write-host pernyataan dapat menghemat waktu dan sumber daya Azure yang tidak terduga yang dapat ditagih.

Ada beberapa cara untuk melakukan iterasi melalui file CSV menggunakan Bash. Contoh ini menggunakan IFS dengan 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

Menggunakan CSV yang disediakan dalam artikel ini, output validasi adalah sebagai berikut: ( 00000001, 2, 3 ID acak akan berbeda untuk setiap pengujian, tetapi setiap sumber daya di bawah masing-masing resourceNo harus berbagi ID acak yang sama.)

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>

Membuat sumber daya Azure

Anda sekarang telah membuat blok variabel Anda, memvalidasi nilai CSV Anda, dan menyelesaikan uji coba dengan echo atau write-host. Jalankan bagian keempat dan terakhir skrip untuk membuat sumber daya Azure seperti yang didefinisikan dalam file input CSV Anda.

# 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

Di output konsol, apakah Anda kehilangan baris terakhir dalam file CSV Anda? Ini dapat disebabkan oleh karakter kelanjutan baris yang hilang setelah baris terakhir. Tambahkan baris kosong di akhir file CSV Anda untuk memperbaiki masalah.

Output konsol sebelum file log dibaca:

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

Konten file log Anda akan terlihat mirip dengan ini:

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
  }

Pemecahan Masalah

Di Bash, langkah "Buat sumber daya Azure" berhenti setelah langkah 1

Dalam Ubuntu 22.04.3 LTS dan Debian versi 12 (bookworm) logika Validasi skrip berfungsi seperti yang diharapkan mengembalikan hasil untuk ketiga sumber daya. Namun, Buat sumber daya Azure berhenti setelah sumber daya pertama. Alasan yang mungkin untuk masalah ini adalah pembuatan VNet di langkah #1 membutuhkan waktu beberapa detik. Baik Ubuntu maupun Debian melanjutkan ke sumber daya kedua tanpa menunggu penyelesaian VNet. Anda dapat membaca lebih lanjut tentang ini dalam tunggu tidak menunggu proses di saat perulangan selesai atau Menunggu proses apa pun selesai dalam skrip bash.

Skrip Bash mengabaikan pernyataan IF

Bash peka huruf besar/kecil. Kata true tidak sama dengan TRUE. Juga greater than adalah -gt, bukan >, dan equals adalah ==, bukan =. Pastikan Anda tidak memiliki kesalahan tipografi, atau spasi di depan/belakang dalam nilai kolom CSV Anda.

Nilai variabel tidak berubah dengan setiap perulangan

Ini sering disebabkan oleh spasi tambahan dalam file CSV. Baris dalam file CSV akan terlihat seperti ini: column1,column2,column3 atau column1,,column3, tetapi dengan kebiasaan, mudah untuk membuat file pengujian yang berisi ruang setelah setiap koma seperti column1, column2, column3. Ketika Anda memiliki ruang di depan atau di belakang di CSV Anda, nilai kolom sebenarnya <space>columnValueadalah . Logika if [ "$columnName" = "columnValue" ] skrip mengembalikan "false". Hapus semua spasi di awal dan belakang di baris CSV Anda untuk memperbaiki masalah.

Notasi CIDR tidak valid

Anda menerima kesalahan InvalidCIDRNotation ketika Anda meneruskan awalan alamat yang salah ke az network vnet create. Ini bisa menantang ketika secara visual, awalan alamat terlihat benar ketika dikembalikan dalam pernyataan echo . Untuk memecahkan masalah nilai aktual yang dibaca dari CSV, coba skrip ini:

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)

Jika hasil Anda terlihat seperti xzy10.0.0.0 dan bukan yang diharapkan abc10.0.0.0/24xyz, mungkin ada karakter tersembunyi atau koma tambahan yang mengintai dalam file CSV Anda. Tambahkan kolom pengujian dengan nilai awalan yang sama, susun ulang kolom CSV Anda, dan salin/tempel konten CSV Anda masuk/keluar dari editor Notepad sederhana. Dalam menulis artikel ini, pengaturan ulang kolom CSV akhirnya memperbaiki kesalahan.

Argumen diharapkan atau diperlukan

Anda menerima kesalahan ini ketika Anda belum memberikan parameter yang diperlukan atau ada kesalahan tipografis yang menyebabkan Azure CLI salah mengurai perintah referensi. Saat bekerja dengan skrip, Anda juga menerima kesalahan ini ketika salah satu dari beberapa hal berikut ini benar:

  • Ada karakter kelanjutan baris yang hilang atau salah.
  • Ada spasi berikutnya di sisi kanan karakter kelanjutan garis.
  • Nama variabel Anda berisi karakter khusus, seperti garis putus-putus (-).

InvalidTemplateDeployment

Saat Anda mencoba membuat sumber daya Azure di lokasi yang tidak menawarkan sumber daya tersebut, Anda menerima kesalahan yang mirip dengan yang berikut ini: "SKU berikut gagal untuk Pembatasan Kapasitas: Standard_DS1_v2' saat ini tidak tersedia di lokasi 'westus'."

Berikut adalah contoh kesalahan lengkapnya:

{"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."}]}}

Untuk memperbaiki kesalahan, ubah lokasi atau pilih nilai parameter berbeda yang ditawarkan untuk lokasi yang Anda inginkan.

Lihat juga