Komputer virtual dalam templat Azure Resource Manager

Berlaku untuk: ✔️ Mesin virtual Windows

Artikel ini menjelaskan aspek templat Azure Resource Manager yang berlaku untuk komputer virtual. Artikel ini tidak menjelaskan template lengkap untuk membuat mesin virtual; untuk itu Anda memerlukan definisi sumber daya untuk akun penyimpanan, antarmuka jaringan, alamat IP publik, dan jaringan virtual. Untuk informasi selengkapnya tentang bagaimana sumber daya ini dapat didefinisikan bersama-sama, lihat panduan templat Azure Resource Manager.

Ada banyak templat di galeri yang menyertakan sumber daya komputer virtual. Tidak semua elemen yang dapat disertakan dalam templat dijelaskan di sini.

Contoh ini memperlihatkan bagian sumber daya umum sebuah templat untuk membuat beberapa komputer virtual tertentu:

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

Catatan

Contoh ini bergantung pada akun penyimpanan yang sebelumnya dibuat. Anda dapat membuat akun penyimpanan dengan menyebarkannya dari templat. Contohnya juga bergantung pada antarmuka jaringan dan sumber daya dependennya yang akan didefinisikan dalam template. Sumber daya ini tidak ditampilkan dalam contoh.

Versi API

Saat Anda menyebarkan sumber daya menggunakan template, Anda harus menentukan versi API yang akan digunakan. Contoh menunjukkan sumber daya komputer virtual menggunakan elemen apiVersion ini:

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

Versi API yang Anda tentukan dalam template Anda memengaruhi properti mana yang dapat Anda tentukan dalam template. Secara umum, Anda harus memilih versi API terbaru saat membuat template. Untuk template yang sudah ada, Anda dapat memutuskan apakah Anda ingin terus menggunakan versi API yang terdahulu, atau memperbarui template Anda untuk versi terbaru untuk memanfaatkan fitur baru.

Gunakan peluang ini untuk mendapatkan versi API terbaru:

Parameter dan variabel

Parameter memudahkan Anda menentukan nilai untuk templat saat Anda menjalankannya. Bagian parameter ini digunakan dalam contoh:

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

Saat Anda menyebarkan templat contoh, Anda memasukkan nilai untuk nama dan kata sandi akun administrator pada setiap komputer virtual dan jumlah komputer virtual yang akan dibuat. Anda memiliki opsi untuk menentukan nilai parameter dalam file terpisah yang dikelola dengan templat, atau menyediakan nilai saat diminta.

Variabel memudahkan Anda untuk mengatur nilai dalam templat yang digunakan berulang kali di seluruh templat atau yang dapat berubah dari waktu ke waktu. Bagian variabel ini digunakan dalam contoh:

"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>"
},

Saat Anda menyebarkan contoh templat, nilai variabel digunakan untuk nama dan pengidentifikasi akun penyimpanan yang dibuat sebelumnya. Variabel juga digunakan untuk menyediakan pengaturan untuk ekstensi diagnostik. Gunakan praktik terbaik untuk membuat templat Azure Resource Manager untuk membantu Anda memutuskan bagaimana Anda ingin menyusun parameter dan variabel dalam templat Anda.

Perulangan sumber daya

Ketika Anda membutuhkan lebih dari satu komputer virtual untuk aplikasi Anda, Anda dapat menggunakan elemen salin dalam templat. Elemen opsional ini mengulang pembuatan jumlah komputer virtual yang Anda tentukan sebagai parameter:

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

Juga, perhatikan dalam contoh bahwa indeks perulangan digunakan saat menentukan beberapa nilai untuk sumber daya. Misalnya, jika Anda memasukkan jumlah instansi tiga, nama disk sistem operasi adalah myOSDisk1, myOSDisk2, dan myOSDisk3:

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

Catatan

Contoh ini menggunakan disk terkelola untuk komputer virtual.

