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 telah 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 akan mengambil template sebelumnya sebagai titik awal dan memperbarui skrip PowerShell untuk menggunakan salah satu dari tim mitra Anda. Kemudian, Anda akan menambahkan cara untuk mengaktifkan orang yang menyebarkan templat untuk menentukan file konfigurasi apa yang akan disebarkan (satu atau lebih).
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": "2019-06-01", "tags": { "displayName": "[variables('storageAccountName')]" }, "location": "[resourceGroup().location]", "kind": "StorageV2", "sku": { "name": "Standard_LRS", "tier": "Standard" }, "properties": { "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@2019-06-01' = { name: storageAccountName tags: { displayName: storageAccountName } location: resourceGroup().location kind: 'StorageV2' sku: { name: 'Standard_LRS' tier: 'Standard' } properties: { 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.Uri
Simpan templat.
Perbarui skrip PowerShell
Karena tim lain telah melakukan usaha dalam membuat skrip PowerShell untuk menyalin beberapa file, Anda memutuskan untuk menggunakan skrip itu di templat Anda.
Edit scriptContent
di bagian properties
untuk menyertakan skrip yang telah 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 akan lebih fleksibel untuk menggunakan fungsi templat untuk mendapatkan beberapa nilai.
Menambahkan properti
environmentVariables
ke bagianproperties
skrip 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')]" } ],
Tip
Gunakan fungsi templat untuk mengakses nilai umum seperti [resourceGroup().name]
dan [variables()]
.
Skrip yang Anda adopsi memerlukan beberapa variabel lingkungan. Anda dapat menentukannya langsung dalam templat, tetapi akan lebih fleksibel untuk menggunakan variabel Bicep untuk mendapatkan beberapa nilai.
Menambahkan properti
environmentVariables
ke bagianproperties
skrip 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 akan terus berfungsi untuk tim Anda tanpa perubahan pada proses penyebaran. Meskipun tidak diperlukan, memasukkan nilai default baru dapat membantu Anda memahami pola mempermudah tim untuk mengadopsi versi templat baru jika mereka terus bertingkah seperti yang telah mereka lakukan sebelumnya, dengan fungsionalitas baru menjadi hadiah. 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 akan terus berfungsi untuk tim Anda tanpa perubahan pada proses penyebaran. Meskipun tidak diperlukan, memasukkan nilai default baru dapat membantu Anda memahami pola mempermudah tim untuk mengadopsi versi templat baru jika mereka terus bertingkah seperti yang telah mereka lakukan sebelumnya, dengan fungsionalitas baru menjadi hadiah. 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 baru saja Anda tentukan 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.
Tip
Gunakan fungsi templat untuk mengakses fungsi umum seperti [string()]
untuk mengubah nilai dari satu tipe menjadi string.
Menambahkan properti
arguments
ke bagian skrip penyebaran. Skrip PowerShell mengambil parameter bernamaFile
, yang merupakan string nama file yang harus berasal darifilesToCopy
parameter templat. Pastikan ada tanda kutip di sekitar seluruh argumen sehingga akan diteruskan dengan benar.Perhatian
Properti
arguments
ini 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')), ''' )]",
Tip
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 properti
arguments
dengan variabel yang baru saja Anda tentukan."arguments": "[concat( '-File ', variables('singleQuote'), string(parameters('filesToCopy')), variables('singleQuote'))]",
Selanjutnya, Anda dapat mengambil parameter yang baru saja Anda tentukan 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 mengonversifilesToCopy
array 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
outputs
di templat untuk mengembalikan seluruh objek, yang akan memiliki URI per 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 akan menggunakan ini nanti untuk memvalidasi bahwa skrip penyebaran melakukan apa 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 di templat untuk mengembalikan seluruh objek, yang akan memiliki URI per file.
output fileUri object = deploymentScript.properties.outputs
Tambahkan output lain dengan nama akun penyimpanan (yang memiliki pengidentifikasi acak). Anda akan menggunakan ini nanti untuk memvalidasi bahwa skrip penyebaran melakukan apa 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": "2019-06-01",
"tags": {
"displayName": "[variables('storageAccountName')]"
},
"location": "[resourceGroup().location]",
"kind": "StorageV2",
"sku": {
"name": "Standard_LRS",
"tier": "Standard"
},
"properties": {
"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@2019-06-01' = {
name: storageAccountName
tags: {
displayName: storageAccountName
}
location: resourceGroup().location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
tier: 'Standard'
}
properties: {
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.
Antara 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 menampung sumber daya yang akan Anda buat sebagai bagian dari latihan ini. Dengan menggunakan grup sumber daya baru, pembersihan setelah latihan menjadi jauh 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 Name
Perintah mengembalikan kode berikut:
Name ---- 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.
Get-AzDeploymentScriptLog -ResourceGroupName $resourceGroupName -Name CopyConfigScript
Bersihkan grup sumber daya
Anda berhasil menerapkan templat ARM dengan skrip penyebaran dan menggunakan beragam metode untuk meneruskan data untuk mengkustomisasi perilakunya. Anda dapat menghapus grup sumber daya yang berisi semua sumber daya dan penetapan peran yang telah Anda buat.
az group delete --name $resourceGroupName
Remove-AzResourceGroup -Name $resourceGroupName