Een virtuele Linux-machine inrichten met Bicep

Voltooid

Het kernelement van een Bicep-sjabloon is een resource die een Azure-resource aanwijst. Elke resource bevat een set algemene en resourcespecifieke eigenschappen. De sjabloon die in het volgende voorbeeld wordt gebruikt, beschrijft bijvoorbeeld een virtueel Azure-netwerk. Hoewel de naam en locatie-eigenschappen algemeen zijn, addressPrefix is resourcespecifiek. De Microsoft.Network/virtualNetworks@2021-05-01 tekenreeks naast de resource wijst de API-versie aan en de vermelding vertegenwoordigt de virtualNetwork symbolische naam, die een manier biedt om te verwijzen naar de resource in de sjabloon.

Naast het resource-element bevat de volgende voorbeeldsjabloon ook een parameterelement waarmee u tijdens de implementatie een naam kunt toewijzen aan het virtuele netwerk. Als u op dat moment geen naam toewijst, is de standaardwaarde van lnx-bcp-vnet toepassing. Het beschrijvingselement is een voorbeeld van een decorator, zoals aangegeven door het voorloopteken @ . Het doel is om de rol van de parameter te beschrijven en de uitvoer wordt weergegeven naast het tekstvak van de parameter wanneer u Azure Portal gebruikt om de bijbehorende Azure Resource Manager-sjabloon te controleren of te implementeren. Gebruik het volgende codevoorbeeld om een Virtuele Linux-machine in te richten met 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
      ]
    }
  }
}

Een Virtuele Linux-machine implementeren met bicep-sjablonen

Het werken met Bicep omvat het ontwerpen en implementeren van sjablonen. Gebruik Visual Studio Code met de Bicep-extensie om de ontwerpervaring te vereenvoudigen en te verbeteren. Dezelfde extensie ondersteunt ook op Bicep gebaseerde implementaties. Als u liever een implementatie activeert vanaf een opdrachtregel of als onderdeel van een scripttaak, kunt u Bicep CLI installeren en gebruiken als zelfstandig hulpprogramma of rechtstreeks vanuit een Azure CLI-sessie. De Azure CLI installeert de Bicep CLI automatisch tijdens de eerste aanroep van een az bicep opdracht. Als u echter een handmatige installatie van Bicep wilt uitvoeren, voert u de opdracht uit az bicep install.

In feite omvat het inrichtingsproces van een Virtuele Azure-machine waarop Linux wordt uitgevoerd met Bicep doorgaans de volgende reeks stappen op hoog niveau:

  • Identificeer een geschikte VM-installatiekopieën.
  • Identificeer de geschikte VM-grootte.
  • Een Bicep-sjabloon maken.
  • Start de implementatie van de Bicep-sjabloon.

Wanneer u Bicep-sjablonen implementeert, worden deze automatisch geconverteerd naar gelijkwaardige Azure Resource Manager-sjablonen door een taak die wordt aangeduid als transpilatie. U kunt ook een conversie uitvoeren tussen de Bicep- en Azure Resource Manager-indelingen door respectievelijk de bicep build en bicep decompile opdrachten uit te voeren.

Als u de geschikte VM-installatiekopieën en -grootte wilt identificeren, volgt u de stappen die worden beschreven in de eerdere eenheden van deze module. Deze les is gericht op Bicep-specifieke taken.

Een Bicep-sjabloon maken

Als u een Bicep-sjabloon wilt maken, start u eerst een Visual Studio Code-sessie waarop de Bicep-extensie is geïnstalleerd. Maak vervolgens een bestand met de naam main.bicep. Voeg de volgende inhoud toe aan het bestand en sla de wijziging op:

Notitie

De bestandsnamen die u voor uw Bicep-bestanden kiest, zijn willekeurig, hoewel het een goede gewoonte is om een naam te kiezen die de bestandsinhoud of het doel weerspiegelt en u moet '.bicep' gebruiken voor de bestandsextensie.

@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}'

Notitie

Deze sjabloon is gebaseerd op de inhoud van de Azure-quickstartsjablonen voor de GitHub-opslagplaats.

Implementatie van de Bicep-sjabloon initiëren

Nadat u het bestand main.bicep hebt opgeslagen, kunt u doorgaan met een implementatie op basis van een sjabloon. Start eerst een Azure CLI-sessie op uw lokale computer en voer deze uit az login om te verifiëren. U moet de referenties van een gebruiker met voldoende bevoegdheden opgeven voor het inrichten van resources in uw Azure-abonnement. Wijzig vervolgens de huidige map in de map waarin het bestand main.bicep zich bevindt. U kunt ook een Azure Cloud Shell Bash-sessie starten en dat bestand uploaden naar uw basismap in de Azure Cloud Shell-omgeving.

Voer vervolgens de volgende opdracht uit vanuit een geverifieerde Azure CLI-sessie om een resourcegroep te maken, die alle resources bevat die deel uitmaken van de volgende implementatie:

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

Voordat u verdergaat, wilt u er mogelijk voor zorgen dat u de meest recente versie van Bicep CLI gebruikt door de volgende opdracht uit te voeren:

az bicep upgrade

Ten slotte start u de implementatie door de volgende opdracht uit te voeren:

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

Notitie

Deze opdracht bevat de --parameters switch, waarmee in dit geval de naam van de lokale beheerder wordt ingesteld voor de Azure-VM die u implementeert. Azure CLI vraagt u om het bijbehorende wachtwoord op te geven omdat de standaardwaarde van de adminPasswordOrKey parameter niet is ingesteld.

De Virtuele Azure-machine moet binnenkort worden uitgevoerd, meestal binnen een paar minuten. Als u er verbinding mee wilt maken, identificeert u de FQDN (Fully Qualified Domain Name) die is gekoppeld aan de netwerkinterface door de uitvoer te controleren die door de implementatie wordt gegenereerd. U kunt ook de shCommand waarde gebruiken. Wanneer u hierom wordt gevraagd, geeft u het zojuist ingestelde wachtwoord op om te verifiëren bij het tot stand brengen van een SSH-verbinding.

Als u de uitvoerwaarden van de Bicep-implementatie niet hebt vastgelegd, kunt u deze opnieuw weergeven door de volgende opdracht uit te voeren:

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

De uitvoer met JSON-indeling moet er ongeveer uitzien als de volgende inhoud:

{
  "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"
  }
}