Подготовка виртуальной машины Linux с помощью Bicep

Завершено

Основной элемент шаблона Bicep является ресурсом, который обозначает ресурс Azure. Каждый ресурс содержит набор универсальных и конкретных свойств ресурсов. Например, шаблон, используемый в следующем примере, описывает виртуальную сеть Azure. Хотя свойства имени и расположения являются универсальными, addressPrefix зависит от ресурса. Строка Microsoft.Network/virtualNetworks@2021-05-01 рядом с ресурсом обозначает свою версию API, а virtualNetwork запись представляет его символическое имя, которое предоставляет способ ссылки на ресурс в шаблоне.

Помимо элемента ресурса, следующий пример шаблона также включает элемент параметра, позволяющий назначить имя виртуальной сети во время развертывания. Если вы не назначите имя в то время, вместо этого применяется значение lnx-bcp-vnet по умолчанию. Элемент description является примером декоратора, как указано ведущим @ символом. Его цель — описать роль параметра, а выходные данные отображаются рядом с текстовым полем параметра при использовании портал 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 во время первого вызова любой az bicep команды. Однако для выполнения ручной установки Bicep выполните команду az bicep install.

Фактически процесс подготовки виртуальной машины Azure под управлением Linux с помощью Bicep обычно включает в себя следующую последовательность высокоуровневых шагов:

  • Определите подходящий образ виртуальной машины.
  • Определите подходящий размер виртуальной машины.
  • Создание шаблона Bicep.
  • Инициируйте развертывание шаблона Bicep.

При развертывании шаблонов Bicep задача, называемая транспилированием, автоматически преобразует их в эквивалентные шаблоны Azure Resource Manager. Вы также можете выполнить преобразование между форматами Bicep и Azure Resource Manager, выполнив bicep buildbicep 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 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, выполнив следующую команду:

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 должна начать работу в ближайшее время, как правило, в течение нескольких минут. Чтобы подключиться к нему, определите полное доменное имя (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"
  }
}