Tutorial: Aktualisieren des benutzerdefinierten Image von Skalierungsgruppen für virtuelle Azure-Computer mit AnsibleTutorial: Update the custom image of Azure virtual machine scale sets using Ansible

Wichtig

Für die Ausführung der Beispielplaybooks in diesem Artikel ist mindestens Ansible 2.8 erforderlich.Ansible 2.8 (or later) is required to run the sample playbooks in this article.

Azure-VM-Skalierungsgruppen sind eine Azure-Funktion, mit der Sie eine Gruppe von identischen virtuellen Computern mit Lastenausgleich konfigurieren können.Azure virtual machine scale sets is an Azure feature that lets you configure a group of identical, load balanced VMs. Durch Skalierungsgruppen entstehen keine zusätzlichen Kosten, und sie werden aus virtuellen Computern erstellt.There's no additional cost to scale sets and they're built from virtual machines. Sie zahlen nur für die zugrunde liegenden Computeressourcen, z. B. die VM-Instanzen, den Lastenausgleich oder den Speicher für verwaltete Datenträger.You pay only for the underlying compute resources such as the VM instances, load balancers, or Managed Disk storage. Mit Skalierungsgruppen werden die Verwaltungs- und Automatisierungsebenen für die Ausführung und Skalierung Ihrer Anwendungen bereitgestellt.With scale sets, the management and automation layers are provided to run and scale your applications. Sie können stattdessen einzelne virtuelle Computer manuell erstellen und verwalten.You could instead manually create and manage individual VMs. Die Verwendung von Skalierungsgruppen bietet jedoch zwei wesentliche Vorteile.However, there are two key benefits to using scale sets. Sie sind in Azure integriert und skalieren Ihre virtuellen Computer automatisch entsprechend den Anwendungsanforderungen.They're built into Azure and they automatically scale your virtual machines to meet application needs.

Nach der Bereitstellung eines virtuellen Computers konfigurieren Sie ihn mit der für Ihre App erforderlichen Software.After a VM is deployed, you configure the VM with the software your app needs. Anstatt diese Konfigurationsaufgabe für jeden virtuellen Computer durchzuführen, können Sie ein benutzerdefiniertes Image erstellen.Instead of doing this configuration task for each VM, you can create a custom image. Ein benutzerdefiniertes Image ist eine Momentaufnahme eines vorhandenen virtuellen Computers, welche die gesamte installierte Software enthält.A custom image is a snapshot of an existing VM that includes any installed software. Beim Konfigurieren einer Skalierungsgruppe geben Sie das Image an, das für die virtuellen Computer dieser Skalierungsgruppe verwendet werden soll.When you configure a scale set, you specify the image to use for that scale set's VMs. Durch die Verwendung eines benutzerdefinierten Images wird jede VM-Instanz für Ihre App identisch konfiguriert.By using a custom image, each VM instance is identically configured for your app. Bisweilen müssen Sie das benutzerdefinierte Image Ihrer Skalierungsgruppe aktualisieren.Sometimes, you may need to update your scale set's custom image. Um diese Aufgabe geht es in diesem Tutorial.That task is the focus of this tutorial.

In diesem Tutorial wird Ansible für Folgendes verwendet:In this tutorial, Ansible is used to:

  • Konfigurieren von zwei virtuellen Computern mit HTTPDConfigure two VMs with HTTPD
  • Erstellen eines benutzerdefinierten Image von einem vorhandenen virtuellen ComputerCreate a custom image from an existing VM
  • Erstellen einer Skalierungsgruppe aus einem ImageCreate a scale set from an image
  • Aktualisieren des benutzerdefinierten ImageUpdate the custom image

VoraussetzungenPrerequisites

  • Azure-Abonnement: Wenn Sie kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.Azure subscription: If you don't have an Azure subscription, create a free account before you begin.

Konfigurieren von zwei virtuellen ComputernConfigure two VMs

Mit dem Playbookcode in diesem Abschnitt werden zwei virtuelle Computer erstellt, auf denen jeweils HTTPD installiert ist.The playbook code in this section creates two virtual machines with HTTPD installed on both.

Die Seite index.html zeigt für jeden virtuellen Computer eine Testzeichenfolge an:The index.html page for each VM displays a test string:

  • Der erste virtuelle Computer zeigt den Wert Image A an.First VM displays the value Image A
  • Der zweite virtuelle Computer zeigt den Wert Image B an.Second VM displays the value Image B

