Oktatóanyag: Az Azure-beli virtuálisgép-méretezési csoportok egyéni rendszerképének frissítése az Ansible használatával

Fontos

Az Ansible 2.8 (vagy újabb) szükséges a jelen cikkben szereplő minta forgatókönyvek futtatásához.

Az Azure-beli virtuálisgép-méretezési csoportok egy Olyan Azure-szolgáltatás, amellyel azonos, elosztott terhelésű virtuális gépek csoportját konfigurálhatja. A skálázási csoportoknak nincs további költsége, és virtuális gépekből vannak felépítve. Csak a mögöttes számítási erőforrásokért kell fizetnie, például a virtuálisgép-példányokért, a terheléselosztókért vagy a felügyelt lemeztárolókért. A méretezési csoportok biztosítják az alkalmazások futtatásához és méretezéséhez szükséges felügyeleti és automatizálási rétegeket. Ehelyett manuálisan is létrehozhat és kezelhet egyéni virtuális gépeket. A méretezési csoportok használatának azonban két fő előnye van. Az Azure-ba vannak beépítve, és automatikusan skálázzák a virtuális gépeket az alkalmazás igényeinek megfelelően.

A virtuális gép üzembe helyezése után konfigurálja a virtuális gépet az alkalmazás által igényelt szoftverrel. Ahelyett, hogy ezt a konfigurációs feladatot minden virtuális géphez elvégezte, létrehozhat egy egyéni rendszerképet. Az egyéni rendszerkép egy meglévő virtuális gép pillanatképe, amely tartalmazza a telepített szoftvereket. Méretezési csoport konfigurálásakor meg kell adnia a méretezési csoport virtuális gépeihez használni kívánt rendszerképet. Egyéni rendszerkép használatával minden virtuálisgép-példány azonos módon van konfigurálva az alkalmazáshoz. Előfordulhat, hogy frissítenie kell a méretezési csoport egyéni rendszerképét. Az oktatóanyag középpontjában ez a feladat áll.

Ebben a cikkben az alábbiakkal ismerkedhet meg:

  • Két virtuális gép konfigurálása HTTPD-vel
  • Egyéni rendszerkép létrehozása meglévő virtuális gépről
  • Méretezési csoport létrehozása képből
  • Az egyéni rendszerkép frissítése

Előfeltételek

  • Azure-előfizetés: Ha nem rendelkezik Azure-előfizetéssel, első lépésként mindössze néhány perc alatt létrehozhat egy ingyenes fiókot.

Két virtuális gép konfigurálása

Az ebben a szakaszban található forgatókönyvkód két virtuális gépet hoz létre, mindkettőre HTTPD-vel.

Az index.html egyes virtuális gépek lapja egy tesztsztringet jelenít meg:

  • Az első virtuális gép megjeleníti az értéket Image A
  • A második virtuális gép megjeleníti az értéket Image B

Ez a sztring az egyes virtuális gépek különböző szoftverekkel való konfigurálását hivatott utánozni.

A minta forgatókönyv kétféleképpen szerezhető be:

  • Töltse le a forgatókönyvet , és mentse a következőre create_vms.yml: .

  • Hozzon létre egy új fájlt create_vms.yml néven. Szúrja be a következő kódot az új fájlba.

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

Futtassa a forgatókönyvet a ansible-playbook paranccsal, és cserélje le myrg az erőforráscsoport nevére:

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

debug A forgatókönyv szakaszai miatt a ansible-playbook parancs kinyomtatja az egyes virtuális gépek IP-címét. Másolja ki ezeket az IP-címeket későbbi használatra.

Virtual machine IP addresses

Csatlakozás a két virtuális gépre

Ebben a szakaszban minden virtuális géphez csatlakozik. Ahogy az előző szakaszban is említettük, a sztringek Image A és Image B a mimika két különböző, különböző konfigurációjú virtuális géppel rendelkezik.

Az előző szakasz IP-címeinek használatával csatlakozzon mindkét virtuális géphez:

Screenshot from virtual machine A

Screenshot from virtual machine B

Képek létrehozása az egyes virtuális gépekről

Ezen a ponton két, kissé eltérő konfigurációjú virtuális géppel rendelkezik (a fájljaikkal index.html ).

