Aracılığıyla paylaş


Azure Resource Manager şablonundaki sanal makineler

Şunlar için geçerlidir: ✔️ Windows VM'leri

Bu makalede, bir Azure Resource Manager şablonunun sanal makineler için geçerli olan yönleri açıklanmaktadır. Bu makalede sanal makine oluşturmaya yönelik eksiksiz bir şablon açıklanmaktadır; bunun için depolama hesapları, ağ arabirimleri, genel IP adresleri ve sanal ağlar için kaynak tanımlarına ihtiyacınız vardır. Bu kaynakların birlikte nasıl tanımlandığı hakkında daha fazla bilgi için Resource Manager şablonu kılavuzuna bakın.

Galeride VM kaynağını içeren birçok şablon vardır. Şablona dahil edilebilecek tüm öğeler burada açıklanmaz.

Bu örnekte, şablonun belirtilen sayıda VM oluşturmaya yönelik tipik bir kaynak bölümü gösterilmektedir:

"resources": [
  {
    "apiVersion": "2016-04-30-preview",
    "type": "Microsoft.Compute/virtualMachines",
    "name": "[concat('myVM', copyindex())]",
    "location": "[resourceGroup().location]",
    "copy": {
      "name": "virtualMachineLoop",
      "count": "[parameters('numberOfInstances')]"
    },
    "dependsOn": [
      "[concat('Microsoft.Network/networkInterfaces/myNIC', copyindex())]"
    ],
    "properties": {
      "hardwareProfile": {
        "vmSize": "Standard_DS1"
      },
      "osProfile": {
        "computername": "[concat('myVM', copyindex())]",
        "adminUsername": "[parameters('adminUsername')]",
        "adminPassword": "[parameters('adminPassword')]"
      },
      "storageProfile": {
        "imageReference": {
          "publisher": "MicrosoftWindowsServer",
          "offer": "WindowsServer",
          "sku": "2012-R2-Datacenter",
          "version": "latest"
        },
        "osDisk": {
          "name": "[concat('myOSDisk', copyindex())]",
          "caching": "ReadWrite",
          "createOption": "FromImage"
        },
        "dataDisks": [
          {
            "name": "[concat('myDataDisk', copyindex())]",
            "diskSizeGB": "100",
            "lun": 0,
            "createOption": "Empty"
          }
        ]
      },
      "networkProfile": {
        "networkInterfaces": [
          {
            "id": "[resourceId('Microsoft.Network/networkInterfaces',
              concat('myNIC', copyindex()))]"
          }
        ]
      },
      "diagnosticsProfile": {
        "bootDiagnostics": {
          "enabled": "true",
          "storageUri": "[concat('https://', variables('storageName'), '.blob.core.windows.net')]"
        }
      }
    },
    "resources": [
      {
        "name": "Microsoft.Insights.VMDiagnosticsSettings",
        "type": "extensions",
        "location": "[resourceGroup().location]",
        "apiVersion": "2016-03-30",
        "dependsOn": [
          "[concat('Microsoft.Compute/virtualMachines/myVM', copyindex())]"
        ],
        "properties": {
          "publisher": "Microsoft.Azure.Diagnostics",
          "type": "IaaSDiagnostics",
          "typeHandlerVersion": "1.5",
          "autoUpgradeMinorVersion": true,
          "settings": {
            "xmlCfg": "[base64(concat(variables('wadcfgxstart'),
            variables('wadmetricsresourceid'),
            concat('myVM', copyindex()),
            variables('wadcfgxend')))]",
            "storageAccount": "[variables('storageName')]"
          },
          "protectedSettings": {
            "storageAccountName": "[variables('storageName')]",
            "storageAccountKey": "[listkeys(variables('accountid'),
              '2015-06-15').key1]",
            "storageAccountEndPoint": "https://core.windows.net"
          }
        }
      },
      {
        "name": "MyCustomScriptExtension",
        "type": "extensions",
        "apiVersion": "2016-03-30",
        "location": "[resourceGroup().location]",
        "dependsOn": [
          "[concat('Microsoft.Compute/virtualMachines/myVM', copyindex())]"
        ],
        "properties": {
          "publisher": "Microsoft.Compute",
          "type": "CustomScriptExtension",
          "typeHandlerVersion": "1.7",
          "autoUpgradeMinorVersion": true,
          "settings": {
            "fileUris": [
              "[concat('https://', variables('storageName'),
                '.blob.core.windows.net/customscripts/start.ps1')]"
            ],
            "commandToExecute": "powershell.exe -ExecutionPolicy Unrestricted -File start.ps1"
          }
        }
      }
    ]
  }
]

