Een virtuele Linux-machine inrichten met Bicep
Het kernelement van een Bicep-sjabloon is resource, waarmee een Azure-resource wordt aangewezen. 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 aan het virtuele netwerk kunt toewijzen. 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. 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 Quickstart Templates voor de GitHub-repository.
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"
}
}