Öğretici: Ansible kullanarak Azure sanal makine ölçek kümelerinin özel görüntüsünü güncelleştirme

Önemli

Bu makaledeki örnek playbook'ları çalıştırmak için Ansible 2.8 (veya üzeri) gereklidir.

Azure sanal makine ölçek kümeleri , aynı, yük dengeli VM'lerden oluşan bir grup yapılandırmanıza olanak tanıyan bir Azure özelliğidir. Kümeleri ölçeklendirmek için ek maliyet yoktur ve bunlar sanal makinelerden oluşturulur. Yalnızca VM örnekleri, yük dengeleyiciler veya Yönetilen Disk depolama alanı gibi temel işlem kaynakları için ödeme yapın. Ölçek kümeleri ile, uygulamalarınızı çalıştırmak ve ölçeklendirmek için yönetim ve otomasyon katmanları sağlanır. Bunun yerine tek tek VM'leri el ile oluşturabilir ve yönetebilirsiniz. Ancak ölçek kümelerini kullanmanın iki temel avantajı vardır. Azure'da yerleşik olarak bulunurlar ve sanal makinelerinizi uygulama gereksinimlerini karşılayacak şekilde otomatik olarak ölçeklendirirler.

Vm dağıtıldıktan sonra, VM'yi uygulamanızın ihtiyaç duyduğu yazılımla yapılandırabilirsiniz. Bu yapılandırma görevini her VM için yapmak yerine özel bir görüntü oluşturabilirsiniz. Özel görüntü, yüklü yazılımları içeren mevcut bir VM'nin anlık görüntüsüdür. Bir ölçek kümesini yapılandırırken , bu ölçek kümesinin VM'leri için kullanılacak görüntüyü belirtirsiniz. Özel görüntü kullanıldığında, her VM örneği uygulamanız için aynı şekilde yapılandırılır. Bazen ölçek kümenizin özel görüntüsünü güncelleştirmeniz gerekebilir. Bu görev, bu öğreticinin odak noktasıdır.

Bu makalede şunları öğreneceksiniz:

  • HTTPD ile iki VM yapılandırma
  • Mevcut bir VM'den özel görüntü oluşturma
  • Görüntüden ölçek kümesi oluşturma
  • Özel görüntüyü güncelleştirme

Önkoşullar

  • Azure aboneliği: Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.

İki VM yapılandırma

Bu bölümdeki playbook kodu, her ikisinde de HTTPD yüklü iki sanal makine oluşturur.

Her VM'nin index.html sayfasında bir test dizesi görüntülenir:

  • İlk VM değeri görüntüler Image A
  • İkinci VM değeri görüntüler Image B

Bu dize, her vm'nin farklı yazılımlarla yapılandırılmasını taklit etmek için kullanılır.

Örnek playbook'u almanın iki yolu vardır:

  • Playbook'u indirin ve öğesine create_vms.ymlkaydedin.

  • create_vms.yml adlı yeni bir dosya oluşturun. Yeni dosyaya aşağıdaki kodu ekleyin.

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

komutunu kullanarak ansible-playbook playbook'u çalıştırın ve yerine myrg kaynak grubunuzun adını yazın:

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

debug Playbook'un bölümleri nedeniyle komut, ansible-playbook her vm'nin IP adresini yazdırır. Bu IP adreslerini daha sonra kullanmak üzere kopyalayın.

İki VM'ye bağlanma

Bu bölümde her vm'ye bağlanacaksınız. Önceki bölümde belirtildiği gibi, dizeler ve Image B farklı yapılandırmalara Image A sahip iki ayrı VM'ye sahip olduğunu taklit eder.

Önceki bölümdeki IP adreslerini kullanarak bir tarayıcı açın ve her vm'ye bağlanın.

Her VM'den görüntü oluşturma

Bu noktada, biraz farklı yapılandırmalara (dosyaları) index.html sahip iki VM'niz vardır.

