توفير جهاز ظاهري Linux باستخدام Bicep

مكتمل

العنصر الأساسي لقالب Bicep هو المورد، الذي يعين مورد Azure. يحتوي كل مورد على مجموعة من الخصائص العامة وخصائص خاصة بالموارد. على سبيل المثال، يصف القالب المستخدم في المثال التالي شبكة Azure الظاهرية. في حين أن خصائص الاسم والموقع عامة، addressPrefix فإنهما خاصان بالموارد. Microsoft.Network/virtualNetworks@2021-05-01 تعين السلسلة الموجودة بجانب المورد إصدار API الخاص به، ويمثل virtualNetwork الإدخال اسمه الرمزي، والذي يوفر طريقة للإشارة إلى المورد داخل القالب.

بالإضافة إلى عنصر المورد، يتضمن نموذج القالب التالي أيضا عنصر معلمة يمكنك من تعيين اسم للشبكة الظاهرية أثناء النشر. إذا لم تقم بتعيين اسم في ذلك الوقت، يتم تطبيق القيمة الافتراضية بدلا من lnx-bcp-vnet ذلك. عنصر الوصف هو مثال على مصمم الديكور، كما هو موضح بالحرف البادئة @ . الغرض منه هو وصف دور المعلمة، ويظهر إخراجها بجانب مربع نص المعلمة عند استخدام مدخل Microsoft Azure لمراجعة قالب Azure Resource Manager المطابق أو توزيعه. استخدم مثال التعليمات البرمجية التالي لتوفير جهاز ظاهري يعمل بنظام Linux باستخدام Bicep:

@description('Name of the virtual network')
param virtualNetworkName string = 'lnx-bcp-vnet'

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2021-05-01' = {
  name: virtualNetworkName
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: [
        addressPrefix
      ]
    }
  }
}

توزيع جهاز Linux الظاهري باستخدام قوالب Bicep

يتضمن العمل مع Bicep تأليف القوالب ونشرها. لتبسيط تجربة التأليف وتحسينها، استخدم Visual Studio Code مع ملحق Bicep. يدعم الملحق نفسه أيضا عمليات النشر المستندة إلى Bicep. إذا كنت تفضل تشغيل توزيع من سطر أوامر أو كجزء من مهمة مبرمجة نصيا، يمكنك تثبيت Bicep CLI واستخدامه كأداة مساعدة مستقلة أو استخدامه مباشرة من داخل جلسة عمل Azure CLI. يقوم Azure CLI بتثبيت Bicep CLI تلقائيا أثناء الاستدعاء الأول لأي az bicep أمر. ومع ذلك، لإجراء تثبيت يدوي ل Bicep، قم بتشغيل az bicep install.

بشكل فعال، تتضمن عملية توفير جهاز Azure ظاهري يعمل بنظام Linux باستخدام Bicep عادة التسلسل التالي من الخطوات عالية المستوى:

  • تحديد صورة جهاز ظاهري مناسبة.
  • تحديد حجم الجهاز الظاهري المناسب.
  • تأليف قالب Bicep.
  • بدء نشر قالب Bicep.

عند نشر قوالب Bicep، تقوم مهمة يشار إليها باسم التحويل تلقائيا بتحويلها إلى قوالب Azure Resource Manager مكافئة. يمكنك أيضا إجراء تحويل بين تنسيقات Bicep وAzure Resource Manager عن طريق تشغيل bicep build الأمرين و bicep decompile ، على التوالي.

لتحديد صورة الجهاز الظاهري المناسب وحجمه، اتبع الخطوات الموضحة في الوحدات السابقة من هذه الوحدة النمطية. تركز هذه الوحدة على المهام الخاصة ب Bicep.

تأليف قالب Bicep

لتأليف قالب Bicep، ابدأ بتشغيل جلسة عمل Visual Studio Code مع تثبيت ملحق Bicep. بعد ذلك، قم بإنشاء ملف باسم main.bicep. أضف المحتوى التالي إلى الملف، ثم احفظ التغيير:

إشعار

