Partager via


Exécuter des scripts dans votre machine virtuelle Linux à l’aide de commandes d’exécution managées

Attention

Cet article fait référence à CentOS, une distribution Linux proche de l’état EOL (End Of Life). Faites le point sur votre utilisation et organisez-vous en conséquence. Pour plus d’informations, consultez les conseils d’aide relatifs à la fin de vie de CentOS.

S’applique à : ✔️ Machines virtuelles Linux ✔️ Groupes identiques flexibles

Important

La fonctionnalité Run Command managée est actuellement disponible dans Azure CLI, PowerShell et API. Les fonctionnalités du portail seront bientôt disponibles.

La fonctionnalité Run Command utilise l’agent de machine virtuelle pour exécuter des scripts au sein d’une machine virtuelle Linux Azure. Vous pouvez utiliser ces scripts pour la gestion générale des ordinateurs ou des applications. Ils peuvent vous aider à diagnostiquer et corriger rapidement les problèmes de réseau et d’accès aux machines virtuelles et à rétablir l’état de la machine virtuelle.

La commande Run Command managée mise à jour utilise le même canal d’agent de machine virtuelle pour exécuter les scripts et fournit les améliorations suivantes par rapport à la commande Run Command orientée vers l’action d’origine :

  • Prise en charge des commandes Run Command mises à jour via le modèle de déploiement ARM
  • Exécution parallèle de plusieurs scripts
  • Exécution séquentielle de scripts
  • Délai d’expiration du script spécifié par l’utilisateur
  • Prise en charge des scripts de longue durée (heures/jours)
  • Transmission de secrets (paramètres, mots de passe) de manière sécurisée

Prérequis

Distributions Linux prises en charge

Distribution Linux x64 ARM64
Alma Linux 9.x + Non pris en charge
CentOS 7.x+, 8.x+ Non pris en charge
Debian > 10 Non pris en charge
Flatcar Linux 3374.2.x+ Non pris en charge
Linux Azure 2.x Non pris en charge
OpenSUSE 12.3+ Non pris en charge
Oracle Linux 6.4+, 7.x+, 8.x+ Non pris en charge
Red Hat Enterprise Linux 6.7+, 7.x+, 8.x+ Non pris en charge
Rocky Linux 9.x + Non pris en charge
SLES 12.x+, 15.x+ Non pris en charge
Ubuntu 18.04+, 20.04+, 22.04+ Non pris en charge

Limitation de l’accès à la commande Run

Le listage des commandes d’exécution ou l’affichage des détails d’une commande nécessite l’autorisation Microsoft.Compute/locations/runCommands/read au niveau de l’abonnement. Le rôle intégré Lecteur et les niveaux supérieurs disposent de cette autorisation.

L’exécution d’une commande nécessite l’autorisation Microsoft.Compute/virtualMachines/runCommand/write. Le rôle Contributeur de machines virtuelles et les niveaux supérieurs disposent de cette autorisation.

Vous pouvez utiliser un des rôles intégrés ou créer un rôle personnalisé afin d’exécuter Run Command.

Azure CLI

L’exemple suivant utilise la commande az vm run-command pour exécuter un script shell sur une machine virtuelle Linux Azure.

Exécuter un script avec la machine virtuelle

Cette commande remet le script à la machine virtuelle, l’exécute et retourne la sortie capturée.

az vm run-command create --name "myRunCommand" --vm-name "myVM" --resource-group "myRG" --script "echo Hello World!"

Répertorier toutes les ressources RunCommand déployées sur une machine virtuelle

Cette commande retourne une liste complète des commandes Run Command précédemment déployées, ainsi que leurs propriétés.

az vm run-command list --vm-name "myVM" --resource-group "myRG"

Obtenir l’état et les résultats de l’exécution

Cette commande permet de récupérer la progression de l’exécution actuelle, y compris la dernière sortie, l’heure de début/fin, le code de sortie et l’état terminal de l’exécution.

az vm run-command show --name "myRunCommand" --vm-name "myVM" --resource-group "myRG" --expand instanceView