Not

Bu örnek, daha önce oluşturulmuş bir depolama hesabını kullanır. Depolama hesabını şablondan dağıtarak oluşturabilirsiniz. Örnek ayrıca bir ağ arabirimine ve şablonda tanımlanacak bağımlı kaynaklarına dayanır. Bu kaynaklar örnekte gösterilmez.

API Sürümü

Kaynakları şablon kullanarak dağıtırken, kullanılacak API'nin bir sürümünü belirtmeniz gerekir. Örnekte şu apiVersion öğesini kullanan sanal makine kaynağı gösterilmektedir:

"apiVersion": "2016-04-30-preview",

Şablonunuzda belirttiğiniz API sürümü, şablonda tanımlayabileceğiniz özellikleri etkiler. Genel olarak, şablon oluştururken en son API sürümünü seçmeniz gerekir. Mevcut şablonlar için, önceki bir API sürümünü kullanmaya devam etmek mi istediğinize karar verebilir veya yeni özelliklerden yararlanmak için şablonunuzu en son sürüme güncelleştirebilirsiniz.

En son API sürümlerini almak için şu fırsatları kullanın:

Parametreler ve değişkenler

Parametreler , çalıştırdığınızda şablon için değerleri belirtmenizi kolaylaştırır. Bu parametreler bölümü örnekte kullanılır:

"parameters": {
  "adminUsername": { "type": "string" },
  "adminPassword": { "type": "securestring" },
  "numberOfInstances": { "type": "int" }
},

Örnek şablonu dağıttığınızda, her vm'de yönetici hesabının adı ve parolası ile oluşturulacak VM sayısı değerlerini girersiniz. Parametre değerlerini şablonla yönetilen ayrı bir dosyada belirtme veya istendiğinde değer sağlama seçeneğiniz vardır.

Değişkenler , şablonda art arda kullanılan veya zaman içinde değişebilen değerleri ayarlamanızı kolaylaştırır. Bu değişkenler bölümü örnekte kullanılır:

"variables": {
  "storageName": "mystore1",
  "accountid": "[concat('/subscriptions/', subscription().subscriptionId,
    '/resourceGroups/', resourceGroup().name,
  '/providers/','Microsoft.Storage/storageAccounts/', variables('storageName'))]",
  "wadlogs": "<WadCfg>
    <DiagnosticMonitorConfiguration overallQuotaInMB=\"4096\" xmlns=\"http://schemas.microsoft.com/ServiceHosting/2010/10/DiagnosticsConfiguration\">
      <DiagnosticInfrastructureLogs scheduledTransferLogLevelFilter=\"Error\"/>
      <WindowsEventLog scheduledTransferPeriod=\"PT1M\" >
        <DataSource name=\"Application!*[System[(Level = 1 or Level = 2)]]\" />
        <DataSource name=\"Security!*[System[(Level = 1 or Level = 2)]]\" />
        <DataSource name=\"System!*[System[(Level = 1 or Level = 2)]]\" />
      </WindowsEventLog>",
  "wadperfcounters": "<PerformanceCounters scheduledTransferPeriod=\"PT1M\">
      <PerformanceCounterConfiguration counterSpecifier=\"\\Process(_Total)\\Thread Count\" sampleRate=\"PT15S\" unit=\"Count\">
        <annotation displayName=\"Threads\" locale=\"en-us\"/>
      </PerformanceCounterConfiguration>
    </PerformanceCounters>",
  "wadcfgxstart": "[concat(variables('wadlogs'), variables('wadperfcounters'),
    '<Metrics resourceId=\"')]",
  "wadmetricsresourceid": "[concat('/subscriptions/', subscription().subscriptionId,
    '/resourceGroups/', resourceGroup().name ,
    '/providers/', 'Microsoft.Compute/virtualMachines/')]",
  "wadcfgxend": "\"><MetricAggregation scheduledTransferPeriod=\"PT1H\"/>
    <MetricAggregation scheduledTransferPeriod=\"PT1M\"/>
    </Metrics></DiagnosticMonitorConfiguration>
    </WadCfg>"
},