Bu bölümdeki playbook kodu her VM için özel bir görüntü oluşturur:

  • image_vmforimageA - Giriş sayfasında görüntülenen Image A VM için oluşturulan özel görüntü.
  • image_vmforimageB - Giriş sayfasında görüntülenen Image B VM için oluşturulan özel görüntü.

Örnek playbook'u almanın iki yolu vardır:

  • Playbook'u indirin ve öğesine capture-images.ymlkaydedin.

  • capture-images.yml adlı yeni bir dosya oluşturun. Yeni dosyaya aşağıdaki kodu ekleyin:

- 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

komutunu kullanarak ansible-playbook playbook'u çalıştırın ve yerine myrg kaynak grubunuzun adını yazın:

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

Görüntü A kullanarak ölçek kümesi oluşturma

Bu bölümde, aşağıdaki Azure kaynaklarını yapılandırmak için bir playbook kullanılır:

  • Genel IP adresi
  • Yük Dengeleyici
  • Başvuran ölçek kümesi image_vmforimageA

Örnek playbook'u almanın iki yolu vardır:

  • Playbook'u indirin ve öğesine create-vmss.ymlkaydedin.

  • create-vmss.yml adlı yeni bir dosya oluşturun. Yeni dosyaya aşağıdaki kodu ekleyin:

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

komutunu kullanarak ansible-playbook playbook'u çalıştırın ve yerine myrg kaynak grubunuzun adını yazın:

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

debug Playbook'un bölümü nedeniyle, ansible-playbook komut ölçek kümesinin IP adresini yazdırır. Bu IP adresini daha sonra kullanmak üzere kopyalayın.

Ölçek kümesine bağlanma

Önceki bölümdeki IP adresini kullanarak ölçek kümesine bağlanın.

Önceki bölümde belirtildiği gibi, dizeler ve Image B farklı yapılandırmalara Image A sahip iki ayrı VM'ye sahip olduğunu taklit eder.

Ölçek kümesi adlı image_vmforimageAözel görüntüye başvurur. Giriş sayfasında görüntülenen Image AVM'den özel görüntü image_vmforimageA oluşturuldu.

Sonuç olarak, görüntülenen Image Abir giriş sayfası görürsünüz.

Sonraki bölüme devam ettikçe tarayıcı pencerenizi açık bırakın.

Ölçek kümesinde özel görüntüyü değiştirme ve örnekleri yükseltme

Bu bölümdeki playbook kodu, ölçek kümesinin görüntüsünü olarak image_vmforimageA image_vmforimageBdeğiştirir. Ayrıca, ölçek kümesi tarafından dağıtılan tüm geçerli sanal makineler güncelleştirilir.

Örnek playbook'u almanın iki yolu vardır:

  • Playbook'u indirin ve öğesine update-vmss-image.ymlkaydedin.

  • update-vmss-image.yml adlı yeni bir dosya oluşturun. Yeni dosyaya aşağıdaki kodu ekleyin:

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

komutunu kullanarak ansible-playbook playbook'u çalıştırın ve yerine myrg kaynak grubunuzun adını yazın:

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

Sanal makinenin temel alınan özel görüntüsünün güncelleştirildiğini görmek için tarayıcıya dönün ve sayfayı yenileyin.

Kaynakları temizleme

  1. Aşağıdaki kodu olarak delete_rg.ymlkaydedin.

    ---
    - hosts: localhost
      tasks:
        - name: Deleting resource group - "{{ name }}"
          azure_rm_resourcegroup:
            name: "{{ name }}"
            state: absent
          register: rg
        - debug:
            var: rg
    
  2. ansible-playbook komutunu kullanarak playbook'u çalıştırın. Yer tutucuyu silinecek kaynak grubunun adıyla değiştirin. Kaynak grubundaki tüm kaynaklar silinir.

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

    Önemli noktalar:

    • Playbook'un register değişkeni ve debug bölümü nedeniyle, komut tamamlandığında sonuçlar görüntülenir.

Sonraki adımlar