Delen via


Zelfstudie: De aangepaste afbeelding van virtuele machineschaalsets van Azure bijwerken met Ansible

Belangrijk

Ansible 2.8 (of hoger) is vereist om de voorbeeldplaybooks in dit artikel uit te voeren.

Virtuele-machineschaalsets van Azure is een Azure-functie waarmee u een groep identieke vm's met gelijke taakverdeling kunt configureren. Er zijn geen extra kosten verbonden aan schaalsets en ze zijn gebouwd op basis van virtuele machines. U betaalt alleen voor de onderliggende rekenresources, zoals de VM-exemplaren, load balancers of Managed Disk-opslag. Met schaalinstellingen worden de lagen voor beheer en automatisering aangeboden om uw toepassingen uit te voeren en te schalen. U kunt in plaats daarvan handmatig afzonderlijke VM's maken en beheren. Er zijn echter twee belangrijke voordelen bij het gebruik van schaalsets. Ze zijn ingebouwd in Azure en ze schalen uw virtuele machines automatisch om te voldoen aan de toepassingsbehoeften.

Nadat een VIRTUELE machine is geïmplementeerd, configureert u de VM met de software die uw app nodig heeft. In plaats van deze configuratietaak voor elke virtuele machine uit te voeren, kunt u een aangepaste image maken. Een aangepaste installatiekopie is een momentopname van een bestaande VM met geïnstalleerde software. Wanneer u een schaalset configureert, specificeert u het image dat moet worden gebruikt voor de VM's van die schaalset. Met behulp van een aangepaste afbeelding is elke VM-instantie identiek geconfigureerd voor uw app. Soms moet u mogelijk de aangepaste afbeelding van uw schaalset bijwerken. Deze taak staat centraal in deze handleiding.

In dit artikel leert u het volgende:

  • Twee VM's configureren met HTTPD
  • Maak een aangepaste image van een bestaande VM
  • Een schaalset maken vanuit een image
  • De aangepaste afbeelding bijwerken

Vereiste voorwaarden

  • Azure-abonnement: als u geen Azure-abonnement hebt, maakt u een gratis account voordat u begint.

Twee VM's configureren

Met de playbookcode in deze sectie worden twee virtuele machines gemaakt waarop HTTPD is geïnstalleerd.

Op index.html de pagina voor elke VM wordt een testtekenreeks weergegeven:

  • Eerste VM geeft de waarde weer Image A
  • Tweede VM geeft de waarde weer Image B

Deze tekenreeks is bedoeld om elke virtuele machine met verschillende software te configureren.

Er zijn twee manieren om het voorbeeldplaybook op te halen:

  • Download het playbook en sla het op in create_vms.yml.

  • Maak een nieuw bestand met de naam create_vms.yml. Voeg de volgende code in het nieuwe bestand in.

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

Voer het playbook uit met behulp van het ansible-playbook commando, vervang daarbij myrg door de naam van uw resourcegroep.

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

Vanwege de debug secties van het playbook wordt met de ansible-playbook opdracht het IP-adres van elke VIRTUELE machine afgedrukt. Kopieer deze IP-adressen voor later gebruik.

Verbinding maken met de twee VM's

In deze sectie maakt u verbinding met elke VIRTUELE machine. Zoals vermeld in de vorige sectie, lijken de tekenreeksen Image A en Image B op twee afzonderlijke VM's met verschillende configuraties.

Open een browser met behulp van de IP-adressen uit de vorige sectie en maak verbinding met elke virtuele machine.

Maak afbeeldingen van elke virtuele machine

Op dit moment hebt u twee VM's met iets andere configuraties (hun index.html bestanden).

De playbookcode in deze sectie maakt een aangepast image voor elke virtuele machine:

  • image_vmforimageA - Aangepaste afbeelding gemaakt voor de virtuele machine die Image A weergeeft op de startpagina.
  • image_vmforimageB - Aangepast beeld gemaakt voor de virtuele machine die Image B op de startpagina weergeeft.

Er zijn twee manieren om het voorbeeldplaybook op te halen:

  • Download het playbook en sla het op in capture-images.yml.

  • Maak een nieuw bestand met de naam capture-images.yml. Voeg de volgende code in het nieuwe bestand in:

- 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

Voer het playbook uit met behulp van het ansible-playbook commando, vervang daarbij myrg door de naam van uw resourcegroep.

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

Schaalset maken met afbeelding A

In deze sectie wordt een playbook gebruikt om de volgende Azure-resources te configureren:

  • Openbaar IP-adres
  • Verdelingsmechanisme
  • Schaalset die verwijst naar image_vmforimageA

Er zijn twee manieren om het voorbeeldplaybook op te halen:

  • Download het playbook en sla het op in create-vmss.yml.

  • Maak een nieuw bestand met de naam create-vmss.yml. Voeg de volgende code in het nieuwe bestand in:

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

Voer het playbook uit met behulp van het ansible-playbook commando, vervang daarbij myrg door de naam van uw resourcegroep.

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

Vanwege de debug sectie van het playbook wordt met de ansible-playbook opdracht het IP-adres van de schaalset afgedrukt. Kopieer dit IP-adres voor later gebruik.

Verbinding maken met de schaalset

Maak verbinding met de schaalset met behulp van het IP-adres uit de vorige sectie.

Zoals vermeld in de vorige sectie, lijken de tekenreeksen Image A en Image B op twee afzonderlijke VM's met verschillende configuraties.

De schaalset verwijst naar de aangepaste afbeelding met de naam image_vmforimageA. Aangepaste installatiekopie image_vmforimageA werd gemaakt van de virtuele machine waarvan de startpagina Image A weergeeft.

Als gevolg hiervan ziet u een startpagina die Image A toont.

Laat het browservenster geopend terwijl u doorgaat naar de volgende sectie.

Aangepaste afbeeldingen wijzigen in schaalset en instanties bijwerken.

De playbook code in deze sectie wijzigt de afbeelding van de schaalset, van image_vmforimageA naar image_vmforimageB. Ook worden alle huidige virtuele machines die door de schaalset zijn geïmplementeerd, bijgewerkt.

Er zijn twee manieren om het voorbeeldplaybook op te halen:

  • Download het playbook en sla het op in update-vmss-image.yml.

  • Maak een nieuw bestand met de naam update-vmss-image.yml. Voeg de volgende code in het nieuwe bestand in:

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

Voer het playbook uit met behulp van het ansible-playbook commando, vervang daarbij myrg door de naam van uw resourcegroep.

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

Ga terug naar de browser en vernieuw de pagina om te zien dat de onderliggende aangepaste afbeelding van de virtuele machine wordt bijgewerkt.

De hulpbronnen opschonen

  1. Sla de volgende code op als delete_rg.yml.

    ---
    - hosts: localhost
      tasks:
        - name: Deleting resource group - "{{ name }}"
          azure_rm_resourcegroup:
            name: "{{ name }}"
            state: absent
          register: rg
        - debug:
            var: rg
    
  2. Voer het playbook uit met behulp van de ansible-playbook-opdracht . Vervang de tijdelijke aanduiding door de naam van de resourcegroep die u wilt verwijderen. Alle resources in de resourcegroep worden verwijderd.

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

    Belangrijkste punten:

    • Vanwege de register variabele en debug sectie van het playbook worden de resultaten weergegeven wanneer de opdracht is voltooid.

Volgende stappen