Mit diese Zeichenfolge soll das Konfigurieren der virtuellen Computer mit jeweils anderer Software imitiert werden.This string is meant to mimic configuring each VM with different software.

Es gibt zwei Möglichkeiten, das Beispielplaybook abzurufen:There are two ways to get the sample playbook:

  • Laden Sie das Playbook herunter, und speichern Sie es als create_vms.yml.Download the playbook and save it to create_vms.yml.
  • Erstellen Sie eine neue Datei mit dem Namen create_vms.yml, und kopieren Sie die folgenden Inhalte in diese Datei:Create a new file named create_vms.yml and copy into it the following contents:
- name: Create two VMs (A and B) with HTTPS
  hosts: localhost
  connection: local
  vars:
    vm_name: vmforimage
    admin_username: testuser
    admin_password: Pass123$$$abx!
    location: eastus
  tasks:
  - name: Create a resource group
    azure_rm_resourcegroup:
      name: "{{ resource_group }}"
      location: "{{ location }}"

  - name: Create virtual network
    azure_rm_virtualnetwork:
      resource_group: "{{ resource_group }}"
      name: "{{ vm_name }}"
      address_prefixes: "10.0.0.0/16"

  - name: Create subnets for VM A and B
    azure_rm_subnet:
      resource_group: "{{ resource_group }}"
      virtual_network: "{{ vm_name }}"
      name: "{{ vm_name }}"
      address_prefix: "10.0.1.0/24"

  - name: Create Network Security Group that allows HTTP
    azure_rm_securitygroup:
      resource_group: "{{ resource_group }}"
      name: "{{ vm_name }}"
      rules:
        - name: HTTP
          protocol: Tcp
          destination_port_range: 80
          access: Allow
          priority: 1002
          direction: Inbound

  - name: Create public IP addresses for VM A and B
    azure_rm_publicipaddress:
      resource_group: "{{ resource_group }}"
      allocation_method: Static
      name: "{{ vm_name }}_{{ item }}"
    loop:
      - A
      - B
    register: pip_output

  - name: Create virtual network inteface cards for VM A and B
    azure_rm_networkinterface:
      resource_group: "{{ resource_group }}"
      name: "{{ vm_name }}_{{ item }}"
      virtual_network: "{{ vm_name }}"
      subnet: "{{ vm_name }}"
      public_ip_name: "{{ vm_name }}_{{ item }}"
      security_group: "{{ vm_name }}"
    loop:
      - A
      - B

  - name: Create VM A and B
    azure_rm_virtualmachine:
      resource_group: "{{ resource_group }}"
      name: "{{ vm_name }}{{ item }}"
      admin_username: "{{ admin_username }}"
      admin_password: "{{ admin_password }}"
      vm_size: Standard_B1ms
      network_interfaces: "{{ vm_name }}_{{ item }}"
      image:
        offer: UbuntuServer
        publisher: Canonical
        sku: 16.04-LTS
        version: latest
    loop:
      - A
      - B

  - name: Create VM Extension
    azure_rm_virtualmachineextension:
      resource_group: "{{ resource_group }}"
      name: testVMExtension
      virtual_machine_name: "{{ vm_name }}{{ item }}"
      publisher: Microsoft.Azure.Extensions
      virtual_machine_extension_type: CustomScript
      type_handler_version: 2.0
      auto_upgrade_minor_version: true
      settings: {"commandToExecute": "sudo apt-get -y install apache2"}
    loop:
      - A
      - B

  - name: Create VM Extension
    azure_rm_virtualmachineextension:
      resource_group: "{{ resource_group }}"
      name: testVMExtension
      virtual_machine_name: "{{ vm_name }}{{ item }}"
      publisher: Microsoft.Azure.Extensions
      virtual_machine_extension_type: CustomScript
      type_handler_version: 2.0
      auto_upgrade_minor_version: true
      settings: {"commandToExecute": "printf '<html><body><h1>Image {{ item }}</h1></body></html>' >> index.html; sudo cp index.html /var/www/html/"}
    loop:
      - A
      - B

  - debug:
      msg: "Public IP Address A: {{ pip_output.results[0].state.ip_address }}"

  - debug:
      msg: "Public IP Address B: {{ pip_output.results[1].state.ip_address }}"

