Etablera en virtuell Linux-dator med hjälp av Bicep

Slutförd

Kärnelementet i en Bicep-mall är resursen, som anger en Azure-resurs. Varje resurs innehåller en uppsättning allmänna och resursspecifika egenskaper. Mallen som används i följande exempel beskriver till exempel ett virtuellt Azure-nätverk. Även om namn- och platsegenskaperna är generiska är addressPrefix resursspecifika. Strängen Microsoft.Network/virtualNetworks@2021-05-01 bredvid resursen anger dess API-version och virtualNetwork posten representerar dess symboliska namn, vilket ger ett sätt att referera till resursen i mallen.

Förutom resurselementet innehåller följande exempelmall även ett parameterelement som gör att du kan tilldela ett namn till det virtuella nätverket under distributionen. Om du inte tilldelar ett namn vid den tidpunkten gäller standardvärdet lnx-bcp-vnet för i stället. Beskrivningselementet är ett exempel på en dekoratör, vilket anges av det inledande @ tecknet. Syftet är att beskriva parameterns roll och dess utdata visas bredvid parameterns textruta när du använder Azure-portalen för att granska eller distribuera motsvarande Azure Resource Manager-mall. Använd följande kodexempel för att etablera en virtuell Linux-dator med hjälp av 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
      ]
    }
  }
}

Distribuera en virtuell Linux-dator med hjälp av Bicep-mallar

Att arbeta med Bicep omfattar redigering och distribution av mallar. För att förenkla och förbättra redigeringsupplevelsen använder du Visual Studio Code med Bicep-tillägget. Samma tillägg stöder även Bicep-baserade distributioner. Om du föredrar att utlösa en distribution från en kommandorad eller som en del av en skriptuppgift kan du installera och använda Bicep CLI som ett fristående verktyg eller använda den direkt från en Azure CLI-session. Azure CLI installerar Bicep CLI automatiskt under det första anropet av ett az bicep kommando. Kör dock för att utföra en manuell installation av Bicep az bicep install.

I själva verket omfattar processen med att etablera en virtuell Azure-dator som kör Linux med hjälp av Bicep vanligtvis följande sekvens med övergripande steg:

  • Identifiera en lämplig VM-avbildning.
  • Identifiera lämplig VM-storlek.
  • Skapa en Bicep-mall.
  • Initiera distributionen av Bicep-mallen.

När du distribuerar Bicep-mallar konverterar en uppgift som kallas transpilering automatiskt dem till motsvarande Azure Resource Manager-mallar. Du kan också utföra en konvertering mellan Bicep- och Azure Resource Manager-formaten bicep build genom att köra kommandona och bicep decompile .

Om du vill identifiera lämplig VM-avbildning och storlek följer du stegen som beskrivs i de tidigare enheterna i den här modulen. Den här lektionen fokuserar på Bicep-specifika uppgifter.

Skapa en Bicep-mall

Om du vill skapa en Bicep-mall börjar du med att starta en Visual Studio Code-session med Bicep-tillägget installerat. Skapa sedan en fil med namnet main.bicep. Lägg till följande innehåll i filen och spara sedan ändringen:

Kommentar

De filnamn som du väljer för dina Bicep-filer är godtyckliga, även om det är en bra idé att välja ett namn som återspeglar filinnehållet eller syftet, och du bör använda ".bicep" för filnamnstillägget.

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

Kommentar

Den här mallen baseras på innehållet i GitHub-lagringsplatsens Azure-snabbstartsmallar.

Initiera distributionen av Bicep-mallen

När du har sparat filen main.bicep kan du fortsätta med en mallbaserad distribution. Starta först en Azure CLI-session på den lokala datorn och kör az login för att autentisera. Du måste ange autentiseringsuppgifterna för en användare med tillräcklig behörighet för att etablera resurser i din Azure-prenumeration. Ändra sedan den aktuella katalogen till den där filen main.bicep finns. Du kan också starta en Azure Cloud Shell Bash-session och ladda upp filen till din hemkatalog i Azure Cloud Shell-miljön.

Kör sedan följande kommando från en autentiserad Azure CLI-session för att skapa en resursgrupp som innehåller alla resurser som ingår i den efterföljande distributionen:

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

Innan du fortsätter kan du kontrollera att du använder den senaste versionen av Bicep CLI genom att köra följande kommando:

az bicep upgrade

Starta slutligen distributionen genom att köra följande kommando:

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

Kommentar

Det här kommandot innehåller växeln --parameters , som i det här fallet anger namnet på den lokala administratören för den virtuella Azure-dator som du distribuerar. Azure CLI uppmanar dig att ange motsvarande lösenord eftersom standardvärdet för parametern adminPasswordOrKey inte har angetts.

Den virtuella Azure-datorn bör börja köras inom kort, vanligtvis inom några minuter. Om du vill ansluta till den identifierar du det fullständigt kvalificerade domännamnet (FQDN) som är associerat med dess nätverksgränssnitt genom att granska utdata som distributionen genererar. Du kan också använda värdet shCommand . När du uppmanas till det anger du det nyligen angivna lösenordet för att autentisera när du upprättar en SSH-anslutning.

Om du inte registrerar utdatavärdena för Bicep-distributionen kan du visa dem igen genom att köra följande kommando:

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

JSON-formaterade utdata bör likna följande innehåll:

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