Perlu diingat bahwa membuat perulangan untuk satu sumber daya dalam templat mungkin mengharuskan Anda untuk menggunakan perulangan saat membuat atau mengakses sumber daya lain. Misalnya, beberapa VM tidak dapat menggunakan antarmuka jaringan yang sama, jadi jika template Anda melakukan loop melalui pembuatan tiga VM, template juga harus melakukan loop melalui pembuatan tiga antarmuka jaringan. Saat menetapkan antarmuka jaringan ke VM, indeks perulangan digunakan untuk mengidentifikasinya:

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

Dependensi

Sebagian besar sumber daya bergantung pada sumber daya lain untuk bekerja dengan benar. Komputer virtual harus dikaitkan dengan jaringan virtual dan untuk melakukan itu perlu antarmuka jaringan. Elemen dependsOn digunakan untuk memastikan bahwa antarmuka jaringan siap digunakan sebelum VM dibuat:

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

Azure Resource Manager menyebarkan secara paralel sumber daya apa pun yang tidak bergantung pada sumber daya lain yang disebarkan. Berhati-hatilah saat mengatur dependensi karena Anda secara tidak sengaja dapat memperlambat penyebaran dengan menentukan dependensi yang tidak perlu. Dependensi dapat tersambung melalui beberapa sumber daya. Misalnya, antarmuka jaringan tergantung pada alamat IP publik dan sumber daya jaringan virtual.

Bagaimana Anda tahu bila dependensi diperlukan? Lihat nilai yang Anda tetapkan dalam templat. Jika elemen dalam definisi sumber daya komputer virtual menunjuk ke sumber daya lain yang disebarkan dalam templat yang sama, Anda memerlukan dependensi. Misalnya, contoh mesin virtual Anda mendefinisikan profil jaringan:

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

Untuk mengatur properti ini, maka antarmuka jaringan harus ada. Oleh karena itu, Anda membutuhkan dependensi. Anda juga perlu mengatur dependensi saat satu sumber daya (anak) didefinisikan dalam sumber daya lain (induk). Misalnya, pengaturan diagnostik dan ekstensi skrip kustom keduanya didefinisikan sebagai sumber daya anak dari komputer virtual. Mereka tidak dapat dibuat sampai ada komputer virtual. Oleh karena itu, kedua sumber daya ditandai sebagai tergantung pada komputer virtual.

Profil

Beberapa elemen profil digunakan saat mendefinisikan sumber daya komputer virtual. Sebagian harus ada diperlukan dan sebagian lain bersifat opsional. Misalnya, hardwareProfile, osProfile, storageProfile, dan networkProfile elemen diperlukan, tetapi diagnostikProfile bersifat opsional. Profil ini mendefinisikan pengaturan seperti:

Disk dan gambar

Di Azure, file vhd dapat mewakili disk atau gambar. Ketika sistem operasi dalam file vhd dikhususkan untuk menjadi VM tertentu, maka sistem tersebut dirujuk sebagai disk. Ketika sistem operasi dalam file vhd digeneralisasi untuk pembuatan banyak VM, maka sistem tersebut dirujuk sebagai gambar.

Membuat komputer virtual baru dan disk baru dari gambar platform

Ketika Anda membuat VM, Anda harus memutuskan sistem operasi apa yang akan digunakan. Elemen imageReference digunakan untuk mendefinisikan sistem operasi dari VM baru. Contoh ini memperlihatkan definisi untuk sistem operasi Windows Server:

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

Jika Anda ingin membuat sistem operasi Linux, Anda mungkin menggunakan definisi ini:

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

Catatan

Ubah publishernilai , offer, sku dan version yang sesuai.

Pengaturan konfigurasi untuk disk sistem operasi ditetapkan dengan elemen osDisk. Contoh mendefinisikan disk terkelola baru dengan mode penembolokan diatur ke ReadWrite dan bahwa disk sedang dibuat dari gambar platform:

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

Buat komputer virtual baru dari disk terkelola yang ada