أسماء الملفات التي تختارها لملفات Bicep الخاصة بك عشوائية، على الرغم من أنه من الممارسات الجيدة اختيار اسم يعكس محتوى الملف أو الغرض منه، ويجب عليك استخدام ".bicep" لملحق الملف.

@description('The name of your virtual machine')
param vmName string = 'lnx-bcp-vm'

@description('Username for the virtual machine')
param adminUsername string

@description('Type of authentication to use on the virtual machine')
@allowed([
  'sshPublicKey'
  'password'
])
param authenticationType string = 'password'

@description('SSH Key or password for the virtual machine')
@secure()
param adminPasswordOrKey string

@description('Unique DNS Name for the Public IP used to access the virtual machine')
param dnsLabelPrefix string = toLower('${vmName}-${uniqueString(resourceGroup().id)}')

@description('The allowed Linux distribution and version for the VM')
@allowed([
  'Ubuntu-2204'
])
param ubuntuOSVersion string = 'Ubuntu-2204'

@description('Location for all resources')
param location string = resourceGroup().location

@description('The size of the VM')
param vmSize string = 'Standard_F4s'

@description('Name of the virtual network')
param virtualNetworkName string = 'lnx-bcp-vnet'

@description('Name of the subnet in the virtual network')
param subnetName string = 'subnet0'

@description('Name of the network security group')
param networkSecurityGroupName string = 'lnx-bcp-nsg'

var imageReference = {
  'Ubuntu-2204': {
    publisher: 'Canonical'
    offer: '0001-com-ubuntu-server-jammy'
    sku: '22_04-lts-gen2'
    version: 'latest'
  }
}
var publicIPAddressName = '${vmName}-pip'
var networkInterfaceName = '${vmName}-nic'
var osDiskType = 'Standard_LRS'
var subnetAddressPrefix = '10.3.0.0/24'
var addressPrefix = '10.3.0.0/16'
var linuxConfiguration = {
  disablePasswordAuthentication: true
  ssh: {
    publicKeys: [
      {
        path: '/home/${adminUsername}/.ssh/authorized_keys'
        keyData: adminPasswordOrKey
      }
    ]
  }
}

resource networkInterface 'Microsoft.Network/networkInterfaces@2021-05-01' = {
  name: networkInterfaceName
  location: location
  properties: {
    ipConfigurations: [
      {
        name: 'ipconfig1'
        properties: {
          subnet: {
            id: subnet.id
          }
          privateIPAllocationMethod: 'Dynamic'
          publicIPAddress: {
            id: publicIPAddress.id
          }
        }
      }
    ]
    networkSecurityGroup: {
      id: networkSecurityGroup.id
    }
  }
}

resource networkSecurityGroup 'Microsoft.Network/networkSecurityGroups@2021-05-01' = {
  name: networkSecurityGroupName
  location: location
  properties: {
    securityRules: [
      {
        name: 'ssh'
        properties: {
          priority: 1000
          protocol: 'Tcp'
          access: 'Allow'
          direction: 'Inbound'
          sourceAddressPrefix: '*'
          sourcePortRange: '*'
          destinationAddressPrefix: '*'
          destinationPortRange: '22'
        }
      }
    ]
  }
}

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2021-05-01' = {
  name: virtualNetworkName
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: [
        addressPrefix
      ]
    }
  }
}

resource subnet 'Microsoft.Network/virtualNetworks/subnets@2021-05-01' = {
  parent: virtualNetwork
  name: subnetName
  properties: {
    addressPrefix: subnetAddressPrefix
    privateEndpointNetworkPolicies: 'Enabled'
    privateLinkServiceNetworkPolicies: 'Enabled'
  }
}

resource publicIPAddress 'Microsoft.Network/publicIPAddresses@2021-05-01' = {
  name: publicIPAddressName
  location: location
  sku: {
    name: 'Basic'
  }
  properties: {
    publicIPAllocationMethod: 'Dynamic'
    publicIPAddressVersion: 'IPv4'
    dnsSettings: {
      domainNameLabel: dnsLabelPrefix
    }
    idleTimeoutInMinutes: 4
  }
}

