01 NOVEMBRE 2024
Gérer des VM Linux Azure via SSH dans les pipelines DevOps sans connexions de service
Travailler avec des machines virtuelles Linux dans Azure via Azure DevOps peut s’avérer complexe lorsqu’un accès SSH est requis sans utiliser de connexions de service. Les tâches standard d’Azure DevOps supposent la présence d’une connexion de service préconfigurée, ce qui rend l’utilisation de machines virtuelles dynamiques ou temporaires peu pratique et inefficace.
Dans cet article, nous examinons des solutions à ce problème.
Azure DevOps propose diverses tâches standard pour interagir avec les machines virtuelles, telles que « SSH Task » et « Azure CLI ». Cependant, ces tâches nécessitent une connexion de service préconfigurée, ce qui implique que la machine a déjà été créée et configurée manuellement ou par le biais de procédures distinctes. Cela peut aller à l'encontre des principes d'automatisation, en particulier dans les environnements agiles où l'infrastructure est fréquemment recréée.

Par exemple, dans les situations où les machines virtuelles sont créées dans le cadre de feuilles de route CI/CD automatisées et nécessitent une configuration immédiate, les connexions de service standard ne sont pas appropriées. Créer et supprimer régulièrement des comptes de service devient un processus peu pratique et chronophage.

Le problème est particulièrement aigu dans les environnements de test automatisés où les ressources changent rapidement et où tout travail manuel devient un goulot d'étranglement qui ralentit le processus. Les environnements DevOps ont besoin d'une solution entièrement automatisée qui intègre et configure de manière transparente les machines virtuelles au sein d'un seul Pipeline, sans opérations manuelles supplémentaires.

Solution au problème

Une solution efficace au problème consiste à utiliser Azure CLI et les scripts Bash directement dans les pipelines Azure DevOps, ce qui permet de créer, de configurer et de gérer les machines virtuelles de manière dynamique sans préconfigurer les connexions de service.

Exemple de pipelining automatisé à l'aide d'AzureCLI. Nous allons créer une machine virtuelle, configurer l'autorisation des certificats et établir une connexion SSH:
# Step 1: Generate an SSH key in Pipeline
- script: |
    ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa -q -N ""

# Step 2. Automatically create an Azure Linux VM with an SSH key
- task: AzureCLI@2
  inputs:
    azureSubscription: '<SUBSCRIPTION>'
    scriptType: 'bash'
    scriptLocation: 'inlineScript'
    inlineScript: |
      az vm create \
        --resource-group myResourceGroup \
        --name myVM \
        --image UbuntuLTS \
        --admin-username azureuser \
        --ssh-key-values ~/.ssh/id_rsa.pub

# Step 3. Obtain IP and auto-configuration via SSH
- task: AzureCLI@2
  inputs:
    azureSubscription: '<SUBSCRIPTION>'
    scriptType: 'bash'
    scriptLocation: 'inlineScript'
    inlineScript: |
      vm_ip=$(az vm show -d -g myResourceGroup -n myVM --query publicIps -o tsv)
      ssh -o StrictHostKeyChecking=no azureuser@$vm_ip << EOF
      sudo apt-get update
      sudo apt-get install -y nginx
      echo "Hello from Azure DevOps!" | sudo tee /var/www/html/index.html
      EOF

Vous pouvez également utiliser une connexion ssh à partir d'un script bash. Par exemple avec un login et un mot de passe.
- task: Bash@3
  inputs:
    targetType: 'inline'
    script: |
      sudo apt-get update
      sudo apt-get install sshpass

      vmdnsname=<VM_DNS_NAME>
      vmusername=<VM_USERNAME>
      mpassword=<VM_PASSWORD>

      sshpass -p $vmpassword ssh $vmusername@$vmdnsname -o "StrictHostKeyChecking no" "echo "Hello from Azure DevOps!"