Jika Anda ingin membuat komputer virtual dari disk yang ada, hapus imageReference dan elemen osProfile dan tentukan pengaturan disk ini:

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

Membuat komputer virtual baru dari gambar terkelola

Jika Anda ingin membuat komputer virtual dari gambar terkelola, ubah elemen imageReference dan tentukan pengaturan disk ini:

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

Melampirkan disk data

Anda dapat secara opsional menambahkan disk data ke beberapa VM. Jumlah disk tergantung pada ukuran disk sistem operasi yang Anda gunakan. Dengan ukuran VM yang diatur ke Standard_DS1_v2, jumlah maksimum disk data yang dapat ditambahkan ke dalamnya adalah dua. Dalam contoh, satu disk data terkelola sedang ditambahkan ke setiap VM:

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

Ekstensi

Meskipun ekstensi adalah sumber daya yang terpisah, ekstensi terkait erat ke VM. Ekstensi dapat ditambahkan sebagai sumber daya anak VM atau sebagai sumber daya terpisah. Contoh menunjukkan Ekstensi Diagnostik sedang ditambahkan ke VM:

{
  "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"
    }
  }
},

Sumber daya ekstensi ini menggunakan variabel storageName dan variabel diagnostik untuk menyediakan nilai. Jika Anda ingin mengubah data yang dikumpulkan oleh ekstensi ini, Anda dapat menambahkan lebih banyak penghitung kinerja ke variabel wadperfcounters. Anda juga dapat memilih untuk memasukkan data diagnostik ke akun penyimpanan yang berbeda dari tempat disk VM disimpan.

Ada banyak ekstensi yang dapat Anda pasang pada VM, tetapi yang paling berguna mungkin adalah Ekstensi Skrip Kustom. Dalam contoh, skrip PowerShell bernama start.ps1 berjalan pada setiap VM saat pertama kali memulai:

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

Skrip start.ps1 dapat menyelesaikan banyak tugas konfigurasi. Misalnya, disk data yang ditambahkan ke VM tidak diinisialisasi; Anda bisa menggunakan skrip kustom untuk menginisialisasinya. Jika Anda memiliki beberapa tugas startup yang harus dilakukan, Anda bisa menggunakan file start.ps1 untuk memanggil skrip PowerShell lainnya di penyimpanan Azure. Contohnya menggunakan PowerShell, tetapi Anda dapat menggunakan metode skrip apa pun yang tersedia pada sistem operasi yang Anda gunakan.

Anda dapat melihat status ekstensi yang di pasang dari pengaturan Ekstensi di portal:

Dapatkan status ekstensi

Anda juga bisa mendapatkan informasi ekstensi dengan menggunakan perintah PowerShell Get-AzVMExtension, perintah Azure CLI vm extension get, atau REST API Get extension information.

Penyebaran

Saat Anda menyebarkan templat, Azure melacak sumber daya yang Anda sebarkan sebagai grup dan secara otomatis menetapkan nama ke grup yang disebarkan ini. Nama penyebarannya sama dengan nama templat.

Jika Anda ingin tahu tentang status sumber daya dalam penyebaran, lihat grup sumber daya di portal Microsoft Azure:

Dapatkan informasi penyebaran

Menggunakan template yang sama untuk membuat sumber daya atau memperbarui sumber daya yang ada bukanlah masalah. Saat Anda menggunakan perintah untuk menyebarkan templat, Anda memiliki kesempatan untuk menyebutkan mode mana yang ingin Anda gunakan. Mode dapat diatur ke Selesai atau Bertahap. Defaultnya adalah melakukan pembaruan bertahap. Berhati-hatilah saat menggunakan mode Selesai karena Anda mungkin secara tidak sengaja menghapus sumber daya. Saat Anda mengatur mode ke Selesai, Resource Manager menghapus sumber daya apa pun di grup sumber daya yang tidak ada dalam templat.

Langkah berikutnya