resource vm 'Microsoft.Compute/virtualMachines@2021-11-01' = {
  name: vmName
  location: location
  properties: {
    hardwareProfile: {
      vmSize: vmSize
    }
    storageProfile: {
      osDisk: {
        createOption: 'FromImage'
        managedDisk: {
          storageAccountType: osDiskType
        }
      }
      imageReference: imageReference[ubuntuOSVersion]
    }
    networkProfile: {
      networkInterfaces: [
        {
          id: networkInterface.id
        }
      ]
    }
    osProfile: {
      computerName: vmName
      adminUsername: adminUsername
      adminPassword: adminPasswordOrKey
      linuxConfiguration: ((authenticationType == 'password') ? null : linuxConfiguration)
    }
    securityProfile: json('null')
  }
}

output adminUsername string = adminUsername
output fqdn string = publicIPAddress.properties.dnsSettings.fqdn
output sshCommand string = 'ssh ${adminUsername}@${publicIPAddress.properties.dnsSettings.fqdn}'

إشعار

يستند هذا القالب إلى محتوى GitHub repo Azure Quickstart Templates.

بدء نشر قالب Bicep

بعد حفظ الملف main.bicep ، يمكنك متابعة النشر المستند إلى القالب. أولا، قم بتشغيل جلسة Azure CLI على الكمبيوتر المحلي، ثم قم بتشغيل az login للمصادقة. ستحتاج إلى توفير بيانات اعتماد مستخدم بامتيازات كافية لتوفير الموارد في اشتراك Azure الخاص بك. بعد ذلك، قم بتغيير الدليل الحالي إلى الدليل حيث يوجد الملف main.bicep . بدلا من ذلك، يمكنك بدء جلسة عمل Azure Cloud Shell Bash وتحميل هذا الملف في الدليل الرئيسي داخل بيئة Azure Cloud Shell.

بعد ذلك، قم بتشغيل الأمر التالي من جلسة عمل Azure CLI مصادق عليها لإنشاء مجموعة موارد، والتي ستحتوي على جميع الموارد التي تعد جزءا من النشر اللاحق:

az group create --name rg-lnx-bcp --location eastus

قبل المتابعة، قد تحتاج إلى التأكد من أنك تستخدم أحدث إصدار من Bicep CLI عن طريق تشغيل الأمر التالي:

az bicep upgrade

وأخيرا، ابدأ النشر عن طريق تشغيل الأمر التالي:

az deployment group create --resource-group rg-lnx-bcp --template-file main.bicep --parameters adminUsername=azureuser

إشعار

يتضمن --parameters هذا الأمر مفتاح التبديل، الذي يعين في هذه الحالة اسم المسؤول المحلي لجهاز Azure الظاهري الذي تقوم بنشره. يطالبك Azure CLI بتوفير كلمة المرور المقابلة لأنه لم يتم تعيين القيمة الافتراضية للمعلمة adminPasswordOrKey .

يجب أن يبدأ تشغيل Azure VM قريبا، عادة في غضون بضع دقائق. للاتصال به، حدد اسم المجال المؤهل بالكامل (FQDN) المرتبط بواجهة الشبكة الخاصة به من خلال مراجعة الإخراج الذي ينشئه التوزيع. بدلا من ذلك، يمكنك استخدام shCommand القيمة. عند المطالبة، قم بتوفير كلمة المرور المعينة حديثا للمصادقة عند إنشاء اتصال SSH.

في حالة عدم تسجيل قيم إخراج توزيع Bicep، يمكنك عرضها مرة أخرى عن طريق تشغيل الأمر التالي:

az deployment group show \
  --resource-group rg-lnx-bcp \
  --name main \
  --query properties.outputs

يجب أن يشبه الإخراج المنسق JSON المحتوى التالي:

{
  "adminUsername": {
    "type": "String",
    "value": "azureuser"
  },
  "fqdn": {
    "type": "String",
    "value": "lnx-bcp-vm-example.eastus.cloudapp.azure.com"
  },
  "sshCommand": {
    "type": "String",
    "value": "ssh azureuser@lnx-bcp-vm-example.eastus.cloudapp.azure.com"
  }
}