איך ליצור Custom Image ב-Azure

שלום לכולם,

במאמר קצר זה אני הולך להראות לכם איך ליצור Golden Image מותאם אישית ואיך “להפיץ” באופן פשוט כולל הכנסה לדומיין בעזרת סקריפט.
למי שלא מכיר -Golden Image מאפשר ליצור Template (תבנית) של מערכת הפעלה עם כל התוכנות, הגדרות שביצעתם ולהפיץ אותה לשרתים חדשים.
פלטפורמת Azure מאפשרת  ליצור Golden Image כתבנית בסיס בהתאם לתצורת העבודה בארגון לטובת יצירת מכונות וירטואליות חדשות במקום מתבנית נקייה של Windows/Linux ב-Azure Marketplace.
חלק מיתרונות ביצירת Image מותאם אישית:

  1. חוסך זמן בהפצת שרת חדש.
  2. מבטיח עקביות ומונע שינוי תצורה חוזרים.
  3. מקצר את תהליכים העדכונים.
  4. מונע סיכונים והבדלי גרסאות.

איך מייצרים Image מותאם אישית

  • הכנת שרת ל-Sysprep.
  • יצירת Capture מ-Azure Portal.
  • יצירת מחשב חדש מ-Custom Image והכנסה לדומיין בעזרת PowerShell.

שלב I – הכנת שרת ל-Sysprep

  1. הקמת שרת עם מערכת הפעלה רצויה וביצוע כל התוכנות וההגדרות בהתאם למדיניות ותצורת העבודה בארגון.
  2. הרצת Sysprep לאחר סיום כל ההגדרות לסגירת ה-Template.
    1. יש לגשת לנתיב הבא ולהריץ את התוכנה Sysprep.exe%windir%\system32\sysprep
    2. בחלון שנפתח יש לסמן Generalize ולבחור ב-Shutdown תחת Shutdown Options. Sysprep

שלב II – יצירת Capture מ-Azure Portal

בוחרים את השרת הרצוי (השרת שביצענו Sysprep בשלב ה-I) ולוחצים על Capture

CaptureVM-01

נותנים שם ל-Image ולאיזה ResourceGroup לשייך אותו
בנוסף, יש אפשרות לסמן ב-V שלאחר סיום ה-Capture תתבצע תהליך מחיקה אוטומטית ל-VM.

CaptureVM-02

הערה: שימו לב שיש לבצע Sysprep (ביצענו בשלב ה-I) לפני שמריצים Capture.

לאחר סיום ה-Capture נוכל לראות תחת Images את ה-Image שיצרנו ונוכל להתחיל ליצור מכונות חדשות בלחיצה על Create VM

CaptureVM-03

שלב III – יצירת מחשב חדש מ-Custom Image והכנסה לדומיין בעזרת PowerShell.

אני רוצה לשתף אתכם בסקריפט שכתבתי שמאפשר ליצור מכונות חדשות ולהכניס ישירות לדומיין.
תהליך זה יעזור לכם בפריסה מהירה של מחשבים ואפשרות לתת למשתמשים מסוימים להרים מכונות חברות בדומיין בצורה קלה ופשוטה.
לינק להורדה ישירה של הסקריפט: Deploy Azure VM from Image with Join AD

#Set Parameters

#VM Configuration
$VNName = "<VM Computer Name>"
$ResoureGroup = "<ResourceGroup Name>"
$SizeVM = "<Size of the VM>"
$Location = "<Azure Region Location>"
$VNetName = "<VNET Name>"
$SubnetName = "<Subnet Name>"
$ImageName = "<Image Name to Deploy>"
$ResoureGroupImage = "<ResourceGroup of the image>"

#Join to Domain (Need Domain Admin Credential)
$DomainName = "<Domain Name>"
$DomainJoinAdminName = "<Admin Account - Domain\UserName>"
$DomainJoinPassword = "<Admin Password>"
$OUDN = "<OU Distinguished Name>"


####MAIN Script###
    
#Get Image ID
$image = Get-AzureRMImage -ImageName:$ImageName -ResourceGroupName:$ResoureGroupImage -ErrorAction:Stop;

if ($Image) {
    #Get VNET
    $vnetDef = Get-AzureRmVirtualNetwork -ResourceGroupName:$ResoureGroup -Name:$VNetName -ErrorAction:Stop;
    #Get Subnet
    $subnet = Get-AzureRmVirtualNetworkSubnetConfig -Name:$SubnetName -VirtualNetwork:$vnetDef -ErrorAction:Stop;
    $nicName = "$VNName-NIC1"
    #Create NIC
    $nic = New-AzureRmNetworkInterface -ResourceGroupName:$ResoureGroup -Location:$Location -Name:$nicName -SubnetId:$subnet.Id -ErrorAction:Stop;
   
    #Provide Local Admin Credential
    $Cred = Get-Credential -Message:"Please Provide Local Admin User for VM" -ErrorAction:Stop;
    if (!$Cred) {
        Write-Host "Error: Invaild Local Admin Credential (The Windows will be close after 3 seconds)";
        sleep -Seconds:3;
        Exit -1
    }

    #VM Configuration
    $vm = New-AzureRmVMConfig -VMName $VNName -VMSize $SizeVM;
    $vm = Set-AzureRmVMSourceImage -VM $vm -Id $image.Id;
    $vm = Set-AzureRmVMOSDisk -VM $vm  -StorageAccountType standardLRS -DiskSizeInGB 128 -CreateOption FromImage -Caching ReadWrite;
    $vm = Set-AzureRmVMOperatingSystem -VM $vm -Windows -ComputerName $VNName -Credential $Cred -ProvisionVMAgent -EnableAutoUpdate;
    $vm = Add-AzureRmVMNetworkInterface -VM $vm -Id $nic.Id;

    #Create Azure VM
    try {
        New-AzureRmVM -VM $vm -ResourceGroupName $ResoureGroup -Location $Location;
    } catch {
        $ErrorMessage = $_.Exception.Message;
        Write-Host "Failed To Create VM with error $errorMessage (The Windows will be close after 3 seconds)";
        sleep -Seconds:3;
        Exit -1
    }
    
    #Join to AD with ADExtension
    try {
        Set-AzureRMVMExtension -VMName $VNName -ResourceGroupName $ResoureGroup -Name "JoinAD" -ExtensionType "JsonADDomainExtension" -Publisher "Microsoft.Compute" -TypeHandlerVersion "1.0" -Location $Location -Settings @{ "Name" = $DomainName; "OUPath" = "$OUDN"; "User" = $DomainJoinAdminName; "Restart" = "true"; "Options" = 3} -ProtectedSettings @{ "Password" = $DomainJoinPassword}
    } catch {
        $ErrorMessage = $_.Exception.Message;
        Write-Host "Failed To Join Domain with error $errorMessage";
    }
}

בסיום התהליך נוכל לראות שיש לנו VM חדש שמחובר בדומיין.

CaptureVM-04

בהצלחה 🙂

Be the first to comment

Leave a Reply

כתובת האימייל שלך לא תפורסם


*