Tutoriel : Créer une machine virtuelle ou un groupe de machines virtuelles identiques à partir de la galerie d’images partagées Azure à l’aide d’Ansible

Important

Ansible 2.9 (ou version ultérieure) est nécessaire pour exécuter les exemples de playbooks dans cet article.

Shared Image Gallery est un service qui permet aux clients de gérer, partager et organiser des images facilement. Cette fonctionnalité est utile pour les scénarios où de nombreuses images sont conservées et partagées. Les images personnalisées peuvent être partagées entre les abonnements et entre les locataires Microsoft Entra. Les images peuvent également être répliquées dans plusieurs régions, pour une mise à l’échelle plus rapide des déploiements.

Dans cet article, vous apprendrez comment :

  • Créer une machine virtuelle généralisée et une image personnalisée
  • Créer une galerie Shared Image Gallery
  • Créer une image partagée et une version d’image
  • Créer une machine virtuelle à l’aide de l’image généralisée
  • Créer un groupe de machines virtuelles identiques à l’aide de l’image généralisée
  • Obtenir des informations sur Shared Image Gallery, l’image et la version

Prérequis

  • Abonnement Azure : Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.

Obtenir les exemples de playbook

Il existe deux façons d’obtenir l’ensemble complet d’exemples de playbook :

  • Télécharger le dossier SIG et l’enregistrer sur votre ordinateur local.
  • Créer un fichier pour chaque section et y copier l’exemple de playbook.

Le fichier vars.yml contient les variables utilisées par tous les exemples de playbooks pour ce tutoriel. Vous pouvez modifier le fichier pour fournir des noms et des valeurs uniques.

Le premier exemple de playbook 00-prerequisites.yml crée ce qui est nécessaire pour suivre ce tutoriel :

  • Un groupe de ressources, qui est un conteneur logique dans lequel les ressources Azure sont déployées et gérées.
  • Un réseau virtuel, un sous-réseau, une adresse IP publique et une carte d’interface réseau pour la machine virtuelle.
  • Une machine virtuelle source, utilisée pour créer l’image généralisée.
- hosts: localhost
  connection: local
  vars_files:
    - ./vars.yml

  tasks:
    - name: Create resource group if doesn't exist
      azure_rm_resourcegroup:
        name: "{{ resource_group }}"
        location: "{{ location }}"
    
    - name: Create virtual network
      azure_rm_virtualnetwork:
        resource_group: "{{ resource_group }}"
        name: "{{ virtual_network_name }}"
        address_prefixes: "10.0.0.0/16"

    - name: Add subnet
      azure_rm_subnet:
        resource_group: "{{ resource_group }}"
        name: "{{ subnet_name }}"
        address_prefix: "10.0.1.0/24"
        virtual_network: "{{ virtual_network_name }}"

    - name: Create public IP address
      azure_rm_publicipaddress:
        resource_group: "{{ resource_group }}"
        allocation_method: Static
        name: "{{ ip_name }}"

    - name: Create virtual network inteface cards for VM A and B
      azure_rm_networkinterface:
        resource_group: "{{ resource_group }}"
        name: "{{ network_interface_name }}"
        virtual_network: "{{ virtual_network_name }}"
        subnet: "{{ subnet_name }}"

    - name: Create VM
      azure_rm_virtualmachine:
        resource_group: "{{ resource_group }}"
        name: "{{ source_vm_name }}"
        admin_username: testuser
        admin_password: "Password1234!"
        vm_size: Standard_B1ms
        network_interfaces: "{{ network_interface_name }}"
        image:
          offer: UbuntuServer
          publisher: Canonical
          sku: 16.04-LTS
          version: latest

Exécutez le playbook en utilisant ansible-playbook

ansible-playbook 00-prerequisites.yml

Dans le portail Azure, vérifiez le groupe de ressources que vous avez spécifié dans vars.yml pour voir la machine virtuelle et les différentes ressources que vous avez créées.

Généraliser la machine virtuelle et créer une image personnalisée

Le playbook suivant, 01a-create-generalized-image.yml, généralise la machine virtuelle source créée à l’étape précédente, puis crée une image personnalisée basée sur celle-ci.

