Sdílet prostřednictvím


Kurz: Aktualizace vlastní image škálovacích sad virtuálních počítačů Azure pomocí Ansible

Důležité

K spuštění ukázkových playbooků v tomto článku se vyžaduje Ansible 2.8 (nebo novější).

Škálovací sady virtuálních počítačů Azure jsou funkce Azure, která umožňuje nakonfigurovat skupinu identických virtuálních počítačů s vyrovnáváním zatížení. Škálovací sady nejsou žádné další náklady a jsou sestavené z virtuálních počítačů. Platíte jenom za základní výpočetní prostředky, jako jsou instance virtuálních počítačů, nástroje pro vyrovnávání zatížení nebo úložiště spravovaných disků. Škálovací sady poskytují vrstvy správy a automatizace pro spouštění a škálování aplikací. Místo toho můžete ručně vytvářet a spravovat jednotlivé virtuální počítače. Použití škálovacích sad ale má dvě klíčové výhody. Jsou integrované do Azure a automaticky škálují vaše virtuální počítače tak, aby vyhovovaly potřebám aplikací.

Po nasazení virtuálního počítače nakonfigurujete virtuální počítač se softwarem, který vaše aplikace potřebuje. Místo této úlohy konfigurace pro každý virtuální počítač můžete vytvořit vlastní image. Vlastní image je snímek existujícího virtuálního počítače, který obsahuje veškerý nainstalovaný software. Při konfiguraci škálovací sady zadáte image, která se má použít pro virtuální počítače dané škálovací sady. Pomocí vlastní image je každá instance virtuálního počítače pro vaši aplikaci stejně nakonfigurovaná. Někdy může být potřeba aktualizovat vlastní image škálovací sady. Tento úkol je zaměřen na tento kurz.

V tomto článku získáte informace o těchto tématech:

  • Konfigurace dvou virtuálních počítačů pomocí HTTPD
  • Vytvoření vlastní image z existujícího virtuálního počítače
  • Vytvoření škálovací sady z image
  • Aktualizace vlastní image

Požadavky

  • Předplatné Azure: Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet před tím, než začnete.

Konfigurace dvou virtuálních počítačů

Kód playbooku v této části vytvoří dva virtuální počítače s protokolem HTTPD nainstalovaným na obou počítačích.

Na index.html stránce pro každý virtuální počítač se zobrazí testovací řetězec:

  • První virtuální počítač zobrazí hodnotu. Image A
  • Druhý virtuální počítač zobrazí hodnotu. Image B

Tento řetězec má napodobovat konfiguraci jednotlivých virtuálních počítačů s jiným softwarem.

Ukázkový playbook můžete získat dvěma způsoby:

  • Stáhněte playbook a uložte ho do create_vms.ymlsouboru .

  • Vytvořte nový soubor s názvem create_vms.yml. Do nového souboru vložte následující kód.

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

Spusťte playbook pomocí ansible-playbook příkazu a nahraďte myrg názvem vaší skupiny prostředků:

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

debug Vzhledem k oddílům playbooku ansible-playbook příkaz vytiskne IP adresu každého virtuálního počítače. Zkopírujte tyto IP adresy pro pozdější použití.

Připojení ke dvěma virtuálním počítačům

V této části se připojíte ke každému virtuálnímu počítači. Jak jsme zmínili v předchozí části, řetězce Image A a Image B napodobují se dvěma odlišnými virtuálními počítači s různými konfiguracemi.

Pomocí IP adres z předchozí části otevřete prohlížeč a připojte se k jednotlivým virtuálním počítačům.

Vytváření imagí z každého virtuálního počítače

V tomto okamžiku máte dva virtuální počítače s mírně odlišnými konfiguracemi (jejich index.html soubory).

Kód playbooku v této části vytvoří vlastní image pro každý virtuální počítač:

  • image_vmforimageA – Vlastní image vytvořená pro virtuální počítač, který se zobrazuje Image A na jeho domovské stránce.
  • image_vmforimageB – Vlastní image vytvořená pro virtuální počítač, který se zobrazuje Image B na jeho domovské stránce.

Ukázkový playbook můžete získat dvěma způsoby:

  • Stáhněte playbook a uložte ho do capture-images.ymlsouboru .

  • Vytvořte nový soubor s názvem capture-images.yml. Do nového souboru vložte následující kód:

- 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

Spusťte playbook pomocí ansible-playbook příkazu a nahraďte myrg názvem vaší skupiny prostředků:

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

Vytvoření škálovací sady pomocí image A

V této části se playbook používá ke konfiguraci následujících prostředků Azure:

  • Veřejná IP adresa
  • Load Balancer
  • Škálovací sada, která odkazuje na image_vmforimageA

Ukázkový playbook můžete získat dvěma způsoby:

  • Stáhněte playbook a uložte ho do create-vmss.ymlsouboru .

  • Vytvořte nový soubor s názvem create-vmss.yml. Do nového souboru vložte následující kód:

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

Spusťte playbook pomocí ansible-playbook příkazu a nahraďte myrg názvem vaší skupiny prostředků:

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

Vzhledem k debug části playbooku ansible-playbook příkaz vytiskne IP adresu škálovací sady. Zkopírujte tuto IP adresu pro pozdější použití.

Připojení ke škálovací sadě

Pomocí IP adresy z předchozí části se připojte ke škálovací sadě.

Jak jsme zmínili v předchozí části, řetězce Image A a Image B napodobují se dvěma odlišnými virtuálními počítači s různými konfiguracemi.

Škálovací sada odkazuje na vlastní image s názvem image_vmforimageA. Vlastní image image_vmforimageA byla vytvořena z virtuálního počítače, jehož domovská stránka se zobrazí Image A.

V důsledku toho se zobrazí domovská stránka, která se zobrazí Image A.

Nechte okno prohlížeče otevřené, až budete pokračovat k další části.

Změna vlastní image ve škálovací sadě a instancích upgradu

Kód playbooku v této části změní obrázek škálovací sady – od image_vmforimageA do image_vmforimageB. Aktualizují se také všechny aktuální virtuální počítače nasazené škálovací sadou.

Ukázkový playbook můžete získat dvěma způsoby:

  • Stáhněte playbook a uložte ho do update-vmss-image.ymlsouboru .

  • Vytvořte nový soubor s názvem update-vmss-image.yml. Do nového souboru vložte následující kód:

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

Spusťte playbook pomocí ansible-playbook příkazu a nahraďte myrg názvem vaší skupiny prostředků:

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

Vraťte se do prohlížeče a aktualizujte stránku, abyste viděli, že se aktualizovala základní vlastní image virtuálního počítače.

Vyčištění prostředků

  1. Uložte následující kód jako delete_rg.yml.

    ---
    - hosts: localhost
      tasks:
        - name: Deleting resource group - "{{ name }}"
          azure_rm_resourcegroup:
            name: "{{ name }}"
            state: absent
          register: rg
        - debug:
            var: rg
    
  2. Spusťte playbook pomocí příkazu ansible-playbook . Zástupný symbol nahraďte názvem skupiny prostředků, která se má odstranit. Odstraní se všechny prostředky v rámci skupiny prostředků.

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

    Klíčové body:

    • register Vzhledem k proměnné a debug části playbooku se výsledky zobrazí po dokončení příkazu.

Další kroky