تمرين - إضافة برنامج نصي للتوزيع إلى قالب ARM
هام
تحتاج إلى اشتراك Azure الخاص بك لتشغيل هذا التمرين، وقد تتكبد رسوماً. إذا لم يكن لديك بالفعل اشتراك Azure، فأنشئ حساباً مجانياً قبل أن تبدأ.
كجزء من عملية نشر التطبيق لفريقك، تحتاج إلى إنشاء حساب تخزين وإعداد ملف في تخزين كائن ثنائي كبير الحجم حتى يقرأ التطبيق. حتى هذه اللحظة، كنت تقوم بنسخ الملف يدويًا في كل مرة يتم فيها إعداد بيئة جديدة. قررت استخدام برنامج نصي للتوزيع لأتمتة هذه الخطوة كجزء من عملية إنشاء البيئة الخاصة بك.
في هذا التمرين، سوف تأخذ قالب Azure Resource Manager الحالي وتضيف برنامجًا نصيًا جديدًا للتوزيع.
أثناء العملية، ستقوم بما يلي:
- إنشاء قالب بدء.
- قم بإضافة المتطلبات الأساسية للنصوص البرمجية للتوزيع، بما في ذلك الهوية المُدارة التي يقوم المستخدم بتعيينها وتعيين الدور.
- قم بإضافة برنامج نصي للتوزيع.
- انشر القالب وتحقق من النتيجة.
يستخدم هذا التمرين أدوات Azure Resource Manager ل Visual Studio Code. تأكد من تثبيت هذا الملحق في التعليمة البرمجية لـ Visual Studio.
يستخدم هذا التمرين ملحق Bicep لـ Visual Studio Code. تأكد من تثبيت هذا الملحق في التعليمة البرمجية لـ Visual Studio.
إنشاء قالب البدء
ستبدأ بقالب موجود يستخدمه فريقك. ينشئ القالب حساب التخزين، ويقوم بإعداد خدمات blob ويتطلب HTTPS، وينشئ حاوية البيانات الثنائية الكبيرة لملفات التكوين.
فتح Visual Studio Code.
أنشئ ملفاً جديداً يسمى azuredeploy.json.
احفظ الملف الفارغ بحيث يتمكن Visual Studio Code من تحميل أدوات قالب ARM.
يمكنك إما تحديد File>Save As، أو تحديد Ctrl+S في Windows (⌘+S في macOS). تأكد من تذكر المكان الذي حفظت فيه الملف. على سبيل المثال، قد تحتاج إلى إنشاء مجلد البرامج النصية لحفظه فيه.
انسخ قالب البداية التالي إلى 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" }, "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" } } ] }
حفظ القالب.
فتح Visual Studio Code.
قم بإنشاء ملف جديد يسمى main.bicep.
احفظ الملف الفارغ بحيث يقوم Visual Studio Code بتحميل أدوات Bicep.
يمكنك إما تحديد File>Save As، أو تحديد Ctrl+S في Windows (⌘+S في macOS). تأكد من تذكر المكان الذي حفظت فيه الملف. على سبيل المثال، قد ترغب في إنشاء مجلد للبرامج النصية لحفظ الملف به.
انسخ قالب البداية التالي إلى main.bicep.
var storageAccountName = 'storage${uniqueString(resourceGroup().id)}' var storageBlobContainerName = 'config' 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' } }
حفظ القالب.
إضافة الهوية المُدارة التي يعيّنها المُستخدم
بعد ذلك، تحتاج إلى إنشاء هوية مدارة مُعينة من قبل المستخدم. بالنظر إلى نهج البنية الأساسية كتعليمة برمجية، يمكنك إنشاء الهوية في القالب.
قم بتحرير القسم
variables
من azuredeploy.json لتضمين ما يلي:"userAssignedIdentityName": "configDeployer",
قم بتحرير القسم
resources
من azuredeploy.json لتضمين ما يلي:{ "type": "Microsoft.ManagedIdentity/userAssignedIdentities", "apiVersion": "2018-11-30", "name": "[variables('userAssignedIdentityName')]", "location": "[resourceGroup().location]" }
حفظ القالب.
ضمن تعريفات المتغير في main.bicep، أضف التالي:
var userAssignedIdentityName = 'configDeployer'
ضمن تعريفات الموارد، أضف:
resource userAssignedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2018-11-30' = { name: userAssignedIdentityName location: resourceGroup().location }
حفظ القالب.
تعيين دور المساهم للهوية المدارة
الآن، بعد أن تم تعريف هوية مدارة، يمكنك تعيين دور له حقوق لمجموعة الموارد. ستقوم بتعيين دور المساهم. يمكنك تحديد دور بواسطة معرف تعريف الدور الخاص به، وهو معرّف فريد عمومي. يتم تضمين دور المساهم في Azure بحيث يتم توثيق معرف تعريف الدور.
يحتاج تعيين الدور أيضًا إلى اسم المعرّف الفريد العمومي. يمكنك استخدام الدالة guid
لإنشاء معرّف فريد عمومي لمجموعة الموارد واسم الدور.
قم بتحرير القسم
variables
من azuredeploy.json لتضمين ما يلي:"roleAssignmentName": "[guid(concat(resourceGroup().id, 'contributor'))]", "contributorRoleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
قم بتحرير القسم
resources
من azuredeploy.json لتضمين ما يلي:{ "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" } }
حفظ القالب.
ضمن تعريفات المتغير في main.bicep، أضف التالي:
var roleAssignmentName = guid(resourceGroup().id, 'contributor') var contributorRoleDefinitionId = resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')
ضمن تعريفات الموارد، أضف:
resource roleAssignment 'Microsoft.Authorization/roleAssignments@2020-04-01-preview' = { name: roleAssignmentName properties: { roleDefinitionId: contributorRoleDefinitionId principalId: userAssignedIdentity.properties.principalId principalType: 'ServicePrincipal' } }
حفظ القالب.
إنشاء البرنامج النصي للتوزيع
الآن، لديك كافة المتطلبات الأساسية للبرنامج النصي للتوزيع. ستبدأ بالقيم الشائعة التي يحتاجها برنامج التوزيع النصي. هناك نوعان من التبعيات، تعيين الدور وحاوية تخزين البيانات الثنائية الكبيرة. يحتاج البرنامج النصي الخاص بك إلى وجود هذين النوعين قبل تشغيله.
قم بتحرير القسم
variables
من azuredeploy.json لتضمين ما يلي:"deploymentScriptName": "CopyConfigScript"
قم بتحرير القسم
resources
من azuredeploy.json لتضمين ما يلي:{ "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
إلى المورد لتعريف البرنامج النصي والقيم الأخرى المطلوبة."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" }
حفظ القالب.
ضمن تعريفات المتغير في main.bicep، أضف التالي:
var deploymentScriptName = 'CopyConfigScript'
ضمن تعريفات الموارد، أضف:
resource deploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = { name: deploymentScriptName location: resourceGroup().location kind: 'AzurePowerShell' identity: { type: 'UserAssigned' userAssignedIdentities: { '${userAssignedIdentity.id}': {} } } dependsOn: [ roleAssignment blobContainer ] }
أضف قسم
properties
إلى المورد لتعريف البرنامج النصي والقيم الأخرى المطلوبة.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' }
حفظ القالب.
إضافة إخراج قالب
الآن، بعد أن أصبح لديك برنامج نصي للتوزيع، يقوم بتحميل ملف إلى تخزين Azure Blob، قد تحتاج إلى الرجوع إلى موقع الملف هذا في التشغيل التلقائي اللاحق. (ربما ستجري اختبارًا للتحقق من أن الملف في المكان الذي تعتقد أنه يجب أن يكون فيه.)
بعد قسم resources
من قالب ARM، أضف ناتجًا يشير إلى URI للملف كما ورد في البرنامج النصي للتوزيع.
"outputs": {
"fileUri": {
"type": "string",
"value": "[reference(variables('deploymentScriptName')).outputs.Uri]"
}
}
في الجزء السفلي من الملف، بعد تعريفات الموارد، أضف إخراجًا يشير إلى URI للملف كما تم الإبلاغ عنه بواسطة البرنامج النصي للتوزيع.
output fileUri string = deploymentScript.properties.outputs.Uri
التحقق من القالب
يجب أن يبدو النموذج الخاص بك كما يلي:
{
"$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]"
}
}
}
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
إذا لم يحدث ذلك، إما أن تنسخ المثال أو تضبط القالب لمطابقة المثال.
نشر القالب
لنشر هذا القالب إلى Azure، تحتاج إلى تسجيل الدخول إلى حساب Azure الخاص بك من محطة Visual Studio Code. تأكد من تثبيت أدوات Azure CLI .
في القائمة المحطة الطرفية، حدد محطة طرفية جديدة. عادة ما تفتح نافذة المحطة الطرفية في النصف السفلي من الشاشة.
إذا كانت القشرة الموضحة على الجانب الأيمن من نافذة المحطة الطرفية هي bash، فإن shell الصحيح مفتوح ويمكنك التخطي إلى القسم التالي.
إذا ظهرت shell بخلاف bash ، فحدد سهم القائمة المنسدلة shell، ثم حدد Git Bash.
في قائمة الأصداف الطرفية، حدد bash.
في المحطة الطرفية، اذهب إلى الدليل حيث قمت بحفظ القالب الخاص بك. على سبيل المثال، إذا حفظت قالبك في مجلد قوالب، يمكنك استخدام هذا الأمر:
cd templates
تسجيل الدخول إلى Azure باستخدام Azure CLI
في محطة Visual Studio Code الطرفية، قم بتسجيل الدخول إلى Azure عن طريق تشغيل الأمر التالي:
az login
في المتصفح الذي يفتح، سجل الدخول إلى حسابك في Azure.
تعرض المحطة الطرفية لـ Visual Studio Code قائمة الاشتراكات المقترنة بهذا الحساب.
في القائمة، ابحث عن الاشتراك الذي تريد استخدامه لهذا التمرين.
إذا فاتتك القائمة من تسجيل الدخول، يمكنك استخدام قصاصة برمجية تالية لعرض الاشتراكات مرة أخرى.
az account list --output table
قم بتعيين الاشتراك الافتراضي لجميع أوامر Azure CLI التي تقوم بتشغيلها في جلسة العمل هذه.
az account set --subscription "Your Subscription Name or ID"
لنشر هذا القالب إلى Azure، تحتاج إلى تسجيل الدخول إلى حساب Azure الخاص بك من محطة Visual Studio Code. تأكد من تثبيت أدوات Azure CLI .
في القائمة المحطة الطرفية، حدد محطة طرفية جديدة. عادة ما تفتح نافذة المحطة الطرفية في النصف السفلي من الشاشة.
إذا كانت القشرة الموضحة على الجانب الأيمن من نافذة المحطة الطرفية هي bash، فإن shell الصحيح مفتوح ويمكنك التخطي إلى القسم التالي.
إذا ظهرت shell بخلاف bash ، فحدد سهم القائمة المنسدلة shell، ثم حدد Git Bash.
في قائمة الأصداف الطرفية، حدد bash.
في المحطة الطرفية، اذهب إلى الدليل حيث قمت بحفظ القالب الخاص بك. على سبيل المثال، إذا حفظت قالبك في مجلد قوالب، يمكنك استخدام هذا الأمر:
cd templates
تثبيت Bicep
قم بتشغيل الأمر التالي للتأكد من أن لديك أحدث إصدار من Bicep:
az bicep install && az bicep upgrade
تسجيل الدخول إلى Azure باستخدام Azure CLI
في محطة Visual Studio Code الطرفية، قم بتسجيل الدخول إلى Azure عن طريق تشغيل الأمر التالي:
az login
في المتصفح الذي يفتح، سجل الدخول إلى حسابك في Azure.
تعرض المحطة الطرفية لـ Visual Studio Code قائمة الاشتراكات المقترنة بهذا الحساب.
في القائمة، ابحث عن الاشتراك الذي تريد استخدامه لهذا التمرين.
إذا فاتتك القائمة من تسجيل الدخول، يمكنك استخدام قصاصة برمجية تالية لعرض الاشتراكات مرة أخرى.
az account list --output table
قم بتعيين الاشتراك الافتراضي لجميع أوامر Azure CLI التي تقوم بتشغيلها في جلسة العمل هذه.
az account set --subscription "Your Subscription Name or ID"
لتوزيع هذا القالب إلى Azure، قم بتسجيل الدخول إلى حساب Azure الخاص بك من المحطة الطرفية لـ Visual Studio Code. تأكد من تثبيت Azure PowerShell، وسجّل الدخول إلى الحساب نفسه الذي قام بتنشيط بيئة الاختبار المعزولة.
في القائمة المحطة الطرفية، حدد محطة طرفية جديدة. عادة ما تفتح نافذة المحطة الطرفية في النصف السفلي من الشاشة.
إذا كانت shell المعروضة على الجانب الأيمن من نافذة المحطة الطرفية powershell أو pwsh، فإن shell الصحيح مفتوح، ويمكنك التخطي إلى القسم التالي.
إذا ظهرت shell بخلاف powershell أو pwsh ، فحدد سهم shell المنسدلة، ثم حدد PowerShell.
في قائمة shell الطرفية، حدد powershell أو pwsh.
في المحطة الطرفية، اذهب إلى الدليل حيث قمت بحفظ القالب الخاص بك. على سبيل المثال، إذا حفظت قالبك في مجلد قوالب، يمكنك استخدام هذا الأمر:
Set-Location -Path templates
تسجيل الدخول إلى Azure باستخدام Azure PowerShell
في محطة Visual Studio Code الطرفية، قم بتسجيل الدخول إلى Azure عن طريق تشغيل الأمر التالي:
Connect-AzAccount
في المتصفح الذي يفتح، سجل الدخول إلى حسابك في Azure.
احصل على معرّف الاشتراك الذي تريد استخدامه لهذا التمرين عن طريق تشغيل الأمر التالي:
Get-AzSubscription
يقع مُعرِّف الاشتراك في العمود الثاني. انسخ العمود الثاني. يبدو شيئا مثل cf49fbbc-217c-4eb6-9eb5-a6a6c68295a0.
قم بتعيين الاشتراك الافتراضي لجميع أوامر Azure PowerShell التي تقوم بتشغيلها في جلسة العمل هذه.
Set-AzContext -SubscriptionId {Your subscription ID}
لتوزيع هذا القالب إلى Azure، قم بتسجيل الدخول إلى حساب Azure الخاص بك من المحطة الطرفية لـ Visual Studio Code. تأكد من تثبيت Azure PowerShell.
في القائمة المحطة الطرفية، حدد محطة طرفية جديدة. عادة ما تفتح نافذة المحطة الطرفية في النصف السفلي من الشاشة.
إذا كانت shell المعروضة على الجانب الأيمن من نافذة المحطة الطرفية powershell أو pwsh، فإن shell الصحيح مفتوح، ويمكنك التخطي إلى القسم التالي.
إذا ظهرت shell بخلاف powershell أو pwsh ، فحدد سهم shell المنسدلة، ثم حدد PowerShell.
في قائمة shell الطرفية، حدد powershell أو pwsh.
في المحطة الطرفية، اذهب إلى الدليل حيث قمت بحفظ القالب الخاص بك. على سبيل المثال، إذا حفظت قالبك في مجلد قوالب، يمكنك استخدام هذا الأمر:
Set-Location -Path templates
تثبيت Bicep CLI
لاستخدام Bicep من Azure PowerShell، ثبّت Bicep CLI.
تسجيل الدخول إلى Azure باستخدام Azure PowerShell
في محطة Visual Studio Code الطرفية، قم بتسجيل الدخول إلى Azure عن طريق تشغيل الأمر التالي:
Connect-AzAccount
في المتصفح الذي يفتح، سجل الدخول إلى حسابك في Azure.
احصل على معرّف الاشتراك الذي تريد استخدامه لهذا التمرين عن طريق تشغيل الأمر التالي:
Get-AzSubscription
يقع مُعرِّف الاشتراك في العمود الثاني. انسخ العمود الثاني. يبدو شيئا مثل cf49fbbc-217c-4eb6-9eb5-a6a6c68295a0.
قم بتعيين الاشتراك الافتراضي لجميع أوامر Azure PowerShell التي تقوم بتشغيلها في جلسة العمل هذه.
Set-AzContext -SubscriptionId {Your subscription ID}
بعد ذلك، تحتاج إلى إنشاء مجموعة موارد لاحتواء الموارد التي ستقوم بإنشائها كجزء من هذا التمرين. باستخدام مجموعة موارد جديدة، ستجعل عملية التنظيف بعد التمرين أمراً أسهل.
من الوحدة الطرفية في Visual Studio Code، قم بتشغيل هذا الأمر لإنشاء مجموعة الموارد لهذا التمرين:
إنشاء مجموعة موارد للتمرين
resourceGroupName="learndeploymentscript_exercise_1"
az group create --location eastus --name $resourceGroupName
$resourceGroupName = 'learndeploymentscript_exercise_1'
New-AzResourceGroup -Location eastus -Name $resourceGroupName
إشعار
إذا كنت تستخدم اسمًا مختلفًا لمجموعة الموارد، فستحتاج إلى التأكد من تحديث البرنامج النصي. لاحقا في هذه الوحدة النمطية، سترى كيفية تجنب أسماء مجموعة الموارد ذات الترميز المضمن في البرامج النصية الخاصة بك.
نشر القالب إلى Azure
تنشر التعليمات البرمجية التالية قالب ARM إلى Azure. سوف تشاهد توزيعًا ناجحًا.
نشر القالب باستخدام أوامر CLI Azure في محطة Visual Studio Code.
templateFile="azuredeploy.json"
today=$(date +"%d-%b-%Y")
deploymentName="deploymentscript-"$today
az deployment group create \
--resource-group $resourceGroupName \
--name $deploymentName \
--template-file $templateFile
تنشر التعليمات البرمجية التالية قالب ARM إلى Azure. سوف تشاهد توزيعًا ناجحًا.
نشر القالب باستخدام أوامر CLI Azure في محطة Visual Studio Code.
templateFile="main.bicep"
today=$(date +"%d-%b-%Y")
deploymentName="deploymentscript-"$today
az deployment group create \
--resource-group $resourceGroupName \
--name $deploymentName \
--template-file $templateFile
نشر التعليمات البرمجية التالية للقالب إلى Azure. سوف تشاهد توزيعًا ناجحًا.
نشر القالب باستخدام أوامر Azure PowerShell في الوحدة الطرفية.
$templateFile = 'azuredeploy.json'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "deploymentscript-$today"
New-AzResourceGroupDeployment `
-ResourceGroupName $resourceGroupName `
-Name $deploymentName `
-TemplateFile $templateFile
نشر التعليمات البرمجية التالية للقالب إلى Azure. سوف تشاهد توزيعًا ناجحًا.
نشر القالب باستخدام أوامر Azure PowerShell في الوحدة الطرفية.
$templateFile = 'main.bicep'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "deploymentscript-$today"
New-AzResourceGroupDeployment `
-ResourceGroupName $resourceGroupName `
-Name $deploymentName `
-TemplateFile $templateFile
مراجعة نتيجة القالب
بعد اكتمال التوزيع، سيتم منحك عنوان URL يشير إلى الملف الذي نسخه برنامج التوزيع البرمجي إلى تخزين كائن BLOB.
استرد هذا الملف باستخدام إخراج URL من توزيع القالب للتأكد من أن البرنامج النصي للتوزيع يعمل بشكل صحيح.
uri=$(az deployment group show --resource-group $resourceGroupName --name $deploymentName --query 'properties.outputs.fileUri.value' --output tsv) curl $uri
يقوم الأمر بإرجاع الرمز التالي.
{ "environment": "production", "hostname": "tailwindtraders.com", "Logging": { "LogLevel": { "Default": "Debug" } }, "ApplicationInsights": { "InstrumentationKey": "" }, "AllowedHosts": "*", "CosmosDb": { "Host": "", "Key": "", "Database": "Products" } }
يمكنك أيضًا مراجعة السجلات (والتفاصيل الأخرى حول التوزيع) من مدخل Azure أو باستخدام الأمر التالي.
az deployment-scripts show-log --resource-group $resourceGroupName --name CopyConfigScript
استرد هذا الملف باستخدام إخراج URL من توزيع القالب للتأكد من أن البرنامج النصي للتوزيع يعمل بشكل صحيح.
$fileUri = (Get-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName -Name $deploymentName).Outputs.fileUri.Value Invoke-RestMethod $fileUri
يقوم الأمر بإرجاع الرمز التالي.
environment : production hostname : tailwindtraders.com Logging : @{LogLevel=} ApplicationInsights : @{InstrumentationKey=} AllowedHosts : * CosmosDb : @{Host=; Key=; Database=Products}
يمكنك أيضًا مراجعة السجلات (والتفاصيل الأخرى حول التوزيع) من مدخل Azure أو باستخدام سطر الأوامر التالي.
Get-AzDeploymentScriptLog -ResourceGroupName $resourceGroupName -Name CopyConfigScript
تنظيف مجموعة الموارد
الآن، بعد أن قمت بنجاح بتوزيع قالب ARM مع برنامج نصي للتوزيع، يمكنك إزالة مجموعة الموارد التي تحتوي على كافة الموارد وتعيينات الدور التي قمت بإنشائها.
az group delete --name $resourceGroupName
Remove-AzResourceGroup -Name $resourceGroupName