Usare cloud-init per personalizzare una macchina virtuale Linux in AzureUse cloud-init to customize a Linux VM in Azure

Questo articolo illustra come usare cloud-init per impostare il nome host, aggiornare i pacchetti e gestire gli account utente in una macchina virtuale (VM) in Azure.This article shows you how to use cloud-init to set the hostname, update packages, and manage user accounts on a virtual machine (VM) in Azure. Questi script cloud init vengono eseguiti all'avvio quando si crea una macchina virtuale con l'interfaccia della riga di comando di Azure 2.0.These cloud-init scripts run on boot when you create a VM with the Azure CLI 2.0. Per una panoramica più approfondita su come installare applicazioni, scrivere file di configurazione e inserire chiavi da Key Vault, vedere questa esercitazione.For a more in-depth overview on how to install applications, write configuration files, and inject keys from Key Vault, see this tutorial. È possibile anche eseguire questi passaggi tramite l'interfaccia della riga di comando di Azure 1.0.You can also perform these steps with the Azure CLI 1.0.

Panoramica di cloud-initCloud-init overview

Cloud-init è un approccio diffuso per personalizzare una macchina virtuale Linux al primo avvio.Cloud-init is a widely used approach to customize a Linux VM as it boots for the first time. Cloud-init consente di installare pacchetti e scrivere file o configurare utenti e impostazioni di sicurezza.You can use cloud-init to install packages and write files, or to configure users and security. Quando cloud-init viene eseguito durante il processo di avvio iniziale non vi sono altri passaggi o agenti necessari per applicare la configurazione.As cloud-init runs during the initial boot process, there are no additional steps or required agents to apply your configuration.

Cloud-init funziona anche fra distribuzioni.Cloud-init also works across distributions. Ad esempio, non si usa apt-get install o yum install per installare un pacchetto.For example, you don't use apt-get install or yum install to install a package. In alternativa, è possibile definire un elenco di pacchetti da installare.Instead you can define a list of packages to install. Cloud-init userà automaticamente lo strumento di gestione del pacchetto nativo per la distribuzione selezionata.Cloud-init automatically uses the native package management tool for the distro you select.

Microsoft collabora con i partner per promuovere l'inclusione e il funzionamento di cloud-init con le immagini da essi fornite per Azure.We are working with our partners to get cloud-init included and working in the images that they provide to Azure. La tabella seguente illustra l'attuale disponibilità di cloud-init nelle immagini della piattaforma Azure:The following table outlines the current cloud-init availability on Azure platform images:

AliasAlias AutorePublisher OffertaOffer SKUSKU VersioneVersion
UbuntuLTSUbuntuLTS CanonicalCanonical UbuntuServerUbuntuServer 16.04-LTS16.04-LTS più recentilatest
UbuntuLTSUbuntuLTS CanonicalCanonical UbuntuServerUbuntuServer 14.04.5-LTS14.04.5-LTS più recentilatest
CoreOSCoreOS CoreOSCoreOS CoreOSCoreOS StabileStable più recentilatest

Impostare il nome host con cloud-initSet the hostname with cloud-init

I file cloud-init sono scritti in YAML.Cloud-init files are written in YAML. Per eseguire uno script cloud-init quando si crea una VM in Azure con az vm create, specificare il file cloud-init con l'opzione --custom-data.To run a cloud-init script when you create a VM in Azure with az vm create, specify the cloud-init file with the --custom-data switch. Verranno esaminati alcuni esempi di ciò che è possibile configurare con un file cloud-init.Let's look at some examples of what you can configure with a cloud-init file. Uno scenario comune consiste nell'impostare il nome host di una macchina virtuale.A common scenario is to set the hostname of a VM. Per impostazione predefinita, il nome host corrisponde al nome della VM.By default, the hostname is the same as the VM name.

Creare prima un gruppo di risorse con az group create.First, create a resource group with az group create. L'esempio seguente crea il gruppo di risorse denominato myResourceGroup nella località eastus:The following example creates the resource group named myResourceGroup in the eastus location:

az group create --name myResourceGroup --location eastus