- hosts: localhost
  connection: local
  vars_files:
    - ./vars.yml

  tasks:
    - name: Generalize VM
      azure_rm_virtualmachine:
        resource_group: "{{ resource_group }}"
        name: "{{ source_vm_name }}"
        generalized: yes

    - name: Create custom image
      azure_rm_image:
        resource_group: "{{ resource_group }}"
        name: "{{ image_name }}"
        source: "{{ source_vm_name }}"

Exécutez le playbook en utilisant ansible-playbook

ansible-playbook 01a-create-generalized-image.yml

Vérifiez votre groupe de ressources et assurez-vous que testimagea s’affiche.

La galerie d’images est le dépôt pour le partage et la gestion des images. L’exemple de code de playbook dans 02-create-shared-image-gallery.yml crée une galerie Shared Image Gallery dans votre groupe de ressources.

- hosts: localhost
  connection: local
  vars_files:
    - ./vars.yml

  tasks:
    - name: Create shared image gallery
      azure_rm_gallery:
        resource_group: "{{ resource_group }}"
        name: "{{ shared_gallery_name }}"
        location: "{{ location }}"
        description: This is the gallery description.

Exécutez le playbook en utilisant ansible-playbook

ansible-playbook 02-create-shared-image-gallery.yml

Vous voyez maintenant une nouvelle galerie, myGallery, dans votre groupe de ressources.

Créer une image partagée et une version d’image

Le playbook suivant, 03a-create-shared-image-generalized.yml, crée une définition d’image et une version d’image.

Les définitions d’image incluent le type d’image (Windows ou Linux), les notes de publication et les exigences de mémoire maximale et minimale. La version d’image est la version de l’image. La galerie, la définition d’image et la version d’image vous aident à organiser les images en groupes logiques.

- hosts: localhost
  connection: local
  vars_files:
    - ./vars.yml

  tasks:
    - name: Create shared image
      azure_rm_galleryimage:
        resource_group: "{{ resource_group }}"
        gallery_name: "{{ shared_gallery_name }}"
        name: "{{ shared_image_name }}"
        location: "{{ location }}"
        os_type: linux
        os_state: generalized
        identifier:
          publisher: myPublisherName
          offer: myOfferName
          sku: mySkuName
        description: Image description
    
    - name: Create or update a simple gallery image version.
      azure_rm_galleryimageversion:
        resource_group: "{{ resource_group }}"
        gallery_name: "{{ shared_gallery_name }}"
        gallery_image_name: "{{ shared_image_name }}"
        name: "{{ shared_image_version }}"
        location: "{{ location }}"
        publishing_profile:
          end_of_life_date: "2020-10-01t00:00:00+00:00"
          exclude_from_latest: yes
          replica_count: 3
          storage_account_type: Standard_LRS
          target_regions:
            - name: West US
              regional_replica_count: 1
            - name: East US
              regional_replica_count: 2
              storage_account_type: Standard_ZRS
          managed_image:
            name: "{{ image_name }}"
            resource_group: "{{ resource_group }}"
      register: output

    - debug:
        var: output

Exécutez le playbook en utilisant ansible-playbook

ansible-playbook 03a-create-shared-image-generalized.yml

Votre groupe de ressources a maintenant une définition d’image et une version d’image pour votre galerie.

Créer une machine virtuelle basée sur l’image généralisée

Enfin, exécutez 04a-create-vm-using-generalized-image.yml pour créer une machine virtuelle basée sur l’image généralisée que vous avez créée à l’étape précédente.

- hosts: localhost
  connection: local
  vars_files:
    - ./vars.yml

  tasks:
  - name: Create VM using shared image
    azure_rm_virtualmachine:
      resource_group: "{{ resource_group }}"
      name: "{{ vm_name }}"
      vm_size: Standard_DS1_v2
      admin_username: adminUser
      admin_password: PassWord01
      managed_disk_type: Standard_LRS
      image:
        id: "/subscriptions/{{ lookup('env', 'AZURE_SUBSCRIPTION_ID') }}/resourceGroups/{{ resource_group }}/providers/Microsoft.Compute/galleries/{{ shared_gallery_name }}/images/{{ shared_image_name }}/versions/{{ shared_image_version }}"

Exécutez le playbook en utilisant ansible-playbook

ansible-playbook 04a-create-vm-using-generalized-image.yml

Créer un groupe de machines virtuelles identiques basé sur l’image généralisée