Notes

Les champs de sortie et d’erreur dans instanceView sont limités à 4 Ko. Si vous souhaitez accéder à la sortie et à l’erreur complètes, vous avez la possibilité de transférer les données de sortie et d’erreur vers des objets blob d’ajout de stockage à l’aide des paramètres -outputBlobUri et -errorBlobUri lors de l’exécution de la commande Exécuter à l’aide de Set-AzVMRunCommand ou Set-AzVMssRunCommand.

Supprimer la ressource RunCommand de la machine virtuelle

Supprimez la ressource RunCommand précédemment déployée sur la machine virtuelle. Si l’exécution du script est toujours en cours, l’exécution se termine.

az vm run-command delete --name "myRunCommand" --vm-name "myVM" --resource-group "myRG"

PowerShell

Exécuter un script avec la machine virtuelle

Cette commande remet le script à la machine virtuelle, l’exécute et retourne la sortie capturée.

Set-AzVMRunCommand -ResourceGroupName "myRG" -VMName "myVM" -Location "EastUS" -RunCommandName "RunCommandName" –SourceScript "echo Hello World!"

Exécuter un script sur la machine virtuelle à l’aide du paramètre SourceScriptUri

OutputBlobUri et ErrorBlobUri sont des paramètres facultatifs.

Set-AzVMRunCommand -ResourceGroupName -VMName -RunCommandName -SourceScriptUri “< SAS URI of a storage blob with read access or public URI>" -OutputBlobUri “< SAS URI of a storage append blob with read, add, create, write access>” -ErrorBlobUri “< SAS URI of a storage append blob with read, add, create, write access>”

Répertorier toutes les ressources RunCommand déployées sur une machine virtuelle

Cette commande retourne une liste complète des commandes Run Command précédemment déployées, ainsi que leurs propriétés.

Get-AzVMRunCommand -ResourceGroupName "myRG" -VMName "myVM"

Obtenir l’état et les résultats de l’exécution

Cette commande permet de récupérer la progression de l’exécution actuelle, y compris la dernière sortie, l’heure de début/fin, le code de sortie et l’état terminal de l’exécution.

Get-AzVMRunCommand -ResourceGroupName "myRG" -VMName "myVM" -RunCommandName "RunCommandName" -Expand instanceView

Créer ou mettre à jour Run Command sur une machine virtuelle à l’aide de SourceScriptURI (URL SAP d’objet blob de stockage)

Créez ou mettez à jour Run Command sur une machine virtuelle Windows à l’aide d’une URL SAP d’un objet blob de stockage qui contient un script PowerShell. SourceScriptUri peut être l’URL SAP complète ou l’URL publique d’un objet blob de stockage.

Notes

L’URL SAP doit fournir un accès en lecture à l’objet blob. Un délai d’expiration de 24 heures est suggéré pour l’URL SAP. Les URL SAP peuvent être générées sur le Portail Azure à l’aide des options de l’objet blob ou d’un jeton SAP à l’aide de New-AzStorageBlobSASToken. Si vous générez un jeton SAP à l’aide de New-AzStorageBlobSASToken, votre URL SAP = « URL d’objet blob de base » + « ? » + « Jeton SAP de New-AzStorageBlobSASToken »

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP -SourceScriptUri <SourceScriptURI>

Obtenir une vue d’instance Run Command pour une machine virtuelle après la création ou la mise à jour de Run Command

Obtenir une instance Run Command pour une machine virtuelle avec la vue Instance. La vue d’instance contient l’état d’exécution de Run Command (Réussite, Échec, etc.), le code de sortie, la sortie standard et l’erreur standard générées par l’exécution du script à l’aide de la commande Run Command. Un ExitCode différent de zéro indique une exécution infructueuse.

$x = Get-AzVMRunCommand -ResourceGroupName MyRG -VMName MyVM -RunCommandName MyRunCommand -Expand InstanceView
$x.InstanceView

Sortie attendue :