Nella shell corrente creare un file denominato cloud_init_hostname.txt e incollare la configurazione seguente.In your current shell, create a file named cloud_init_hostname.txt and paste the following configuration. Ad esempio, creare il file in Cloud Shell anziché nel computer locale.For example, create the file in the Cloud Shell not on your local machine. È possibile usare qualsiasi editor.You can use any editor you wish. In Cloud Shell immettere sensible-editor cloud_init_hostname.txt per creare il file e visualizzare un elenco degli editor disponibili.In the Cloud Shell, enter sensible-editor cloud_init_hostname.txt to create the file and see a list of available editors. Assicurarsi che l'intero file cloud-init venga copiato correttamente, in particolare la prima riga:Make sure that the whole cloud-init file is copied correctly, especially the first line:

#cloud-config
hostname: myhostname

Creare ora una VM con az vm create e specificare il file cloud-init con --custom-data cloud_init_hostname.txt come segue:Now, create a VM with az vm create and specify the cloud-init file with --custom-data cloud_init_hostname.txt as follows:

az vm create \
    --resource-group myResourceGroup \
    --name myVMHostname \
    --image UbuntuLTS \
    --admin-username azureuser \
    --generate-ssh-keys \
    --custom-data cloud_init_hostname.txt

Dopo la creazione della VM, l'interfaccia della riga di comando di Azure visualizza le relative informazioni.Once created, the Azure CLI shows information about the VM. Usare publicIpAddress per stabilire una connessione SSH alla VM.Use the publicIpAddress to SSH to your VM. Immettere il proprio indirizzo come di seguito:Enter your own address as follows:

ssh azureuser@publicIpAddress

Per visualizzare il nome della VM, usare il comando hostname come segue:To see the VM name, use the hostname command as follows:

hostname

La VM segnalerà il nome host come il valore impostato nel file cloud-init, come illustrato nell'output di esempio seguente:The VM should report the hostname as that value set in the cloud-init file, as shown in the following example output:

myhostname

Aggiornare una macchina virtuale con cloud initUpdate a VM with cloud-init

Per motivi di sicurezza, potrebbe essere necessario configurare una VM per applicare gli aggiornamenti più recenti al primo avvio.For security purposes, you may want to configure a VM to apply the latest updates on first boot. Poiché cloud-init funziona in distribuzioni Linux diverse, non è necessario specificare apt o yum per la gestione pacchetti.As cloud-init works across different Linux distros, there is no need to specify apt or yum for the package manager. È invece necessario definire package_upgrade e consentire al processo cloud-init di determinare il meccanismo appropriato per la distribuzione in uso.Instead, you define package_upgrade and let the cloud-init process determine the appropriate mechanism for the distro in use. Questo flusso di lavoro consente di usare gli stessi script cloud-init nelle distribuzioni.This workflow allows you to use the same cloud-init scripts across distros.

Per verificare il funzionamento del processo di aggiornamento, creare un file cloud-init denominato cloud_init_upgrade.txt e incollare la configurazione seguente:To see upgrade process in action, create a cloud-init file named cloud_init_upgrade.txt and paste the following configuration:

#cloud-config
package_upgrade: true

Creare ora una VM con az vm create e specificare il file cloud-init con --custom-data cloud_init_upgrade.txt come segue:Now, create a VM with az vm create and specify the cloud-init file with --custom-data cloud_init_upgrade.txt as follows:

az vm create \
    --resource-group myResourceGroup \
    --name myVMUpgrade \
    --image UbuntuLTS \
    --admin-username azureuser \
    --generate-ssh-keys \
    --custom-data cloud_init_upgrade.txt

Stabilire una connessione SSH all'indirizzo IP pubblico della VM visualizzata nell'output del comando precedente.SSH to the public IP address of your VM shown in the output from the preceding command. Immettere il proprio indirizzo IP pubblico come di seguito:Enter your own public IP address as follows:

ssh azureuser@publicIpAddress

Eseguire lo strumento di gestione pacchetti e cercare gli aggiornamenti.Run the package management tool and check for updates. L'esempio seguente usa apt-get in una VM Ubuntu:The following example uses apt-get on an Ubuntu VM:

sudo apt-get upgrade

Poiché cloud-init ha cercato e installato gli aggiornamenti all'avvio, non sono presenti aggiornamenti da applicare, come illustrato nell'output di esempio seguente:As cloud-init checked for and installed updates on boot, there are no updates to apply, as shown in the following example output:

Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

Aggiungere un utente a una macchina virtuale con cloud initAdd a user to a VM with cloud-init

Una delle prime attività eseguite in qualsiasi nuova VM Linux è l'aggiunta di un utente per evitare di usare root.One of the first tasks on any new Linux VM is to add a user for yourself to avoid the use of root. Le chiavi SSH sono la procedura consigliata per la sicurezza e l'usabilità.SSH keys are best practice for security and usability. Le chiavi vengono aggiunte al file ~/.ssh/authorized_keys con questo script cloud-init.Keys are added to the ~/.ssh/authorized_keys file with this cloud-init script.

Per aggiungere un utente a una VM Linux, creare un file cloud-init denominato cloud_init_add_user.txt e incollare la configurazione seguente.To add a user to a Linux VM, create a cloud-init file named cloud_init_add_user.txt and paste the following configuration. Fornire la chiave pubblica (ad esempio il contenuto di ~/.ssh/id_rsa.pub) per ssh-authorized-keys:Provide your own public key (such as the contents of ~/.ssh/id_rsa.pub) for ssh-authorized-keys:

#cloud-config
users:
  - name: myadminuser
    groups: sudo
    shell: /bin/bash
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    ssh-authorized-keys:
      - ssh-rsa AAAAB3<snip>

Creare ora una VM con az vm create e specificare il file cloud-init con --custom-data cloud_init_add_user.txt come segue:Now, create a VM with az vm create and specify the cloud-init file with --custom-data cloud_init_add_user.txt as follows:

az vm create \
    --resource-group myResourceGroup \
    --name myVMUser \
    --image UbuntuLTS \
    --admin-username azureuser \
    --generate-ssh-keys \
    --custom-data cloud_init_add_user.txt

Stabilire una connessione SSH all'indirizzo IP pubblico della VM visualizzata nell'output del comando precedente.SSH to the public IP address of your VM shown in the output from the preceding command. Immettere il proprio indirizzo IP pubblico come di seguito:Enter your own public IP address as follows:

ssh myadminuser@publicIpAddress

Per verificare che l'utente sia stato aggiunto alla VM e ai gruppi specificati, visualizzare il contenuto del file /etc/group come segue:To confirm your user was added to the VM and the specified groups, view the contents of the /etc/group file as follows:

cat /etc/group

L'output di esempio seguente illustra che l'utente dal file cloud_init_add_user.txt è stato aggiunto alla VM e al gruppo appropriato:The following example output shows the user from the cloud_init_add_user.txt file has been added to the VM and the appropriate group:

root:x:0:
<snip />
sudo:x:27:myadminuser
<snip />
myadminuser:x:1000:

Passaggi successiviNext steps

Cloud-init è uno dei metodi standard per modificare le VM Linux in fase di avvio.Cloud-init is one of standard ways to modify your Linux VMs on boot. In Azure è anche possibile usare le estensioni di VM per modificare la VM Linux all'avvio o quando è in esecuzione.In Azure, you can also use VM extensions to modify your Linux VM on boot or once it is running. È ad esempio possibile usare l'estensione di VM di Azure per eseguire uno script in una VM in esecuzione e non solo al primo avvio.For example, you can use the Azure VM extension to execute a script on a running VM, not just on first boot. Per altre informazioni sulle estensioni di VM, vedere Estensioni della macchina virtuale e funzionalità. Per esempi di come usare l'estensione, vedere Gestire utenti, SSH e dischi di controllo o di ripristino in VM Linux di Azure tramite l'estensione VMAccess.For more information about VM extensions, see VM extensions and features, or for examples on how to use the extension, see Manage users, SSH, and check or repair disks on Azure Linux VMs using the VMAccess Extension.