Führen Sie das Playbook mit dem Befehl ansible-playbook aus, und ersetzen Sie dabei myrg durch den Namen Ihrer Ressourcengruppe:Run the playbook using the ansible-playbook command, replacing myrg with your resource group name:

ansible-playbook create-vms.yml --extra-vars "resource_group=myrg"

Aufgrund der debug-Abschnitte des Playbooks gibt der Befehl ansible-playbook die IP-Adressen der einzelnen virtuellen Computer aus.Because of the debug sections of the playbook, the ansible-playbook command will print the IP address of each VM. Kopieren Sie diese IP-Adressen für die spätere Verwendung.Copy these IP addresses for later use.

IP-Adressen der virtuellen Computer

Herstellen einer Verbindung mit den beiden virtuellen ComputernConnect to the two VMs

In diesem Abschnitt stellen Sie eine Verbindung mit beiden virtuellen Computern her.In this section, you connect to each VM. Wie im vorherigen Abschnitt erwähnt, imitieren die Zeichenfolgen Image A und Image B zwei verschiedene virtuelle Computer mit unterschiedlichen Konfigurationen.As mentioned in the previous section, the strings Image A and Image B mimic having two distinct VMs with different configurations.

Verwenden Sie die IP-Adressen aus dem vorherigen Abschnitt, um eine Verbindung mit beiden virtuellen Computern herzustellen:Using the IP addresses from the previous section, connect to both VMs:

Screenshot des virtuellen Computers A

Screenshot des virtuellen Computers B

Erstellen von Images von jedem virtuellen ComputerCreate images from each VM

An dieser Stelle haben Sie zwei virtuelle Computer mit geringfügig unterschiedlichen Konfigurationen (ihre index.html-Dateien).At this point, you have two VMs with slightly different configurations (their index.html files).

Mit dem Playbookcode in diesem Abschnitt wird für jeden virtuellen Computer ein benutzerdefiniertes Image erstellt.The playbook code in this section creates a custom image for each VM:

  • image_vmforimageA: benutzerdefiniertes Image für den virtuellen Computer, auf dessen Startseite Image A angezeigt wirdimage_vmforimageA - Custom image created for the VM that displays Image A on its home page.
  • image_vmforimageB: benutzerdefiniertes Images für den virtuellen Computer, auf dessen Startseite Image B angezeigt wirdimage_vmforimageB - Custom image created for the VM that displays Image B on its home page.

Es gibt zwei Möglichkeiten, das Beispielplaybook abzurufen:There are two ways to get the sample playbook:

  • Laden Sie das Playbook herunter, und speichern Sie es als capture-images.yml.Download the playbook and save it to capture-images.yml.
  • Erstellen Sie eine neue Datei mit dem Namen capture-images.yml, und kopieren Sie die folgenden Inhalte in diese Datei:Create a new file named capture-images.yml and copy into it the following contents:
- name: Capture VM Images
  hosts: localhost
  connection: local
  vars:
    vm_name: vmforimage
  tasks:

  - name: Stop and generalize VMs
    azure_rm_virtualmachine:
      resource_group: "{{ resource_group }}"
      name: "{{ vm_name }}{{ item }}"
      generalized: yes
    loop:
      - A
      - B

  - name: Create an images from a VMs
    azure_rm_image:
      resource_group: "{{ resource_group }}"
      name: "image_{{ vm_name }}{{ item }}"
      source: "{{ vm_name }}{{ item }}"
    loop:
      - A
      - B

Führen Sie das Playbook mit dem Befehl ansible-playbook aus, und ersetzen Sie dabei myrg durch den Namen Ihrer Ressourcengruppe:Run the playbook using the ansible-playbook command, replacing myrg with your resource group name:

ansible-playbook capture-images.yml --extra-vars "resource_group=myrg"

Erstellen der Skalierungsgruppe mit Image ACreate scale set using Image A

In diesem Abschnitt wird ein Playbook verwendet, um die folgenden Azure-Ressourcen zu konfigurieren:In this section, a playbook is used to configure the following Azure resources:

  • Öffentliche IP-AdressePublic IP address
  • Load BalancerLoad balancer
  • Skalierungsgruppe, die auf image_vmforimageA verweistScale set that references image_vmforimageA