Örnek şablonu dağıttığınızda, daha önce oluşturulan depolama hesabının adı ve tanımlayıcısı için değişken değerleri kullanılır. Değişkenler, tanılama uzantısının ayarlarını sağlamak için de kullanılır. Şablonunuzda parametreleri ve değişkenleri nasıl yapılandırmak istediğinize karar vermenize yardımcı olması için Azure Resource Manager şablonları oluşturmaya yönelik en iyi yöntemleri kullanın.

Kaynak döngüleri

Uygulamanız için birden fazla sanal makineye ihtiyacınız olduğunda, şablonda bir kopyalama öğesi kullanabilirsiniz. Bu isteğe bağlı öğe, parametre olarak belirttiğiniz VM sayısını oluşturma işleminde döngü oluşturur:

"copy": {
  "name": "virtualMachineLoop",
  "count": "[parameters('numberOfInstances')]"
},

Ayrıca örnekte, kaynak için bazı değerler belirtilirken döngü dizininin kullanıldığına dikkat edin. Örneğin, üç örnek sayısı girdiyseniz, işletim sistemi disklerinin adları myOSDisk1, myOSDisk2 ve myOSDisk3'tür:

"osDisk": {
  "name": "[concat('myOSDisk', copyindex())]",
  "caching": "ReadWrite",
  "createOption": "FromImage"
}

Not

Bu örnekte sanal makineler için yönetilen diskler kullanılmaktadır.

Şablonda bir kaynak için döngü oluşturmanın, diğer kaynakları oluştururken veya bunlara erişirken döngünün kullanılmasını gerektirebileceğini unutmayın. Örneğin, birden çok VM aynı ağ arabirimini kullanamaz, bu nedenle şablonunuz üç VM oluşturarak döngü oluşturuyorsa, üç ağ arabirimi oluşturma işleminde de döngü yapmalıdır. Vm'ye ağ arabirimi atarken, döngü dizini onu tanımlamak için kullanılır:

"networkInterfaces": [ {
  "id": "[resourceId('Microsoft.Network/networkInterfaces',
    concat('myNIC', copyindex()))]"
} ]

Bağımlılıklar

Kaynakların çoğu düzgün çalışması için diğer kaynaklara bağımlıdır. Sanal makineler bir sanal ağ ile ilişkilendirilmelidir ve bunu yapmak için bir ağ arabirimi gerekir. dependsOn öğesi, vm'ler oluşturulmadan önce ağ arabiriminin kullanılmaya hazır olduğundan emin olmak için kullanılır:

"dependsOn": [
  "[concat('Microsoft.Network/networkInterfaces/', 'myNIC', copyindex())]"
],

Resource Manager, dağıtılan başka bir kaynağa bağımlı olmayan tüm kaynakları paralel olarak dağıtır. Gereksiz bağımlılıklar belirterek dağıtımınızı yanlışlıkla yavaşlatabileceğiniz için bağımlılıkları ayarlarken dikkatli olun. Bağımlılıklar birden çok kaynak arasında zincir oluşturabilir. Örneğin, ağ arabirimi genel IP adresine ve sanal ağ kaynaklarına bağlıdır.

Bir bağımlılığın gerekli olup olmadığını nasıl anlarsınız? Şablonda ayarladığınız değerlere bakın. Sanal makine kaynak tanımındaki bir öğe aynı şablonda dağıtılan başka bir kaynağı işaret ederse, bir bağımlılık gerekir. Örneğin, örnek sanal makineniz bir ağ profili tanımlar:

"networkProfile": {
  "networkInterfaces": [ {
    "id": "[resourceId('Microsoft.Network/networkInterfaces',
      concat('myNIC', copyindex())]"
  } ]
},

Bu özelliği ayarlamak için ağ arabiriminin mevcut olması gerekir. Bu nedenle, bir bağımlılık gerekir. Ayrıca, bir kaynak (bir alt) başka bir kaynak (üst) içinde tanımlandığında da bağımlılık ayarlamanız gerekir. Örneğin, tanılama ayarları ve özel betik uzantılarının her ikisi de sanal makinenin alt kaynakları olarak tanımlanır. Sanal makine var olana kadar oluşturulamaz. Bu nedenle, her iki kaynak da sanal makineye bağımlı olarak işaretlenir.

