Bereitstellen eines virtuellen Linux-Computers mithilfe von Bicep

Abgeschlossen

Das Kernelement einer Bicep-Vorlage ist die Ressource, die eine Azure-Ressource angibt. Jede Ressource enthält generische und ressourcenspezifische Eigenschaften. Die im folgenden Beispiel verwendete Vorlage beschreibt beispielsweise ein virtuelles Azure-Netzwerk. Während die Eigenschaften „Name“ und „Ort“ generisch sind, ist addressPrefix ressourcenabhängig. Die Zeichenfolge Microsoft.Network/virtualNetworks@2021-05-01 neben der Ressource bezeichnet ihre API-Version, und der Eintrag virtualNetwork steht für ihren symbolischen Namen, mit dem die Ressource in der Vorlage referenziert werden kann.

Zusätzlich zum Ressourcenelement enthält die folgende Beispielvorlage auch ein Parameterelement, mit dem Sie dem virtuellen Netzwerk während der Bereitstellung einen Namen zuweisen können. Wenn Sie zu diesem Zeitpunkt keinen Namen zuweisen, wird stattdessen der Standardwert lnx-bcp-vnet angewendet. Das Element „Beschreibung“ ist ein Beispiel für einen Dekorator, was durch das führende @-Zeichen angezeigt wird. Der Zweck besteht darin, die Rolle des Parameters zu beschreiben, und seine Ausgabe wird neben dem Textfeld des Parameters angezeigt, wenn Sie das Azure-Portal verwenden, um die entsprechende Azure Resource Manager-Vorlage zu überprüfen oder bereitzustellen. Verwenden Sie das folgende Codebeispiel, um eine Linux-VM mithilfe von Bicep bereitzustellen:

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

Bereitstellen einer Linux-VM mithilfe von Bicep-Vorlagen

Die Arbeit mit Bicep umfasst das Erstellen und Bereitstellen von Vorlagen. Verwenden Sie Visual Studio Code mit der Bicep-Erweiterung, um die Erstellung zu vereinfachen und zu verbessern. Dieselbe Erweiterung unterstützt auch Bicep-basierte Bereitstellungen. Wenn Sie eine Bereitstellung lieber über eine Befehlszeile oder als Teil einer Skriptaufgabe auslösen möchten, können Sie die Bicep CLI als eigenständiges Hilfsprogramm installieren oder direkt in einer Azure CLI-Sitzung verwenden. Die Azure CLI installiert die Bicep CLI automatisch beim ersten Aufruf eines beliebigen az bicep-Befehls. Führen Sie jedoch az bicep install aus, um Bicep manuell zu installieren.

Der Prozess der Bereitstellung einer Azure-VM mithilfe von Bicep, auf der Linux ausgeführt wird, umfasst in der Regel die folgende Abfolge allgemeiner Schritte:

  • Identifizieren eines geeigneten VM-Images
  • Identifizieren der geeigneten VM-Größe
  • Erstellen einer Bicep-Vorlage
  • Initiieren der Bereitstellung der Bicep-Vorlage

Wenn Sie Bicep-Vorlagen bereitstellen, konvertiert eine Aufgabe, die als Transkompilation bezeichnet wird, diese Vorlagen automatisch in entsprechende Azure Resource Manager-Vorlagen. Sie können auch eine Konvertierung zwischen dem Bicep- und Azure Resource Manager-Format durchführen, indem Sie die Befehle bicep build bzw. bicep decompile ausführen.

Führen Sie die in den vorherigen Lerneinheiten dieses Moduls beschriebenen Schritte aus, um das geeignete VM-Image und die geeignete VM-Größe zu identifizieren. Der Fokus dieser Lerneinheit liegt auf Bicep-spezifischen Aufgaben.

Erstellen einer Bicep-Vorlage

Um eine Bicep-Vorlage zu erstellen, starten Sie zunächst eine Visual Studio Code-Sitzung mit installierter Bicep-Erweiterung. Erstellen Sie als Nächstes eine Datei mit dem Namen main.bicep. Fügen Sie der Datei den folgenden Inhalt hinzu, und speichern Sie dann die Änderungen:

Hinweis

Die Dateinamen, die Sie für Ihre Bicep-Dateien auswählen, sind willkürlich, obwohl es eine bewährte Methode ist, einen Namen auszuwählen, der den Inhalt oder Zweck der Datei widerspiegelt. Zudem sollten Sie „.bicep“ für die Dateierweiterung verwenden.

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

Hinweis

Diese Vorlage basiert auf dem Inhalt des GitHub-Repositorys Azure-Schnellstartvorlagen.

Initiieren der Bereitstellung der Bicep-Vorlage

Nachdem Sie die Datei main.bicep gespeichert haben, können Sie mit einer vorlagenbasierten Bereitstellung fortfahren. Starten Sie zunächst eine Azure CLI-Sitzung auf Ihrem lokalen Computer, und führen Sie az login aus, um sich zu authentifizieren. Sie müssen die Anmeldeinformationen von Benutzer*innen mit ausreichenden Berechtigungen zum Bereitstellen von Ressourcen in Ihrem Azure-Abonnement angeben. Ändern Sie als Nächstes das aktuelle Verzeichnis in das Verzeichnis, in dem sich die Datei main.bicep befindet. Alternativ können Sie eine Azure Cloud Shell-Bash-Sitzung starten und diese Datei in Ihr Basisverzeichnis in der Azure Cloud Shell-Umgebung hochladen.

Führen Sie anschließend den folgenden Befehl über eine authentifizierte Azure CLI-Sitzung aus, um eine Ressourcengruppe zu erstellen, die alle Ressourcen enthält, die Teil der nachfolgenden Bereitstellung sind:

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

Bevor Sie fortfahren, sollten Sie sicherstellen, dass Sie die neueste Version der Bicep CLI verwenden, indem Sie den folgenden Befehl ausführen:

az bicep upgrade

Initiieren Sie schließlich die Bereitstellung, indem Sie den folgenden Befehl ausführen:

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

Hinweis

Dieser Befehl enthält den Parameter --parameters, der in diesem Fall den Namen der lokalen Administrator*innen für den virtuellen Azure-Computer festlegt, den Sie bereitstellen. Azure CLI fordert Sie auf, das entsprechende Kennwort anzugeben, da der Standardwert des Parameters adminPasswordOrKey nicht festgelegt ist.

Die Azure-VM sollte in Kürze ausgeführt werden (in der Regel innerhalb weniger Minuten). Um eine Verbindung herzustellen, identifizieren Sie den vollqualifizierten Domänennamen (FQDN), der mit der Netzwerkschnittstelle verbunden ist, indem Sie die von der Bereitstellung erzeugte Ausgabe überprüfen. Alternativ können Sie den shCommand-Wert verwenden. Wenn Sie dazu aufgefordert werden, geben Sie beim Herstellen einer SSH-Verbindung das neu festgelegte Kennwort für die Authentifizierung an.

Falls Sie die Ausgabewerte der Bicep-Bereitstellung nicht erfasst haben, können Sie sie erneut anzeigen, indem Sie den folgenden Befehl ausführen:

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

Ihre Ausgabe im JSON-Format sollte in etwa wie folgt aussehen:

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