Tutorial: Memperbarui gambar kustom set skala mesin virtual Azure menggunakan Ansible

Penting

Ansible 2.8 (atau yang lebih baru) diperlukan untuk menjalankan sampel playbook dalam artikel ini.

set skala komputer virtual Azure adalah fitur Azure yang memungkinkan Anda mengonfigurasi sebuah grup VM dengan beban seimbang yang identik. Tidak ada biaya tambahan untuk set skala dan ini dibangun dari mesin virtual. Anda hanya membayar untuk sumber daya komputasi dasar seperti instans VM, penyeimbang beban, atau penyimpanan Disk Terkelola. Dengan set skala, lapisan manajemen dan otomatisasi disediakan untuk menjalankan dan menskalakan aplikasi Anda. Anda dapat membuat dan mengelola VM individual secara manual. Namun, ada dua manfaat utama dari penggunaan set skala. Ini dibangun ke dalam Azure dan secara otomatis menskalakan mesin virtual Anda untuk memenuhi kebutuhan aplikasi.

Setelah VM disebarkan, konfigurasikan VM dengan perangkat lunak yang dibutuhkan aplikasi Anda. Alih-alih melakukan tugas konfigurasi ini untuk setiap VM, Anda dapat membuat gambar kustom. Gambar kustom adalah snapshot dari VM yang ada, yang menyertakan perangkat lunak apa pun yang terinstal. Saat mengonfigurasi set skala, Anda menentukan gambar yang akan digunakan untuk VM set skala tersebut. Dengan gambar kustom, setiap instans VM dikonfigurasi secara identik untuk aplikasi Anda. Terkadang, Anda akan perlu memperbarui gambar kustom set skala Anda. Tugas tesebut adalah fokus dari tutorial ini.

Dalam artikel ini, Anda akan mempelajari cara:

  • Mengonfigurasi dua VM dengan HTTPD
  • Membuat gambar kustom dari VM yang sudah ada
  • Membuat set skala dari gambar
  • Memperbarui gambar kustom

Prasyarat

  • Langganan Azure: Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum memulai.

Mengonfigurasi dua VM

Kode playbook di bagian ini akan membuat dua mesin virtual dengan HTTPD diinstal pada keduanya.

Halaman index.html untuk setiap VM akan menampilkan string uji:

  • VM pertama menampilkan nilai Image A
  • VM kedua menampilkan nilai Image B

String ini dimaksudkan untuk meniru konfigurasi setiap VM dengan perangkat lunak berbeda.

Ada dua cara untuk mendapatkan playbook sampel:

  • Unduh playbook dan simpan ke create_vms.yml.

  • Buat file baru bernama create_vms.yml. Masukkan kode berikut ke dalam file yang baru.

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

Jalankan playbook menggunakan perintah ansible-playbook, ganti myrg dengan nama grup sumber daya Anda:

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

Karena bagian debug playbook, perintah ansible-playbook akan mencetak alamat IP dari setiap VM. Salin alamat IP ini untuk digunakan nanti.

Virtual machine IP addresses

Hubungkan ke dua VM

Di bagian ini, Anda menghubungkan ke setiap VM. Seperti disebutkan di bagian sebelumnya, Image A string dan mimik Image B memiliki dua VM yang berbeda dengan konfigurasi yang berbeda.

Menggunakan alamat IP dari bagian sebelumnya, sambungkan ke kedua VM:

Screenshot from virtual machine A

Screenshot from virtual machine B

Buat gambar dari setiap VM

Pada titik ini, Anda memiliki dua VM dengan konfigurasi yang sedikit berbeda (file index.html mereka).

Kode playbook di bagian ini akan membuat gambar kustom untuk setiap VM:

  • image_vmforimageA - Gambar kustom yang dibuat untuk VM yang menampilkan Image A pada halaman berandanya.
  • image_vmforimageB - Gambar kustom yang dibuat untuk VM yang menampilkan Image B pada halaman berandanya.

Ada dua cara untuk mendapatkan playbook sampel:

  • Unduh playbook dan simpan ke capture-images.yml.

  • Buat file baru bernama capture-images.yml. Masukkan kode berikut ke file yang baru:

- 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

Jalankan playbook menggunakan perintah ansible-playbook, ganti myrg dengan nama grup sumber daya Anda:

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

Buat set skala menggunakan Gambar A

Di bagian ini, sebuah playbook digunakan untuk mengonfigurasi sumber daya Azure berikut:

  • Alamat IP publik
  • Load Balancer
  • Set skala yang merujuk image_vmforimageA

Ada dua cara untuk mendapatkan playbook sampel:

  • Unduh playbook dan simpan ke create-vmss.yml.

  • Buat file baru bernama create-vmss.yml. Masukkan kode berikut ke file yang baru:

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

Jalankan playbook menggunakan perintah ansible-playbook, ganti myrg dengan nama grup sumber daya Anda:

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

Karena bagian debug playbook, perintah ansible-playbook akan mencetak alamat IP set skala. Salin alamat IP untuk digunakan nanti.

Public IP Address

Hubungkan ke set skala

Di bagian ini, Anda menghubungkan ke set skala.

Menggunakan alamat IP dari bagian sebelumnya, sambungkan ke set skala.

Seperti disebutkan di bagian sebelumnya, Image A string dan mimik Image B memiliki dua VM yang berbeda dengan konfigurasi yang berbeda.

Set skala merujuk gambar kustom bernama image_vmforimageA. Gambar kustom image_vmforimageA dibuat dari VM yang halaman berandanya menampilkan Image A.

Hasilnya, Anda akan melihat halaman beranda yang menampilkan Image A:

The scale set is associated with the first VM.

Biarkan jendela browser Anda terbuka saat melanjutkan ke bagian berikutnya.

Mengubah gambar kustom dalam set skala dan meningkatkan instans

Kode playbook di bagian ini mengubah gambar set skala - dari image_vmforimageA ke image_vmforimageB. Selain itu, semua mesin virtual yang saat ini disebarkan oleh set skala diperbarui.

Ada dua cara untuk mendapatkan playbook sampel:

  • Unduh playbook dan simpan ke update-vmss-image.yml.

  • Buat file baru bernama update-vmss-image.yml. Masukkan kode berikut ke file yang baru:

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

Jalankan playbook menggunakan perintah ansible-playbook, ganti myrg dengan nama grup sumber daya Anda:

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

Kembali ke browser dan refresh halaman.

Anda melihat bahwa gambar kustom yang mendasari mesin virtual telah diperbarui.

The scale set is associated with the second VM

Membersihkan sumber daya

  1. Simpan kode berikut sebagai delete_rg.yml.

    ---
    - hosts: localhost
      tasks:
        - name: Deleting resource group - "{{ name }}"
          azure_rm_resourcegroup:
            name: "{{ name }}"
            state: absent
          register: rg
        - debug:
            var: rg
    
  2. Jalankan playbook menggunakan perintah ansible-playbook. Ganti tempat penampung dengan nama grup sumber daya yang akan dihapus. Semua sumber daya dalam grup sumber daya akan dihapus.

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

    Poin utama:

    • Karena variabel register dan bagian debug dari playbook, hasilnya akan ditampilkan ketika perintah selesai.

Langkah berikutnya