Profiller

Sanal makine kaynağı tanımlanırken çeşitli profil öğeleri kullanılır. Bazıları gereklidir, bazıları isteğe bağlıdır. Örneğin hardwareProfile, osProfile, storageProfile ve networkProfile öğeleri gereklidir, ancak diagnosticsProfile isteğe bağlıdır. Bu profiller aşağıdaki gibi ayarları tanımlar:

Diskler ve görüntüler

Azure'da vhd dosyaları diskleri veya görüntüleri temsil edebilir. Bir vhd dosyasındaki işletim sistemi belirli bir VM olacak şekilde özelleştirilebilirse disk olarak adlandırılır. Bir vhd dosyasındaki işletim sistemi, birçok VM oluşturmak için kullanılacak şekilde genelleştirildiğinde, buna görüntü denir.

Platform görüntüsünden yeni sanal makineler ve yeni diskler oluşturma

BIR VM oluşturduğunuzda, hangi işletim sisteminin kullanılacağına karar vermeniz gerekir. imageReference öğesi, yeni bir VM'nin işletim sistemini tanımlamak için kullanılır. Örnekte Bir Windows Server işletim sisteminin tanımı gösterilmektedir:

"imageReference": {
  "publisher": "MicrosoftWindowsServer",
  "offer": "WindowsServer",
  "sku": "2012-R2-Datacenter",
  "version": "latest"
},

Linux işletim sistemi oluşturmak istiyorsanız şu tanımı kullanabilirsiniz:

"imageReference": {
  "publisher": "Canonical",
  "offer": "UbuntuServer",
  "sku": "20.04.2-LTS",
  "version": "latest"
},

Not

, offerve skuversion değerlerini uygun şekilde değiştirinpublisher.

İşletim sistemi diskinin yapılandırma ayarları osDisk öğesiyle atanır. Örnek, önbelleğe alma modu ReadWrite olarak ayarlanmış ve diskin bir platform görüntüsünden oluşturulduğu yeni bir yönetilen disk tanımlar:

"osDisk": {
  "name": "[concat('myOSDisk', copyindex())]",
  "caching": "ReadWrite",
  "createOption": "FromImage"
},

Mevcut yönetilen disklerden yeni sanal makineler oluşturma

Mevcut disklerden sanal makineler oluşturmak istiyorsanız imageReference ve osProfile öğelerini kaldırın ve şu disk ayarlarını tanımlayın:

"osDisk": {
  "osType": "Windows",
  "managedDisk": {
    "id": "[resourceId('Microsoft.Compute/disks', [concat('myOSDisk', copyindex())])]"
  },
  "caching": "ReadWrite",
  "createOption": "Attach"
},

Yönetilen görüntüden yeni sanal makineler oluşturma

Yönetilen bir görüntüden sanal makine oluşturmak istiyorsanız imageReference öğesini değiştirin ve şu disk ayarlarını tanımlayın:

"storageProfile": {
  "imageReference": {
    "id": "[resourceId('Microsoft.Compute/images', 'myImage')]"
  },
  "osDisk": {
    "name": "[concat('myOSDisk', copyindex())]",
    "osType": "Windows",
    "caching": "ReadWrite",
    "createOption": "FromImage"
  }
},

Veri diskleri ekleme

İsteğe bağlı olarak VM'lere veri diskleri ekleyebilirsiniz. Disk sayısı, kullandığınız işletim sistemi diskinin boyutuna bağlıdır. VM'lerin boyutu Standard_DS1_v2 olarak ayarlandığında, bunlara eklenebilecek en fazla veri diski sayısı iki olur. Örnekte, her vm'ye bir yönetilen veri diski eklenmektedir:

"dataDisks": [
  {
    "name": "[concat('myDataDisk', copyindex())]",
    "diskSizeGB": "100",
    "lun": 0,
    "caching": "ReadWrite",
    "createOption": "Empty"
  }
],

Uzantıları

Uzantılar ayrı bir kaynak olsa da vm'lere yakından bağlıdır. Uzantılar VM'nin alt kaynağı olarak veya ayrı bir kaynak olarak eklenebilir. Örnekte VM'lere eklenen Tanılama Uzantısı gösterilmektedir:

