Latihan - Menambahkan parameter ke skrip penyebaran
Sekarang setelah Anda menggunakan skrip penyebaran untuk memigrasikan beberapa pekerjaan manual ke templat Azure Resource Manager (ARM), tim aplikasi mitra lain di organisasi Anda meminta bantuan.
Proses tim memiliki persyaratan yang sama, tetapi tim perlu menyebarkan beberapa file ke akun penyimpanannya. Tim memiliki skrip PowerShell yang dapat mengambil daftar file sebagai parameter dan mengunggahnya, serupa dengan skrip yang sudah Anda gunakan di templat Anda.
Dalam latihan ini, Anda mengambil templat sebelumnya sebagai titik awal dan memperbarui skrip PowerShell untuk menggunakan templat tersebut dari tim mitra Anda. Kemudian, Anda menambahkan cara untuk mengaktifkan orang yang menyebarkan templat untuk menentukan file konfigurasi apa yang akan disebarkan (satu atau beberapa).
Selama proses tersebut, Anda akan:
- Perbarui skrip penyebaran.
- Tambahkan variabel lingkungan dan parameter templat, serta teruskan ini ke skrip penyebaran Anda.
- Tambahkan output ke skrip penyebaran.
- Tambahkan file parameter.
- Sebarkan templat, dan verifikasi hasilnya.
Membuat template memulai
Anda mulai dengan template yang Anda buat di latihan terakhir.
Buka Visual Studio Code, dan buat file baru yang disebut azuredeploy.json.
Salin templat awal berikut ke azuredeploy.json.
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.1", "apiProfile": "", "parameters": {}, "variables": { "storageAccountName": "[concat('storage', uniqueString(resourceGroup().id))]", "storageBlobContainerName": "config", "userAssignedIdentityName": "configDeployer", "roleAssignmentName": "[guid(concat(resourceGroup().id, 'contributor'))]", "contributorRoleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]", "deploymentScriptName": "CopyConfigScript" }, "functions": [], "resources": [ { "name": "[variables('storageAccountName')]", "type": "Microsoft.Storage/storageAccounts", "apiVersion": "2023-01-01", "tags": { "displayName": "[variables('storageAccountName')]" }, "location": "[resourceGroup().location]", "kind": "StorageV2", "sku": { "name": "Standard_LRS", "tier": "Standard" }, "properties": { "allowBlobPublicAccess": true, "encryption": { "services": { "blob": { "enabled": true } }, "keySource": "Microsoft.Storage" }, "supportsHttpsTrafficOnly": true } }, { "type": "Microsoft.Storage/storageAccounts/blobServices", "apiVersion": "2019-04-01", "name": "[concat(variables('storageAccountName'), '/default')]", "dependsOn": [ "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]" ] }, { "type": "Microsoft.Storage/storageAccounts/blobServices/containers", "apiVersion": "2019-04-01", "name": "[concat(variables('storageAccountName'),'/default/',variables('storageBlobContainerName'))]", "dependsOn": [ "[resourceId('Microsoft.Storage/storageAccounts/blobServices', variables('storageAccountName'), 'default')]", "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]" ], "properties": { "publicAccess": "Blob" } }, { "type": "Microsoft.ManagedIdentity/userAssignedIdentities", "apiVersion": "2018-11-30", "name": "[variables('userAssignedIdentityName')]", "location": "[resourceGroup().location]" }, { "type": "Microsoft.Authorization/roleAssignments", "apiVersion": "2020-04-01-preview", "name": "[variables('roleAssignmentName')]", "dependsOn": [ "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName'))]" ], "properties": { "roleDefinitionId": "[variables('contributorRoleDefinitionId')]", "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName')), '2015-08-31-preview').principalId]", "scope": "[resourceGroup().id]", "principalType": "ServicePrincipal" } }, { "type": "Microsoft.Resources/deploymentScripts", "apiVersion": "2020-10-01", "name": "[variables('deploymentScriptName')]", "location": "[resourceGroup().location]", "kind": "AzurePowerShell", "dependsOn": [ "[resourceId('Microsoft.Authorization/roleAssignments', variables('roleAssignmentName'))]", "[resourceId('Microsoft.Storage/storageAccounts/blobServices/containers', variables('storageAccountName'), 'default', variables('storageBlobContainerName'))]" ], "identity": { "type": "UserAssigned", "userAssignedIdentities": { "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities',variables('userAssignedIdentityName'))]": {} } }, "properties": { "azPowerShellVersion": "3.0", "scriptContent": " Invoke-RestMethod -Uri 'https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/appsettings.json' -OutFile 'appsettings.json' $storageAccount = Get-AzStorageAccount -ResourceGroupName 'learndeploymentscript_exercise_1' | Where-Object { $_.StorageAccountName -like 'storage*' } $blob = Set-AzStorageBlobContent -File 'appsettings.json' -Container 'config' -Blob 'appsettings.json' -Context $StorageAccount.Context $DeploymentScriptOutputs = @{} $DeploymentScriptOutputs['Uri'] = $blob.ICloudBlob.Uri $DeploymentScriptOutputs['StorageUri'] = $blob.ICloudBlob.StorageUri ", "retentionInterval": "P1D" } } ], "outputs": { "fileUri": { "type": "string", "value": "[reference(variables('deploymentScriptName')).outputs.Uri]" } } }Simpan templat.
Buka Visual Studio Code, dan buat file baru yang disebut main.bicep.
Salin templat awal berikut ke main.bicep.
var storageAccountName = 'storage${uniqueString(resourceGroup().id)}' var storageBlobContainerName = 'config' var userAssignedIdentityName = 'configDeployer' var roleAssignmentName = guid(resourceGroup().id, 'contributor') var contributorRoleDefinitionId = resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c') var deploymentScriptName = 'CopyConfigScript' resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = { name: storageAccountName tags: { displayName: storageAccountName } location: resourceGroup().location kind: 'StorageV2' sku: { name: 'Standard_LRS' tier: 'Standard' } properties: { allowBlobPublicAccess: true encryption: { services: { blob: { enabled: true } } keySource: 'Microsoft.Storage' } supportsHttpsTrafficOnly: true } resource blobService 'blobServices' existing = { name: 'default' } } resource blobContainer 'Microsoft.Storage/storageAccounts/blobServices/containers@2019-04-01' = { parent: storageAccount::blobService name: storageBlobContainerName properties: { publicAccess: 'Blob' } } resource userAssignedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2018-11-30' = { name: userAssignedIdentityName location: resourceGroup().location } resource roleAssignment 'Microsoft.Authorization/roleAssignments@2020-04-01-preview' = { name: roleAssignmentName properties: { roleDefinitionId: contributorRoleDefinitionId principalId: userAssignedIdentity.properties.principalId principalType: 'ServicePrincipal' } } resource deploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = { name: deploymentScriptName location: resourceGroup().location kind: 'AzurePowerShell' identity: { type: 'UserAssigned' userAssignedIdentities: { '${userAssignedIdentity.id}': {} } } properties: { azPowerShellVersion: '3.0' scriptContent: ''' Invoke-RestMethod -Uri 'https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/appsettings.json' -OutFile 'appsettings.json' $storageAccount = Get-AzStorageAccount -ResourceGroupName 'learndeploymentscript_exercise_1' | Where-Object { $_.StorageAccountName -like 'storage*' } $blob = Set-AzStorageBlobContent -File 'appsettings.json' -Container 'config' -Blob 'appsettings.json' -Context $storageAccount.Context $DeploymentScriptOutputs = @{} $DeploymentScriptOutputs['Uri'] = $blob.ICloudBlob.Uri $DeploymentScriptOutputs['StorageUri'] = $blob.ICloudBlob.StorageUri ''' retentionInterval: 'P1D' } dependsOn: [ roleAssignment blobContainer ] } output fileUri string = deploymentScript.properties.outputs.UriSimpan templat.
Perbarui skrip PowerShell
Karena tim lain melakukan kerja keras dalam membuat skrip PowerShell untuk menyalin beberapa file, Anda memutuskan untuk menggunakan skrip tersebut di templat Anda.
Edit scriptContent di bagian properties untuk menyertakan skrip yang disediakan tim mitra Anda.
param([string]$File)
$fileList = $File -replace '(\[|\])' -split ',' | ForEach-Object { $_.trim() }
$storageAccount = Get-AzStorageAccount -ResourceGroupName $env:ResourceGroupName -Name $env:StorageAccountName -Verbose
$count = 0
$DeploymentScriptOutputs = @{}
foreach ($fileName in $fileList) {
Write-Host \"Copying $fileName to $env:StorageContainerName in $env:StorageAccountName.\"
Invoke-RestMethod -Uri \"https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/$fileName\" -OutFile $fileName
$blob = Set-AzStorageBlobContent -File $fileName -Container $env:StorageContainerName -Blob $fileName -Context $storageAccount.Context
$DeploymentScriptOutputs[$fileName] = @{}
$DeploymentScriptOutputs[$fileName]['Uri'] = $blob.ICloudBlob.Uri
$DeploymentScriptOutputs[$fileName]['StorageUri'] =$blob.ICloudBlob.StorageUri
$count++
}
Write-Host \"Finished copying $count files.\"
param([string]$File)
$fileList = $File -replace '(\[|\])' -split ',' | ForEach-Object { $_.trim() }
$storageAccount = Get-AzStorageAccount -ResourceGroupName $env:ResourceGroupName -Name $env:StorageAccountName -Verbose
$count = 0
$DeploymentScriptOutputs = @{}
foreach ($fileName in $fileList) {
Write-Host "Copying $fileName to $env:StorageContainerName in $env:StorageAccountName."
Invoke-RestMethod -Uri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/$fileName" -OutFile $fileName
$blob = Set-AzStorageBlobContent -File $fileName -Container $env:StorageContainerName -Blob $fileName -Context $storageAccount.Context
$DeploymentScriptOutputs[$fileName] = @{}
$DeploymentScriptOutputs[$fileName]['Uri'] = $blob.ICloudBlob.Uri
$DeploymentScriptOutputs[$fileName]['StorageUri'] = $blob.ICloudBlob.StorageUri
$count++
}
Write-Host "Finished copying $count files."
Tambahkan variabel lingkungan
Skrip yang Anda adopsi memerlukan beberapa variabel lingkungan. Anda dapat menentukannya langsung dalam templat, tetapi membuat lebih banyak fleksibilitas untuk menggunakan fungsi templat untuk mendapatkan beberapa nilai.
Menambahkan properti
environmentVariableske bagianpropertiesskrip penyebaran."environmentVariables": [ ],Tambahkan variabel lingkungan untuk
ResourceGroupName."environmentVariables": [ { "name": "ResourceGroupName", "value": "[resourceGroup().name]" } ],Tambahkan variabel lingkungan untuk
StorageAccountName."environmentVariables": [ { "name": "ResourceGroupName", "value": "[resourceGroup().name]" }, { "name": "StorageAccountName", "value": "[variables('storageAccountName')]" } ],Tambahkan variabel lingkungan untuk
StorageContainerName."environmentVariables": [ { "name": "ResourceGroupName", "value": "[resourceGroup().name]" }, { "name": "StorageAccountName", "value": "[variables('storageAccountName')]" }, { "name": "StorageContainerName", "value": "[variables('storageBlobContainerName')]" } ],
Petunjuk / Saran
Gunakan fungsi templat untuk mengakses nilai umum seperti [resourceGroup().name] dan [variables()].
Skrip yang Anda adopsi memerlukan beberapa variabel lingkungan. Anda dapat menentukannya secara langsung di templat, namun akan lebih fleksibel dengan menggunakan variabel Bicep untuk memperoleh beberapa nilai.
Menambahkan properti
environmentVariableske bagianpropertiesskrip penyebaran.environmentVariables: [ ]Tambahkan variabel lingkungan untuk
ResourceGroupName.environmentVariables: [ { name: 'ResourceGroupName' value: resourceGroup().name } ]Tambahkan variabel lingkungan untuk
StorageAccountName.environmentVariables: [ { name: 'ResourceGroupName' value: resourceGroup().name } { name: 'StorageAccountName' value: storageAccountName } ]Tambahkan variabel lingkungan untuk
StorageContainerName.environmentVariables: [ { name: 'ResourceGroupName' value: resourceGroup().name } { name: 'StorageAccountName' value: storageAccountName } { name: 'StorageContainerName' value: storageBlobContainerName } ]
Tambahkan parameter templat
Untuk mempermudah penggunaan templat bagi kedua tim, Anda dapat menambahkan parameter ke templat sehingga setiap tim dapat menentukan file yang ingin disalin.
Tambahkan parameter ke templat untuk mengambil array nama file.
"parameters": {
"filesToCopy": {
"type": "array",
"metadata": {
"description": "List of files to copy to application storage account."
}
}
},
Sebagai bonus, Anda dapat memberikan nilai default sehingga templat terus berfungsi untuk tim Anda tanpa perubahan pada proses penyebaran. Meskipun memasukkan nilai default baru tidak diperlukan, itu dapat membantu Anda memahami pola penting. Dengan menjaga proses penyebaran tetap sama, Anda memudahkan tim untuk mengadopsi versi templat baru. Tim terus bertindak seperti sebelumnya, dan fungsionalitas baru adalah hadiahnya. Dengan kata lain, langkah ini menunjukkan kepada Anda bagaimana mempertahankan perilaku yang ada sambil melakukan perubahan untuk mendukung pekerjaan di masa mendatang.
Tambahkan parameter ke templat untuk mengambil array nama file.
@description('List of files to copy to application storage account.')
param filesToCopy array
Sebagai bonus, Anda dapat memberikan nilai default sehingga templat terus berfungsi untuk tim Anda tanpa perubahan pada proses penyebaran. Meskipun memasukkan nilai default baru tidak diperlukan, itu dapat membantu Anda memahami pola penting. Dengan menjaga proses penyebaran tetap sama, Anda memudahkan tim untuk mengadopsi versi templat baru. Tim terus bertindak seperti sebelumnya, dan fungsionalitas baru adalah hadiahnya. Dengan kata lain, langkah ini menunjukkan kepada Anda bagaimana mempertahankan perilaku yang ada sambil melakukan perubahan untuk mendukung pekerjaan di masa mendatang.
Tambahkan argumen untuk diteruskan dalam file untuk disalin
Selanjutnya, Anda dapat mengambil parameter yang Anda tentukan di langkah sebelumnya dan meneruskannya ke skrip penyebaran. Melewati argumen baris perintah bisa menjadi rumit, karena string dievaluasi pada beberapa tingkat. Kutipan yang lolos dengan benar dan memilih kutipan yang tepat untuk pekerjaan itu sangatlah penting untuk sukses.
Petunjuk / Saran
Gunakan fungsi templat untuk mengakses fungsi umum seperti [string()] mengonversi nilai dari satu jenis menjadi string.
Menambahkan properti
argumentske bagian skrip penyebaran. Skrip PowerShell mengambil parameter bernamaFile, yang merupakan string nama file yang harus berasal darifilesToCopyparameter templat. Pastikan ada tanda kutip di sekitar seluruh argumen sehingga akan diteruskan dengan benar.Perhatian
Properti
argumentsini tidak sah. Jika Anda menggunakan ekstensi Azure Resource Manager di Visual Studio Code, ekstensi tersebut mungkin menandai baris ini. Anda akan memperbaiki masalah ini di langkah berikutnya."arguments": "[concat( '-File '', string(parameters('filesToCopy')), ''' )]",Petunjuk / Saran
Mengutip hal-hal di JSON bisa menjadi sulit, terutama ketika Anda melewati argumen baris perintah. Anda dapat menggunakan variabel templat untuk mewakili karakter yang sulit untuk lolos.
Tambahkan variabel templat untuk mewakili karakter kutipan tunggal.
"variables": { "singleQuote": "'", "storageAccountName": "[concat('storage', uniqueString(resourceGroup().id))]", "storageBlobContainerName": "config", "userAssignedIdentityName": "configDeployer", "roleAssignmentName": "[guid(concat(resourceGroup().id, 'contributor'))]", "contributorRoleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]", "deploymentScriptName": "CopyConfigScript" },Ganti tanda kutip tunggal di
argumentsproperti dengan variabel yang Anda tentukan di langkah sebelumnya."arguments": "[concat( '-File ', variables('singleQuote'), string(parameters('filesToCopy')), variables('singleQuote'))]",
Selanjutnya, Anda dapat mengambil parameter yang Anda tentukan di langkah sebelumnya dan meneruskannya ke skrip penyebaran. Melewati argumen baris perintah bisa menjadi rumit, karena string dievaluasi pada beberapa tingkat. Kutipan yang lolos dengan benar dan memilih kutipan yang tepat untuk pekerjaan itu sangatlah penting untuk sukses.
Menambahkan properti arguments ke bagian skrip penyebaran. Skrip PowerShell mengambil parameter bernama File, yang merupakan string nama file yang harus berasal dari filesToCopy parameter templat.
arguments: '-File \'${string(filesToCopy)}\''
Perhatikan ini menggunakan beberapa fitur Bicep:
- Interpolasi string, untuk menggabungkan string.
- Kami menggunakan
\karakter escape untuk memungkinkan kami menyertakan satu karakter kutipan (') di dalam string, karena satu kutipan biasanya merupakan karakter yang dipesan dalam Bicep. - Kami menggunakan
string()fungsi untuk mengonversifilesToCopyarray menjadi string.
Perbarui output templat
Karena Anda mengubah skrip penyebaran untuk menyebarkan satu file atau lebih, Anda perlu memperbarui output templat untuk memberikan semua informasi yang diperlukan.
Perbarui
outputsdalam templat untuk mengembalikan seluruh objek, yang mencakup URI untuk setiap file.$DeploymentScriptOutputs = @{} foreach ($fileName in $fileList) { Write-Host \"Copying $fileName to $env:StorageContainerName in $env:StorageAccountName.\" Invoke-RestMethod -Uri \"https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/$fileName\" -OutFile $fileName $blob = Set-AzStorageBlobContent -File $fileName -Container $env:StorageContainerName -Blob $fileName -Context $storageAccount.Context $DeploymentScriptOutputs[$fileName] = @{} $DeploymentScriptOutputs[$fileName]['Uri'] = $blob.ICloudBlob.Uri $DeploymentScriptOutputs[$fileName]['StorageUri'] =$blob.ICloudBlob.StorageUri $count++ }Tambahkan output lain dengan nama akun penyimpanan (yang memiliki pengidentifikasi acak). Anda menggunakan nama akun ini nanti untuk memvalidasi bahwa skrip penyebaran berfungsi seperti yang Anda harapkan.
$DeploymentScriptOutputs = @{} foreach ($fileName in $fileList) { Write-Host \"Copying $fileName to $env:StorageContainerName in $env:StorageAccountName.\" Invoke-RestMethod -Uri \"https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/$fileName\" -OutFile $fileName $blob = Set-AzStorageBlobContent -File $fileName -Container $env:StorageContainerName -Blob $fileName -Context $storageAccount.Context $DeploymentScriptOutputs[$fileName] = @{} $DeploymentScriptOutputs[$fileName]['Uri'] = $blob.ICloudBlob.Uri $DeploymentScriptOutputs[$fileName]['StorageUri'] =$blob.ICloudBlob.StorageUri $count++ }
Perbarui output dalam templat untuk mengembalikan seluruh objek, yang berisi URI untuk setiap file.
output fileUri object = deploymentScript.properties.outputsTambahkan output lain dengan nama akun penyimpanan (yang memiliki pengidentifikasi acak). Anda menggunakan nama akun ini nanti untuk memvalidasi bahwa skrip penyebaran berfungsi seperti yang Anda harapkan.
output storageAccountName string = storageAccountName
Verifikasi templat Anda
Templat Anda seharusnya terlihat seperti ini:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.1",
"apiProfile": "",
"parameters": {
"filesToCopy": {
"type": "array",
"defaultValue": [ "appsettings.json" ],
"metadata": {
"description": "List of files to copy to application storage account."
}
}
},
"variables": {
"singleQuote": "'",
"storageAccountName": "[concat('storage', uniqueString(resourceGroup().id))]",
"storageBlobContainerName": "config",
"userAssignedIdentityName": "configDeployer",
"roleAssignmentName": "[guid(concat(resourceGroup().id, 'contributor'))]",
"contributorRoleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
"deploymentScriptName": "CopyConfigScript"
},
"functions": [],
"resources": [
{
"name": "[variables('storageAccountName')]",
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2023-01-01",
"tags": {
"displayName": "[variables('storageAccountName')]"
},
"location": "[resourceGroup().location]",
"kind": "StorageV2",
"sku": {
"name": "Standard_LRS",
"tier": "Standard"
},
"properties": {
"allowBlobPublicAccess": true,
"encryption": {
"services": {
"blob": {
"enabled": true
}
},
"keySource": "Microsoft.Storage"
},
"supportsHttpsTrafficOnly": true
}
},
{
"type": "Microsoft.Storage/storageAccounts/blobServices",
"apiVersion": "2019-04-01",
"name": "[concat(variables('storageAccountName'), '/default')]",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
]
},
{
"type": "Microsoft.Storage/storageAccounts/blobServices/containers",
"apiVersion": "2019-04-01",
"name": "[concat(variables('storageAccountName'),'/default/',variables('storageBlobContainerName'))]",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', variables('storageAccountName'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
],
"properties": {
"publicAccess": "Blob"
}
},
{
"type": "Microsoft.ManagedIdentity/userAssignedIdentities",
"apiVersion": "2018-11-30",
"name": "[variables('userAssignedIdentityName')]",
"location": "[resourceGroup().location]"
},
{
"type": "Microsoft.Authorization/roleAssignments",
"apiVersion": "2020-04-01-preview",
"name": "[variables('roleAssignmentName')]",
"dependsOn": [ "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName'))]" ],
"properties": {
"roleDefinitionId": "[variables('contributorRoleDefinitionId')]",
"principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName')), '2015-08-31-preview').principalId]",
"scope": "[resourceGroup().id]",
"principalType": "ServicePrincipal"
}
},
{
"type": "Microsoft.Resources/deploymentScripts",
"apiVersion": "2020-10-01",
"name": "[variables('deploymentScriptName')]",
"location": "[resourceGroup().location]",
"kind": "AzurePowerShell",
"dependsOn": [
"[resourceId('Microsoft.Authorization/roleAssignments', variables('roleAssignmentName'))]",
"[resourceId('Microsoft.Storage/storageAccounts/blobServices/containers', variables('storageAccountName'), 'default', variables('storageBlobContainerName'))]"
],
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities',variables('userAssignedIdentityName'))]": {}
}
},
"properties": {
"arguments": "[concat( '-File ', variables('singleQuote'), string(parameters('filesToCopy')), variables('singleQuote'))]",
"environmentVariables": [
{
"name": "ResourceGroupName",
"value": "[resourceGroup().name]"
},
{
"name": "StorageAccountName",
"value": "[variables('storageAccountName')]"
},
{
"name": "StorageContainerName",
"value": "[variables('storageBlobContainerName')]"
}
],
"azPowerShellVersion": "3.0",
"scriptContent": "
param([string]$File)
$fileList = $File -replace '(\[|\])' -split ',' | ForEach-Object { $_.trim() }
$storageAccount = Get-AzStorageAccount -ResourceGroupName $env:ResourceGroupName -Name $env:StorageAccountName -Verbose
$count = 0
$DeploymentScriptOutputs = @{}
foreach ($fileName in $fileList) {
Write-Host \"Copying $fileName to $env:StorageContainerName in $env:StorageAccountName.\"
Invoke-RestMethod -Uri \"https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/$fileName\" -OutFile $fileName
$blob = Set-AzStorageBlobContent -File $fileName -Container $env:StorageContainerName -Blob $fileName -Context $storageAccount.Context
$DeploymentScriptOutputs[$fileName] = @{}
$DeploymentScriptOutputs[$fileName]['Uri'] = $blob.ICloudBlob.Uri
$DeploymentScriptOutputs[$fileName]['StorageUri'] =$blob.ICloudBlob.StorageUri
$count++
}
Write-Host \"Finished copying $count files.\"
",
"retentionInterval": "P1D"
}
}
],
"outputs": {
"fileUri": {
"type": "object",
"value": "[reference(variables('deploymentScriptName')).outputs]"
},
"storageAccountName": {
"type": "string",
"value": "[variables('storageAccountName')]"
}
}
}
@description('List of files to copy to application storage account.')
param filesToCopy array = [
'appsettings.json'
]
var storageAccountName = 'storage${uniqueString(resourceGroup().id)}'
var storageBlobContainerName = 'config'
var userAssignedIdentityName = 'configDeployer'
var roleAssignmentName = guid(resourceGroup().id, 'contributor')
var contributorRoleDefinitionId = resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')
var deploymentScriptName = 'CopyConfigScript'
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = {
name: storageAccountName
tags: {
displayName: storageAccountName
}
location: resourceGroup().location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
tier: 'Standard'
}
properties: {
allowBlobPublicAccess: true
encryption: {
services: {
blob: {
enabled: true
}
}
keySource: 'Microsoft.Storage'
}
supportsHttpsTrafficOnly: true
}
resource blobService 'blobServices' existing = {
name: 'default'
}
}
resource blobContainer 'Microsoft.Storage/storageAccounts/blobServices/containers@2019-04-01' = {
parent: storageAccount::blobService
name: storageBlobContainerName
properties: {
publicAccess: 'Blob'
}
}
resource userAssignedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2018-11-30' = {
name: userAssignedIdentityName
location: resourceGroup().location
}
resource roleAssignment 'Microsoft.Authorization/roleAssignments@2020-04-01-preview' = {
name: roleAssignmentName
properties: {
roleDefinitionId: contributorRoleDefinitionId
principalId: userAssignedIdentity.properties.principalId
principalType: 'ServicePrincipal'
}
}
resource deploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = {
name: deploymentScriptName
location: resourceGroup().location
kind: 'AzurePowerShell'
identity: {
type: 'UserAssigned'
userAssignedIdentities: {
'${userAssignedIdentity.id}': {}
}
}
properties: {
arguments: '-File \'${string(filesToCopy)}\''
environmentVariables: [
{
name: 'ResourceGroupName'
value: resourceGroup().name
}
{
name: 'StorageAccountName'
value: storageAccountName
}
{
name: 'StorageContainerName'
value: storageBlobContainerName
}
]
azPowerShellVersion: '3.0'
scriptContent: '''
param([string]$File)
$fileList = $File -replace '(\[|\])' -split ',' | ForEach-Object { $_.trim() }
$storageAccount = Get-AzStorageAccount -ResourceGroupName $env:ResourceGroupName -Name $env:StorageAccountName -Verbose
$count = 0
$DeploymentScriptOutputs = @{}
foreach ($fileName in $fileList) {
Write-Host "Copying $fileName to $env:StorageContainerName in $env:StorageAccountName."
Invoke-RestMethod -Uri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/$fileName" -OutFile $fileName
$blob = Set-AzStorageBlobContent -File $fileName -Container $env:StorageContainerName -Blob $fileName -Context $storageAccount.Context
$DeploymentScriptOutputs[$fileName] = @{}
$DeploymentScriptOutputs[$fileName]['Uri'] = $blob.ICloudBlob.Uri
$DeploymentScriptOutputs[$fileName]['StorageUri'] = $blob.ICloudBlob.StorageUri
$count++
}
Write-Host "Finished copying $count files."
'''
retentionInterval: 'P1D'
}
dependsOn: [
roleAssignment
blobContainer
]
}
output fileUri object = deploymentScript.properties.outputs
output storageAccountName string = storageAccountName
Jika tidak, salin contoh atau sesuaikan templat Anda agar sesuai dengan contoh.
Buat file parameter
Sekarang setelah Anda mendapatkan set templat, Anda dapat memvalidasi skrip penyebaran baru menggunakan file parameter dengan file baru yang ditentukan.
Buat file azuredeploy.parameters.json secara manual atau gunakan ekstensi Visual Studio Code untuk melakukannya.
Edit file untuk menentukan dua
filesToCopy:{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": { "filesToCopy": { "value": [ "swagger.Staging.json", "appsettings.Staging.json" ] } } }
Buat file azuredeploy.parameters.json .
Edit file untuk menentukan dua
filesToCopy:{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": { "filesToCopy": { "value": [ "swagger.Staging.json", "appsettings.Staging.json" ] } } }
Menyebarkan templat
Membuat grup sumber daya untuk latihan
Anda perlu membuat grup sumber daya untuk berisi sumber daya yang Anda buat sebagai bagian dari latihan ini. Dengan menggunakan grup sumber daya baru, Anda akan membuat proses pembersihan setelah latihan menjadi lebih mudah.
Dari terminal di Visual Studio Code, jalankan perintah ini untuk membuat grup sumber daya untuk latihan ini.
resourceGroupName="learndeploymentscript_exercise_2"
az group create --location eastus --name $resourceGroupName
$resourceGroupName = 'learndeploymentscript_exercise_2'
New-AzResourceGroup -Location eastus -Name $resourceGroupName
Menyebarkan templat ke Azure
Menerapkan templat menggunakan perintah Azure CLI di terminal Visual Studio Code.
templateFile="azuredeploy.json"
templateParameterFile="azuredeploy.parameters.json"
today=$(date +"%d-%b-%Y")
deploymentName="deploymentscript-"$today
az deployment group create \
--resource-group $resourceGroupName \
--name $deploymentName \
--template-file $templateFile \
--parameters $templateParameterFile
Menyebarkan templat ke Azure
Menyebarkan templat menggunakan perintah Azure PowerShell di terminal.
$templateFile = 'azuredeploy.json'
$templateParameterFile = 'azuredeploy.parameters.json'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "deploymentscript-$today"
New-AzResourceGroupDeployment `
-ResourceGroupName $resourceGroupName `
-Name $deploymentName `
-TemplateFile $templateFile `
-TemplateParameterFile $templateParameterFile
Menyebarkan templat ke Azure
Menerapkan templat menggunakan perintah Azure CLI di terminal Visual Studio Code.
templateFile="main.bicep"
templateParameterFile="azuredeploy.parameters.json"
today=$(date +"%d-%b-%Y")
deploymentName="deploymentscript-"$today
az deployment group create \
--resource-group $resourceGroupName \
--name $deploymentName \
--template-file $templateFile \
--parameters $templateParameterFile
Menyebarkan templat ke Azure
Menyebarkan templat menggunakan perintah Azure PowerShell di terminal.
$templateFile = 'main.bicep'
$templateParameterFile = 'azuredeploy.parameters.json'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "deploymentscript-$today"
New-AzResourceGroupDeployment `
-ResourceGroupName $resourceGroupName `
-Name $deploymentName `
-TemplateFile $templateFile `
-TemplateParameterFile $templateParameterFile
Tinjau hasil templat Anda
Setelah penyebaran selesai, Anda dapat memvalidasi bahwa kedua file disalin ke akun penyimpanan Anda dengan mencantumkan isi kontainer blob.
Daftar isi kontainer blob.
storageAccountName=$(az deployment group show --resource-group $resourceGroupName --name $deploymentName --query 'properties.outputs.storageAccountName.value' --output tsv) az storage blob list --account-name $storageAccountName --container-name config --query '[].name'Perintah mengembalikan kode berikut:
[ "swagger.Staging.json", "appsettings.Staging.json" ]Anda juga dapat meninjau log (dan detail lain tentang penyebaran) dari portal Microsoft Azure, atau dengan menggunakan perintah berikut.
az deployment-scripts show-log --resource-group $resourceGroupName --name CopyConfigScript
Daftar isi kontainer blob.
$storageAccountName = (Get-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName -Name $deploymentName).Outputs.storageAccountName.Value $storageAccount = Get-AzStorageAccount -ResourceGroupName $resourceGroupName Get-AzStorageBlob -Context $storageAccount.Context -Container config | Select-Object NamePerintah mengembalikan kode berikut:
Name ---- swagger.Staging.json appsettings.Staging.jsonAnda juga dapat meninjau log (dan detail lain tentang penyebaran) dari portal Microsoft Azure, atau dengan menggunakan perintah berikut.
Get-AzDeploymentScriptLog -ResourceGroupName $resourceGroupName -Name CopyConfigScript
Bersihkan grup sumber daya
Selamat! Anda berhasil menyebarkan templat ARM dengan skrip penyebaran dan menggunakan metode yang berbeda untuk meneruskan data untuk menyesuaikan perilakunya. Anda dapat menghapus grup sumber daya yang berisi semua sumber daya dan penetapan peran yang Anda buat.
az group delete --name $resourceGroupName
Remove-AzResourceGroup -Name $resourceGroupName