Es gibt zwei Möglichkeiten, das Beispielplaybook abzurufen:There are two ways to get the sample playbook:

  • Laden Sie das Playbook herunter, und speichern Sie es als create-vmss.yml.Download the playbook and save it to create-vmss.yml.
  • Erstellen Sie eine neue Datei mit dem Namen create-vmss.yml, und kopieren Sie die folgenden Inhalte in diese Datei:Create a new file named create-vmss.yml and copy into it the following contents:"
---
- hosts: localhost
  vars:
    vmss_name: vmsstest
    location: eastus
    admin_username: vmssadmin
    admin_password: User123!!!abc
    vm_name: vmforimage
    image_name: "image_vmforimageA"

  tasks:

    - name: Create public IP address
      azure_rm_publicipaddress:
        resource_group: "{{ resource_group }}"
        allocation_method: Static
        name: "{{ vmss_name }}"
      register: pip_output

    - name: Create a load balancer
      azure_rm_loadbalancer:
        name: "{{ vmss_name }}lb"
        location: "{{ location }}"
        resource_group: "{{ resource_group }}"
        public_ip: "{{ vmss_name }}"
        probe_protocol: Tcp
        probe_port: 80
        probe_interval: 10
        probe_fail_count: 3
        protocol: Tcp
        load_distribution: Default
        frontend_port: 80
        backend_port: 80
        idle_timeout: 4
        natpool_frontend_port_start: 50000
        natpool_frontend_port_end: 50040
        natpool_backend_port: 22
        natpool_protocol: Tcp

    - name: Create a scale set
      azure_rm_virtualmachinescaleset:
        resource_group: "{{ resource_group }}"
        name: "{{ vmss_name }}"
        vm_size: Standard_DS1_v2
        admin_username: "{{ admin_username }}"
        admin_password: "{{ admin_password }}"
        ssh_password_enabled: true
        capacity: 2
        virtual_network_name: "{{ vm_name }}"
        subnet_name: "{{ vm_name }}"
        upgrade_policy: Manual
        tier: Standard
        managed_disk_type: Standard_LRS
        os_disk_caching: ReadWrite
        image:
          name: "{{ image_name }}"
          resource_group: "{{ resource_group }}"
        load_balancer: "{{ vmss_name }}lb"

    - debug:
        msg: "Scale set public IP address: {{ pip_output.state.ip_address }}"

Führen Sie das Playbook mit dem Befehl ansible-playbook aus, und ersetzen Sie dabei myrg durch den Namen Ihrer Ressourcengruppe:Run the playbook using the ansible-playbook command, replacing myrg with your resource group name:

ansible-playbook create-vmss.yml --extra-vars "resource_group=myrg"

Aufgrund des debug-Abschnitt des Playbooks gibt der Befehl ansible-playbook die IP-Adresse der Skalierungsgruppe aus.Because of the debug section of the playbook, the ansible-playbook command will print the IP address of the scale set. Kopieren Sie diese IP-Adresse für die spätere Verwendung.Copy this IP address for later use.

Öffentliche IP-Adresse

Herstellen einer Verbindung mit der SkalierungsgruppeConnect to the scale set

In diesem Abschnitt stellen Sie eine Verbindung mit der Skalierungsgruppe her.In this section, you connect to the scale set.

Verwenden Sie die IP-Adresse aus dem vorherigen Abschnitt, um eine Verbindung mit der Skalierungsgruppe herzustellen:Using the IP address from the previous section, connect to the scale set.

Wie im vorherigen Abschnitt erwähnt, imitieren die Zeichenfolgen Image A und Image B zwei verschiedene virtuelle Computer mit unterschiedlichen Konfigurationen.As mentioned in the previous section, the strings Image A and Image B mimic having two distinct VMs with different configurations.

Die Skalierungsgruppe verweist auf das benutzerdefinierte Image namens image_vmforimageA.The scale set references the custom image named image_vmforimageA. Das benutzerdefinierte Image image_vmforimageA wurde aus dem virtuellen Computer erstellt, auf dessen Startseite Image A angezeigt wird.Custom image image_vmforimageA was created from the VM whose home page displays Image A.

Daher sehen Sie eine Startseite, die Image Aanzeigt:As a result, you see a home page displaying Image A:

Die Skalierungsgruppe ist dem ersten virtuellen Computer zugeordnet.

Lassen Sie das Browserfenster geöffnet, während Sie mit dem nächsten Abschnitt fortfahren.Leave your browser window open as you continue to the next section.

Ändern des benutzerdefinierte Image in der Skalierungsgruppe und Aktualisieren von InstanzenChange custom image in scale set and upgrade instances

Mit dem Playbookcode in diesem Abschnitt wird das Image der Skalierungsgruppe von image_vmforimageA in image_vmforimageB geändert.The playbook code in this section changes the scale set's image - from image_vmforimageA to image_vmforimageB. Außerdem werden alle derzeit bereitgestellten virtuellen Computer von der Skalierungsgruppe aktualisiert.Also, all current virtual machines deployed by the scale set are updated.

Es gibt zwei Möglichkeiten, das Beispielplaybook abzurufen:There are two ways to get the sample playbook:

  • Laden Sie das Playbook herunter, und speichern Sie es als update-vmss-image.yml.Download the playbook and save it to update-vmss-image.yml.
  • Erstellen Sie eine neue Datei mit dem Namen update-vmss-image.yml, und kopieren Sie die folgenden Inhalte in diese Datei:Create a new file named update-vmss-image.yml and copy into it the following contents:
- name: Update scale set image reference
  hosts: localhost
  connection: local
  vars:
    vmss_name: vmsstest
    image_name: image_vmforimageB
    admin_username: vmssadmin
    admin_password: User123!!!abc
  tasks:

  - name: Update scale set - second image
    azure_rm_virtualmachinescaleset:
      resource_group: "{{ resource_group }}"
      name: "{{ vmss_name }}"
      vm_size: Standard_DS1_v2
      admin_username: "{{ admin_username }}"
      admin_password: "{{ admin_password }}"
      ssh_password_enabled: true
      capacity: 3
      virtual_network_name: "{{ vmss_name }}"
      subnet_name: "{{ vmss_name }}"
      upgrade_policy: Manual
      tier: Standard
      managed_disk_type: Standard_LRS
      os_disk_caching: ReadWrite
      image:
        name: "{{ image_name }}"
        resource_group: "{{ resource_group }}"
      load_balancer: "{{ vmss_name }}lb"

  - name: List all of the instances
    azure_rm_virtualmachinescalesetinstance_facts:
      resource_group: "{{ resource_group }}"
      vmss_name: "{{ vmss_name }}"
    register: instances

  - debug:
      var: instances

  - name: manually upgrade all the instances 
    azure_rm_virtualmachinescalesetinstance:
      resource_group: "{{ resource_group }}"
      vmss_name: "{{ vmss_name }}"
      instance_id: "{{ item.instance_id }}"
      latest_model: yes
    with_items: "{{ instances.instances }}"

Führen Sie das Playbook mit dem Befehl ansible-playbook aus, und ersetzen Sie dabei myrg durch den Namen Ihrer Ressourcengruppe:Run the playbook using the ansible-playbook command, replacing myrg with your resource group name:

ansible-playbook update-vmss-image.yml --extra-vars "resource_group=myrg"

Kehren Sie zum Browser zurück, und aktualisieren Sie die Seite.Return to the browser and refresh the page.

Sie sehen, dass das dem virtuellen Computer zugrunde liegende benutzerdefinierte Image aktualisiert wurde.You see that virtual machine's underlying custom image is updated.

Die Skalierungsgruppe ist dem zweiten virtuellen Computer zugeordnet.

Bereinigen von RessourcenClean up resources

Löschen Sie die in diesem Artikel erstellten Ressourcen, wenn Sie sie nicht mehr benötigen.When no longer needed, delete the resources created in this article.

Speichern Sie den folgenden Code als cleanup.yml:Save the following code as cleanup.yml:

- hosts: localhost
  vars:
    resource_group: myrg
  tasks:
    - name: Delete a resource group
      azure_rm_resourcegroup:
        name: "{{ resource_group }}"
        force_delete_nonempty: yes
        state: absent

Führen Sie das Playbook mithilfe des Befehls ansible-playbook aus:Run the playbook using the ansible-playbook command:

ansible-playbook cleanup.yml

Nächste SchritteNext steps