{
  "name": "Microsoft.Insights.VMDiagnosticsSettings",
  "type": "extensions",
  "location": "[resourceGroup().location]",
  "apiVersion": "2016-03-30",
  "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/myVM', copyindex())]"
  ],
  "properties": {
    "publisher": "Microsoft.Azure.Diagnostics",
    "type": "IaaSDiagnostics",
    "typeHandlerVersion": "1.5",
    "autoUpgradeMinorVersion": true,
    "settings": {
      "xmlCfg": "[base64(concat(variables('wadcfgxstart'),
      variables('wadmetricsresourceid'),
      concat('myVM', copyindex()),
      variables('wadcfgxend')))]",
      "storageAccount": "[variables('storageName')]"
    },
    "protectedSettings": {
      "storageAccountName": "[variables('storageName')]",
      "storageAccountKey": "[listkeys(variables('accountid'),
        '2015-06-15').key1]",
      "storageAccountEndPoint": "https://core.windows.net"
    }
  }
},

Bu uzantı kaynağı, değerleri sağlamak için storageName değişkenini ve tanılama değişkenlerini kullanır. Bu uzantı tarafından toplanan verileri değiştirmek isterseniz wadperfcounters değişkenine daha fazla performans sayacı ekleyebilirsiniz. Tanılama verilerini VM disklerinin depolandığı konumdan farklı bir depolama hesabına yerleştirmeyi de seçebilirsiniz.

Bir VM'ye yükleyebileceğiniz birçok uzantı vardır, ancak en kullanışlısı büyük olasılıkla Özel Betik Uzantısıdır. Örnekte, start.ps1 adlı bir PowerShell betiği ilk başlatıldığında her sanal makinede çalıştırılır:

{
  "name": "MyCustomScriptExtension",
  "type": "extensions",
  "apiVersion": "2016-03-30",
  "location": "[resourceGroup().location]",
  "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/myVM', copyindex())]"
  ],
  "properties": {
    "publisher": "Microsoft.Compute",
    "type": "CustomScriptExtension",
    "typeHandlerVersion": "1.7",
    "autoUpgradeMinorVersion": true,
    "settings": {
      "fileUris": [
        "[concat('https://', variables('storageName'),
          '.blob.core.windows.net/customscripts/start.ps1')]"
      ],
      "commandToExecute": "powershell.exe -ExecutionPolicy Unrestricted -File start.ps1"
    }
  }
}

start.ps1 betiği birçok yapılandırma görevini gerçekleştirebilir. Örneğin, örnekteki VM'lere eklenen veri diskleri başlatılmaz; bunları başlatmak için özel bir betik kullanabilirsiniz. Yapacak birden çok başlangıç göreviniz varsa azure depolamadaki diğer PowerShell betiklerini çağırmak için start.ps1 dosyasını kullanabilirsiniz. Örnekte PowerShell kullanılır, ancak kullandığınız işletim sisteminde kullanılabilen herhangi bir betik yöntemini kullanabilirsiniz.

Yüklü uzantıların durumunu portaldaki Uzantılar ayarlarından görebilirsiniz:

Uzantı durumunu alma

Uzantı bilgilerini Get-AzVMExtension PowerShell komutunu, vm uzantısı Azure CLI'yi al komutunu veya Uzantı bilgilerini al REST API'sini kullanarak da alabilirsiniz.

Dağıtımlar

Bir şablonu dağıttığınızda, Azure grup olarak dağıttığınız kaynakları izler ve bu dağıtılan gruba otomatik olarak bir ad atar. Dağıtımın adı, şablonun adıyla aynıdır.

Dağıtımdaki kaynakların durumunu merak ediyorsanız, Azure portal kaynak grubunu görüntüleyin:

Dağıtım bilgilerini alma

Kaynak oluşturmak veya mevcut kaynakları güncelleştirmek için aynı şablonu kullanmak sorun değildir. Şablonları dağıtmak için komutları kullandığınızda, hangi modu kullanmak istediğinizi söyleme fırsatınız vardır. Mod Tamamlandı veya Artımlı olarak ayarlanabilir. Varsayılan değer artımlı güncelleştirmeler yapmaktır. Kaynakları yanlışlıkla silebileceğinden , Tamamlama modunu kullanırken dikkatli olun. Modu Tamamlandı olarak ayarladığınızda, Resource Manager kaynak grubundaki şablonda olmayan tüm kaynakları siler.

Sonraki Adımlar