Vous pouvez également créer un groupe de machines virtuelles identiques basé sur l’image généralisée. Pour ce faire, exécutez 05a-create-vmss-using-generalized-image.yml.

- hosts: localhost
  connection: local
  vars_files:
    - ./vars.yml

  tasks:
  - name: Create a virtual machine scale set using a shared image
    azure_rm_virtualmachinescaleset:
      resource_group: "{{ resource_group }}"
      name: "{{ vmss_name }}"
      vm_size: Standard_DS1_v2
      admin_username: adminUser
      admin_password: PassWord01
      capacity: 2
      virtual_network_name: "{{ virtual_network_name }}"
      upgrade_policy: Manual
      subnet_name: "{{ subnet_name }}"
      managed_disk_type: Standard_LRS
      image:
        id: "/subscriptions/{{ lookup('env', 'AZURE_SUBSCRIPTION_ID') }}/resourceGroups/{{ resource_group }}/providers/Microsoft.Compute/galleries/{{ shared_gallery_name }}/images/{{ shared_image_name }}/versions/{{ shared_image_version }}"

Exécutez le playbook en utilisant ansible-playbook

ansible-playbook 05a-create-vmss-using-generalized-image.yml

Vous pouvez obtenir des informations sur la galerie, la définition d’image et la version en exécutant 06-get-info.yml.

- hosts: localhost
  connection: local
  vars_files:
    - ./vars.yml

  tasks:
  - name: Get Shared Image Gallery information
    azure_rm_gallery_info:
      resource_group: "{{ resource_group }}"
      name: "{{ shared_gallery_name }}"
  - name: Get shared image information
    azure_rm_galleryimage_info:
      resource_group: "{{ resource_group }}"
      gallery_name: "{{ shared_gallery_name }}"
      name: "{{ shared_image_name }}"
  - name: Get Shared Image Gallery image version information
    azure_rm_galleryimageversion_info:
      resource_group: "{{ resource_group }}"
      gallery_name: "{{ shared_gallery_name }}"
      gallery_image_name: "{{ shared_image_name }}"
      name: "{{ shared_image_version }}"

Exécutez le playbook en utilisant ansible-playbook

ansible-playbook 06-get-info.yml

Supprimer l’image partagée

Pour supprimer les ressources de la galerie, reportez-vous à l’exemple de playbook 07-delete-gallery.yml. Supprimez les ressources dans l’ordre inverse. Commencez par supprimer la version d’image. Après avoir supprimé toutes les versions de l’image, vous pouvez supprimer la définition de l’image. Après avoir supprimé toutes les définitions de l’image, vous pouvez supprimer la galerie.

- hosts: localhost
  connection: local
  vars_files:
    - ./vars.yml

  tasks:
  - name: Delete gallery image version.
    azure_rm_galleryimageversion:
      resource_group: "{{ resource_group }}"
      gallery_name: "{{ shared_gallery_name }}"
      gallery_image_name: "{{ shared_image_name }}"
      name: "{{ shared_image_version }}"
      state: absent

  - name: Delete gallery image
    azure_rm_galleryimage:
      resource_group: "{{ resource_group }}"
      gallery_name: "{{ shared_gallery_name }}"
      name: "{{ shared_image_name }}"
      state: absent

  - name: Delete a simple gallery.
    azure_rm_gallery:
      resource_group: "{{ resource_group }}"
      name: "{{ shared_gallery_name }}"
      state: absent

Exécutez le playbook en utilisant ansible-playbook

ansible-playbook 07-delete-gallery.yml

Nettoyer les ressources

  1. Enregistrez le code suivant en tant que delete_rg.yml.

    ---
    - hosts: localhost
      tasks:
        - name: Deleting resource group - "{{ name }}"
          azure_rm_resourcegroup:
            name: "{{ name }}"
            state: absent
          register: rg
        - debug:
            var: rg
    
  2. Exécutez le playbook en utilisant la commande ansible-playbook. Remplacez l’espace réservé par le nom du groupe de ressources à supprimer. Toutes les ressources du groupe de ressources seront supprimées.

    ansible-playbook delete_rg.yml --extra-vars "name=<resource_group>"
    

    Points essentiels :

    • En raison de la variable register et de la section debug du playbook, les résultats s’affichent quand la commande se termine.

Étapes suivantes