Självstudie: Uppdatera den anpassade avbildningen av skalningsuppsättningar för virtuella Azure-datorer med Ansible

Viktigt!

Ansible 2.8 (eller senare) krävs för att köra exempelspelböckerna i den här artikeln.

Skalningsuppsättningar för virtuella Azure-datorer är en Azure-funktion som gör att du kan konfigurera en grupp med identiska, belastningsutjämningade virtuella datorer. Det finns ingen extra kostnad för skalningsuppsättningar och de skapas från virtuella datorer. Du betalar bara för underliggande beräkningsresurser, till exempel VM-instanser, lastbalanserare eller managed disk-lagring. Med skalningsuppsättningar tillhandahålls hantering och automatiseringsnivåer för körning och skalning av dina program. Du kan i stället skapa och hantera enskilda virtuella datorer manuellt. Det finns dock två viktiga fördelar med att använda skalningsuppsättningar. De är inbyggda i Azure och de skalar automatiskt dina virtuella datorer efter programbehov.

När en virtuell dator har distribuerats konfigurerar du den virtuella datorn med den programvara som din app behöver. I stället för att göra den här konfigurationsuppgiften för varje virtuell dator kan du skapa en anpassad avbildning. En anpassad avbildning är en ögonblicksbild av en befintlig virtuell dator som innehåller alla installerade program. När du konfigurerar en skalningsuppsättning anger du den avbildning som ska användas för skalningsuppsättningens virtuella datorer. Genom att använda en anpassad avbildning är varje VM-instans identiskt konfigurerad för din app. Ibland kan du behöva uppdatera skalningsuppsättningens anpassade avbildning. Den uppgiften är i fokus för den här självstudien.

I den här artikeln kan du se hur du:

  • Konfigurera två virtuella datorer med HTTPD
  • Skapa en anpassad avbildning från en befintlig virtuell dator
  • Skapa en skalningsuppsättning från en bild
  • Uppdatera den anpassade avbildningen

Förutsättningar

  • Azure-prenumeration: Om du inte har någon Azure-prenumeration kan du skapa ett kostnadsfritt konto innan du börjar.

Konfigurera två virtuella datorer

Spelbokskoden i det här avsnittet skapar två virtuella datorer med HTTPD installerat på båda.

Sidan index.html för varje virtuell dator visar en teststräng:

  • Den första virtuella datorn visar värdet Image A
  • Den andra virtuella datorn visar värdet Image B

Den här strängen är avsedd att efterlikna konfigurering av varje virtuell dator med olika programvara.

Det finns två sätt att hämta exempelspelboken:

  • Ladda ned spelboken och spara den i create_vms.yml.

  • Skapa en ny fil med namnet create_vms.yml. Infoga följande kod i den nya filen.

- 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 }}"

Kör spelboken med ansible-playbook kommandot och ersätt myrg med resursgruppens namn:

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

På grund av avsnitten debug i spelboken ansible-playbook skriver kommandot ut IP-adressen för varje virtuell dator. Kopiera dessa IP-adresser för senare användning.

Virtual machine IP addresses

Anslut till de två virtuella datorerna

I det här avsnittet ansluter du till varje virtuell dator. Som nämnts i föregående avsnitt har strängarna Image A och Image B härmar två distinkta virtuella datorer med olika konfigurationer.

Använd IP-adresserna från föregående avsnitt och anslut till båda de virtuella datorerna:

Screenshot from virtual machine A

Screenshot from virtual machine B

Skapa avbildningar från varje virtuell dator

Nu har du två virtuella datorer med lite olika konfigurationer (deras index.html filer).

Spelbokskoden i det här avsnittet skapar en anpassad avbildning för varje virtuell dator:

  • image_vmforimageA – Anpassad avbildning som skapats för den virtuella dator som visas Image A på startsidan.
  • image_vmforimageB – Anpassad avbildning som skapats för den virtuella dator som visas Image B på startsidan.

Det finns två sätt att hämta exempelspelboken:

  • Ladda ned spelboken och spara den i capture-images.yml.

  • Skapa en ny fil med namnet capture-images.yml. Infoga följande kod i den nya filen:

- 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

Kör spelboken med ansible-playbook kommandot och ersätt myrg med resursgruppens namn:

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

Skapa skalningsuppsättning med bild A

I det här avsnittet används en spelbok för att konfigurera följande Azure-resurser:

  • Offentlig IP-adress
  • Lastbalanserare
  • Skalningsuppsättning som refererar till image_vmforimageA

Det finns två sätt att hämta exempelspelboken:

  • Ladda ned spelboken och spara den i create-vmss.yml.

  • Skapa en ny fil med namnet create-vmss.yml. Infoga följande kod i den nya filen:

---
- 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 }}"

Kör spelboken med ansible-playbook kommandot och ersätt myrg med resursgruppens namn:

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

På grund av debug avsnittet i spelboken ansible-playbook skriver kommandot ut IP-adressen för skalningsuppsättningen. Kopiera den här IP-adressen för senare användning.

Public IP Address

Anslut till skalningsuppsättningen

I det här avsnittet ansluter du till skalningsuppsättningen.

Anslut till skalningsuppsättningen med hjälp av IP-adressen från föregående avsnitt.

Som nämnts i föregående avsnitt har strängarna Image A och Image B härmar två distinkta virtuella datorer med olika konfigurationer.

Skalningsuppsättningen refererar till den anpassade avbildningen med namnet image_vmforimageA. Anpassad avbildning image_vmforimageA skapades från den virtuella dator vars startsida visar Image A.

Därför visas en startsida som visar Image A:

The scale set is associated with the first VM.

Låt webbläsarfönstret vara öppet medan du fortsätter till nästa avsnitt.

Ändra anpassad avbildning i skalningsuppsättningar och uppgraderingsinstanser

Spelbokskoden i det här avsnittet ändrar skalningsuppsättningens avbildning – från image_vmforimageA till image_vmforimageB. Dessutom uppdateras alla aktuella virtuella datorer som distribueras av skalningsuppsättningen.

Det finns två sätt att hämta exempelspelboken:

  • Ladda ned spelboken och spara den i update-vmss-image.yml.

  • Skapa en ny fil med namnet update-vmss-image.yml. Infoga följande kod i den nya filen:

- 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 }}"

Kör spelboken med ansible-playbook kommandot och ersätt myrg med resursgruppens namn:

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

Gå tillbaka till webbläsaren och uppdatera sidan.

Du ser att den virtuella datorns underliggande anpassade avbildning uppdateras.

The scale set is associated with the second VM

Rensa resurser

  1. Spara följande kod som delete_rg.yml.

    ---
    - hosts: localhost
      tasks:
        - name: Deleting resource group - "{{ name }}"
          azure_rm_resourcegroup:
            name: "{{ name }}"
            state: absent
          register: rg
        - debug:
            var: rg
    
  2. Kör spelboken med kommandot ansible-playbook . Ersätt platshållaren med namnet på den resursgrupp som ska tas bort. Alla resurser i resursgruppen tas bort.

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

    Viktiga punkter:

    • På grund av variabeln register och debug avsnittet i spelboken visas resultatet när kommandot har slutförts.

Nästa steg