ExecutionState   : Succeeded
ExecutionMessage :
ExitCode         : 0
Output           :   
output       : uid=0(root) gid=0(root) groups=0(root)
                   HelloWorld

Error            :
StartTime        : 10/27/2022 9:10:52 PM
EndTime          : 10/27/2022 9:10:55 PM
Statuses         :

InstanceView.ExecutionState - État du script Run Command de l’utilisateur. Reportez-vous à cet état pour savoir si votre script a réussi ou non.

ProvisioningState - État du provisionnement général des extensions de bout en bout (si la plateforme d’extension a pu déclencher ou non le script Run Command).

Créer ou mettre à jour Run Command exécution sur une machine virtuelle à l’aide de SourceScript (texte de script)

Créez ou mettez à jour Run Command sur une machine virtuelle en passant le contenu du script directement au paramètre -SourceScript. Utilisez ; pour séparer plusieurs commandes.

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVML -RunCommandName MyRunCommand2 -Location EastUS2EUAP -SourceScript "id; echo HelloWorld"

Créer ou mettre à jour Run Command sur une machine virtuelle à l’aide de SourceCommandId

Créez ou mettez à jour Run Command sur une machine virtuelle à l’aide de commandId. Les commandId disponibles peuvent être récupérés à l’aide de Get-AzVMRunCommandDocument.

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP -SourceCommandId ipconfig

Créer ou mettre à jour Run Command sur une machine virtuelle à l’aide de OutputBlobUri, ErrorBlobUri pour diffuser en continu des messages d’erreur standard vers des objets blob d’ajout de sortie et d’erreurs

Créez ou mettez à jour Run Command sur une machine virtuelle pour diffuser en continu des messages d’erreur standard vers des objets blob d’ajout de sortie et d’erreurs.

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVML -RunCommandName MyRunCommand3 -Location EastUS2EUAP EastUS2EUAP -SourceScriptUri <SourceScriptUri> -OutputBlobUri <OutputBlobUri> -ErrorBlobUri <errorbloburi>

Notes

Les objets blob de sortie et d’erreur doivent être de type AppendBlob et leurs URL SAP doivent fournir un accès en lecture, ajout, création et écriture sur l’objet blob. Un délai d’expiration de 24 heures est suggéré pour l’URL SAP. Si l’objet blob de sortie ou d’erreur n’existe pas, un objet blob de type AppendBlob est créé. Les URL SAP peuvent être générées sur le Portail Azure à l’aide des options de l’objet blob ou d’un jeton SAP à l’aide de New-AzStorageBlobSASToken. Si vous générez un jeton SAP à l’aide de New-AzStorageBlobSASToken, SAP URL = URL d’objet blob de base + « ? » + jeton SAP à partir de New-AzStorageBlobSASToken.

Créer ou mettre à jour Run Command sur une machine virtuelle, exécuter Run Command en tant qu’utilisateur différent à l’aide des paramètres RunAsUser et RunAsPassword

Créez ou mettez à jour Run Command sur une machine virtuelle, exécutez Run Command en tant qu’utilisateur différent à l’aide des paramètres RunAsUser et RunAsPassword. Pour que le compte d’identification fonctionne correctement, contactez l’administrateur de la machine virtuelle et vérifiez que l’utilisateur est ajouté sur la machine virtuelle, qu’il a accès aux ressources accessibles par Run Command (répertoires, fichiers, réseau, etc.) et, dans le cas d’une machine virtuelle Windows, que le service « Ouverture de session secondaire » est en cours d’exécution sur la machine virtuelle.

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP EastUS2EUAP -SourceScriptUri <SourceScriptUri> -RunAsUser myusername -RunAsPassword mypassword

Créez ou mettez à jour Run Command sur une ressource Virtual Machine Scale Sets à l’aide de SourceScriptUri (URL SAP d’objet blob de stockage).

Créez ou mettez à jour Run Command sur une ressource Virtual Machine Scale Sets à l’aide d’une URL SAP d’un objet blob de stockage qui contient un script bash.

