Een virtuele Linux-machine inrichten met Bicep
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"
}
}