Az ebben a szakaszban található forgatókönyvkód minden virtuális géphez létrehoz egy egyéni rendszerképet:

  • image_vmforimageA – A kezdőlapján megjelenő Image A virtuális géphez létrehozott egyéni rendszerkép.
  • image_vmforimageB – A kezdőlapján megjelenő Image B virtuális géphez létrehozott egyéni rendszerkép.

A minta forgatókönyv kétféleképpen szerezhető be:

  • Töltse le a forgatókönyvet , és mentse a következőre capture-images.yml: .

  • Hozzon létre egy új fájlt capture-images.yml néven. Szúrja be a következő kódot az új fájlba:

- 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

Futtassa a forgatókönyvet a ansible-playbook paranccsal, és cserélje le myrg az erőforráscsoport nevére:

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

Méretezési csoport létrehozása az A kép használatával

Ebben a szakaszban egy forgatókönyvet használunk a következő Azure-erőforrások konfigurálásához:

  • Nyilvános IP-cím
  • Load balancer
  • Hivatkozásokat tartalmazó méretezési csoport image_vmforimageA

A minta forgatókönyv kétféleképpen szerezhető be:

  • Töltse le a forgatókönyvet , és mentse a következőre create-vmss.yml: .

  • Hozzon létre egy új fájlt create-vmss.yml néven. Szúrja be a következő kódot az új fájlba:

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

Futtassa a forgatókönyvet a ansible-playbook paranccsal, és cserélje le myrg az erőforráscsoport nevére:

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

A forgatókönyv szakasza debug miatt a ansible-playbook parancs kinyomtatja a méretezési csoport IP-címét. Másolja ki ezt az IP-címet későbbi használatra.

Public IP Address

Csatlakozás a méretezési csoporthoz

Ebben a szakaszban a méretezési csoporthoz csatlakozik.

Az előző szakasz IP-címének használatával csatlakozzon a méretezési csoporthoz.

Ahogy az előző szakaszban is említettük, a sztringek Image A és Image B a mimika két különböző, különböző konfigurációjú virtuális géppel rendelkezik.

A méretezési csoport a névvel ellátott image_vmforimageAegyéni rendszerképre hivatkozik. Az egyéni rendszerkép image_vmforimageA abból a virtuális gépből lett létrehozva, amelynek kezdőlapja megjelenik Image A.

Ennek eredményeképpen megjelenik egy kezdőlap, amely a következőt Image Ajeleníti meg:

The scale set is associated with the first VM.

A következő szakasz folytatásaként hagyja nyitva a böngészőablakot.

Egyéni rendszerkép módosítása méretezési csoportban és példányok frissítése

Az ebben a szakaszban található forgatókönyv-kód a méretezési csoport képét módosítja – a helyről image_vmforimageA a gombra image_vmforimageB. Emellett a méretezési csoport által üzembe helyezett összes jelenlegi virtuális gép frissül.

A minta forgatókönyv kétféleképpen szerezhető be:

  • Töltse le a forgatókönyvet , és mentse a következőre update-vmss-image.yml: .

  • Hozzon létre egy új fájlt update-vmss-image.yml néven. Szúrja be a következő kódot az új fájlba:

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

Futtassa a forgatókönyvet a ansible-playbook paranccsal, és cserélje le myrg az erőforráscsoport nevére:

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

Térjen vissza a böngészőbe, és frissítse a lapot.

Láthatja, hogy a virtuális gép alapjául szolgáló egyéni rendszerkép frissül.

The scale set is associated with the second VM

Clean up resources

  1. Mentse a következő kódot.delete_rg.yml

    ---
    - hosts: localhost
      tasks:
        - name: Deleting resource group - "{{ name }}"
          azure_rm_resourcegroup:
            name: "{{ name }}"
            state: absent
          register: rg
        - debug:
            var: rg
    
  2. Futtassa a forgatókönyvet az ansible-playbook paranccsal. Cserélje le a helyőrzőt a törölni kívánt erőforráscsoport nevére. Az erőforráscsoporton belüli összes erőforrás törlődik.

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

    Főbb pontok:

    • register A forgatókönyv változója és debug szakasza miatt az eredmények a parancs befejeződésekor jelennek meg.

További lépések