Set-AzVmssVMRunCommand -ResourceGroupName MyRG0 -VMScaleSetName MyVMSS -InstanceId 0 -RunCommandName MyRunCommand -Location EastUS2EUAP -SourceScriptUri <SourceScriptUri>

Notes

Remarque : L’URL SAP doit fournir un accès en lecture à l’objet blob. Un délai d’expiration de 24 heures est suggéré pour l’URL SAS. Les URL SAP peuvent être générées sur le Portail Azure à l’aide des options de l’objet blob ou d’un jeton SAP à l’aide de New-AzStorageBlobSASToken. Si vous générez un jeton SAP à l’aide de New-AzStorageBlobSASToken, URL SAP = URL d’objet blob de base + « ? » + jeton SAP à partir de New-AzStorageBlobSASToken.

Créer ou mettre à jour Run Command sur une instance de machine virtuelle à l’aide des paramètres Parameter et ProtectedParameter (paramètres publics et protégés pour le script)

$PublicParametersArray = @([Microsoft.Azure.PowerShell.Cmdlets.Compute.Models.Api20210701.IRunCommandInputParameter]@{name='publicParam1';value='publicParam1value'},
>> [Microsoft.Azure.PowerShell.Cmdlets.Compute.Models.Api20210701.IRunCommandInputParameter]@{name='publicParam2';value='publicParam2value'})

$ProtectedParametersArray = @([Microsoft.Azure.PowerShell.Cmdlets.Compute.Models.Api20210701.IRunCommandInputParameter]@{name='secret1';value='secret1value'},
>> [Microsoft.Azure.PowerShell.Cmdlets.Compute.Models.Api20210701.IRunCommandInputParameter]@{name='secret2';value='secret2value'})

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP -SourceScriptUri <SourceScriptUri> -Parameter $PublicParametersArray -ProtectedParameter $ProtectedParametersArray

Utilisez ProtectedParameter pour passer toutes les entrées sensibles au script, comme les mots de passe, les clés, etc.

  • Windows : Les paramètres Parameters et ProtectedParameters sont passés au script en tant qu’arguments et s’exécutent comme suit : myscript.ps1 -publicParam1 publicParam1value -publicParam2 publicParam2value -secret1 secret1value -secret2 secret2value
  • Linux : Les paramètres nommés et leurs valeurs sont définis sur la configuration de l’environnement, qui doit être accessible dans le script .sh. Pour les arguments sans nom, passez une chaîne vide pour nommer l’entrée. Les arguments sans nom sont passés au script et s’exécutent comme suit : myscript.sh publicParam1value publicParam2value secret1value secret2value

Supprimer la ressource RunCommand de la machine virtuelle

Supprimez la ressource RunCommand précédemment déployée sur la machine virtuelle. Si l’exécution du script est toujours en cours, l’exécution se termine.

Remove-AzVMRunCommand -ResourceGroupName "myRG" -VMName "myVM" -RunCommandName "RunCommandName"

API REST

Pour déployer une nouvelle commande Run Command, exécutez une commande PUT directement sur la machine virtuelle et spécifiez un nom unique pour l’instance Run Command.

GET /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/runcommands?api-version=2019-12-01
{ 
"location": "<location>", 
"properties": { 
    "source": { 
        "script": "Write-Host Hello World!", 
        "scriptUri": "<SAS URI of a storage blob with read access or public URI>",  
        "commandId": "<Id>"  
        }, 
    "parameters": [ 
        { 
            "name": "param1",
            "value": "value1" 
            }, 
        { 
            "name": "param2", 
            "value": "value2" 
            } 
        ], 
    "protectedParameters": [ 
        { 
            "name": "secret1", 
            "value": "value1" 
            }, 
        { 
            "name": "secret2", 
            "value": "value2" 
            } 
        ], 
    "runAsUser": "userName",
    "runAsPassword": "userPassword", 
    "timeoutInSeconds": 3600, 
    "outputBlobUri": "< SAS URI of a storage append blob with read, add, create, write access>", 
    "errorBlobUri": "< SAS URI of a storage append blob with read, add, create, write access >"  
    }
}

Notes

  • Vous pouvez fournir un script inline, un URI de script ou un ID de commande de script intégré en tant que source d’entrée. L’URI de script est un URI SAS d’objet blob de stockage avec un URI accessible en lecture ou un URI public.
  • Un seul type d’entrée source est pris en charge pour une exécution de commande.
  • Run Command prend en charge l’écriture de la sortie et de l’erreur dans les objets blob de stockage à l’aide des paramètres outputBlobUri et errorBlobUri, qui permettent de stocker les sorties de script volumineuses. Utilisez l’URI SAS d’un objet blob d’ajout au stockage disposant d’un accès pour les opérations de lecture, d’ajout, de création et d’écriture. L’objet blob doit être de type AppendBlob. Sinon, l’écriture de la sortie du script ou de l’objet blob d’erreur échoue. L’objet blob est remplacé, s’il existe déjà. Il sera créé s'il n'existe pas.

Répertorier les instances en cours d’exécution de la commande Run Command sur une machine virtuelle

GET /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/runcommands?api-version=2019-12-01

Obtenir les détails de sortie d’un déploiement Run Command spécifique

GET /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/runcommands/<runCommandName>?$expand=instanceView&api-version=2019-12-01 

Supprimer un déploiement Run Command spécifique

Supprimer l’instance Run Command

DELETE /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/runcommands/<runCommandName>?api-version=2019-12-01 

Déployer des scripts dans une séquence ordonnée

Pour déployer des scripts de manière séquentielle, utilisez un modèle de déploiement, en spécifiant une relation dependsOn entre les scripts séquentiels.

{ 
    "type":"Microsoft.Compute/virtualMachines/runCommands",
    "name":"secondRunCommand",
    "apiVersion":"2019-12-01",
    "location":"[parameters('location')]",
    "dependsOn":<full resourceID of the previous other Run Command>,
    "properties":{
        "source":{
            "script":"echo Hello World!" 
        },
        "timeoutInSeconds":60
    }
}

Exécuter plusieurs commandes Run Command de manière séquentielle

Par défaut, si vous déployez plusieurs ressources RunCommand à l’aide du modèle de déploiement, elles sont exécutées simultanément sur la machine virtuelle. Si vous avez une dépendance sur les scripts et un ordre d’exécution par défaut, vous pouvez utiliser la propriété dependsOn pour les faire s’exécuter de manière séquentielle.

Dans cet exemple, secondRunCommand s’exécute après firstRunCommand.

{
   "$schema":"https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
   "contentVersion":"1.0.0.0",
   "resources":[
      {
         "type":"Microsoft.Compute/virtualMachines/runCommands",
         "name":"[concat(parameters('vmName'),'/firstRunCommand')]",
         "apiVersion":"2019-12-01",
         "location":"[parameters('location')]",
         "dependsOn":[
            "[concat('Microsoft.Compute/virtualMachines/', parameters('vmName'))]"
         ],
         "properties":{
            "source":{
               "script":"echo First: Hello World!"
            },
            "parameters":[
               {
                  "name":"param1",
                  "value":"value1"
               },
               {
                  "name":"param2",
                  "value":"value2"
               }
            ],
            "timeoutInSeconds":20
         }
      },
      {
         "type":"Microsoft.Compute/virtualMachines/runCommands",
         "name":"[concat(parameters('vmName'),'/secondRunCommand')]",
         "apiVersion":"2019-12-01",
         "location":"[parameters('location')]",
         "dependsOn":[
            "[concat('Microsoft.Compute/virtualMachines/', parameters('vmName'),'runcommands/firstRunCommand')]"
         ],
         "properties":{
            "source":{
               "scriptUri":"http://github.com/myscript.ps1"
            },
            "timeoutInSeconds":60
         }
      }
   ]
}

Étapes suivantes

Pour en savoir plus sur les autres méthodes d’exécution à distance des commandes et des scripts dans votre machine virtuelle, consultez Exécuter des scripts dans votre machine virtuelle Linux.