Självstudie: Uppdatera den anpassade avbildningen av skalningsuppsättningar för virtuella Azure-datorer med Ansible
Viktigt!
Ansible 2.8 (eller senare) krävs för att köra exempelspelböckerna i den här artikeln.
Skalningsuppsättningar för virtuella Azure-datorer är en Azure-funktion som gör att du kan konfigurera en grupp med identiska, belastningsutjämningade virtuella datorer. Det finns ingen extra kostnad för skalningsuppsättningar och de skapas från virtuella datorer. Du betalar bara för underliggande beräkningsresurser, till exempel VM-instanser, lastbalanserare eller managed disk-lagring. Med skalningsuppsättningar tillhandahålls hantering och automatiseringsnivåer för körning och skalning av dina program. Du kan i stället skapa och hantera enskilda virtuella datorer manuellt. Det finns dock två viktiga fördelar med att använda skalningsuppsättningar. De är inbyggda i Azure och de skalar automatiskt dina virtuella datorer efter programbehov.
När en virtuell dator har distribuerats konfigurerar du den virtuella datorn med den programvara som din app behöver. I stället för att göra den här konfigurationsuppgiften för varje virtuell dator kan du skapa en anpassad avbildning. En anpassad avbildning är en ögonblicksbild av en befintlig virtuell dator som innehåller alla installerade program. När du konfigurerar en skalningsuppsättning anger du den avbildning som ska användas för skalningsuppsättningens virtuella datorer. Genom att använda en anpassad avbildning är varje VM-instans identiskt konfigurerad för din app. Ibland kan du behöva uppdatera skalningsuppsättningens anpassade avbildning. Den uppgiften är i fokus för den här självstudien.
I den här artikeln kan du se hur du:
- Konfigurera två virtuella datorer med HTTPD
- Skapa en anpassad avbildning från en befintlig virtuell dator
- Skapa en skalningsuppsättning från en bild
- Uppdatera den anpassade avbildningen
Förutsättningar
- Azure-prenumeration: Om du inte har någon Azure-prenumeration kan du skapa ett kostnadsfritt konto innan du börjar.
Installera Ansible: Gör något av följande alternativ:
- Installera och konfigurera Ansible på en virtuell Linux-dator
- Konfigurera Azure Cloud Shell och – om du inte har åtkomst till en virtuell Linux-dator – skapa en virtuell dator med Ansible.
Konfigurera två virtuella datorer
Spelbokskoden i det här avsnittet skapar två virtuella datorer med HTTPD installerat på båda.
Sidan index.html
för varje virtuell dator visar en teststräng:
- Den första virtuella datorn visar värdet
Image A
- Den andra virtuella datorn visar värdet
Image B
Den här strängen är avsedd att efterlikna konfigurering av varje virtuell dator med olika programvara.
Det finns två sätt att hämta exempelspelboken:
Ladda ned spelboken och spara den i
create_vms.yml
.Skapa en ny fil med namnet
create_vms.yml
. Infoga följande kod i den nya filen.
- 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 }}"
Kör spelboken med ansible-playbook
kommandot och ersätt myrg
med resursgruppens namn:
ansible-playbook create-vms.yml --extra-vars "resource_group=myrg"
På grund av avsnitten debug
i spelboken ansible-playbook
skriver kommandot ut IP-adressen för varje virtuell dator. Kopiera dessa IP-adresser för senare användning.
Ansluta till de två virtuella datorerna
I det här avsnittet ansluter du till varje virtuell dator. Som nämnts i föregående avsnitt har strängarna Image A
och Image B
härmar två distinkta virtuella datorer med olika konfigurationer.
Använd IP-adresserna från föregående avsnitt och öppna en webbläsare och anslut till varje virtuell dator.
Skapa avbildningar från varje virtuell dator
Nu har du två virtuella datorer med lite olika konfigurationer (deras index.html
filer).
Spelbokskoden i det här avsnittet skapar en anpassad avbildning för varje virtuell dator:
image_vmforimageA
– Anpassad avbildning som skapats för den virtuella dator som visasImage A
på startsidan.image_vmforimageB
– Anpassad avbildning som skapats för den virtuella dator som visasImage B
på startsidan.
Det finns två sätt att hämta exempelspelboken:
Ladda ned spelboken och spara den i
capture-images.yml
.Skapa en ny fil med namnet
capture-images.yml
. Infoga följande kod i den nya filen:
- 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
Kör spelboken med ansible-playbook
kommandot och ersätt myrg
med resursgruppens namn:
ansible-playbook capture-images.yml --extra-vars "resource_group=myrg"
Skapa skalningsuppsättning med bild A
I det här avsnittet används en spelbok för att konfigurera följande Azure-resurser:
- Offentlig IP-adress
- Lastbalanserare
- Skalningsuppsättning som refererar till
image_vmforimageA
Det finns två sätt att hämta exempelspelboken:
Ladda ned spelboken och spara den i
create-vmss.yml
.Skapa en ny fil med namnet
create-vmss.yml
. Infoga följande kod i den nya filen:
---
- 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 }}"
Kör spelboken med ansible-playbook
kommandot och ersätt myrg
med resursgruppens namn:
ansible-playbook create-vmss.yml --extra-vars "resource_group=myrg"
På grund av avsnittet debug
i spelboken ansible-playbook
skriver kommandot ut IP-adressen för skalningsuppsättningen. Kopiera den här IP-adressen för senare användning.
Ansluta till skalningsuppsättningen
Anslut till skalningsuppsättningen med hjälp av IP-adressen från föregående avsnitt.
Som nämnts i föregående avsnitt har strängarna Image A
och Image B
härmar två distinkta virtuella datorer med olika konfigurationer.
Skalningsuppsättningen refererar till den anpassade avbildningen med namnet image_vmforimageA
. Anpassad avbildning image_vmforimageA
skapades från den virtuella dator vars startsida visar Image A
.
Därför visas en startsida som visar Image A
.
Låt webbläsarfönstret vara öppet medan du fortsätter till nästa avsnitt.
Ändra anpassad avbildning i skalningsuppsättningar och uppgraderingsinstanser
Spelbokskoden i det här avsnittet ändrar skalningsuppsättningens avbildning – från image_vmforimageA
till image_vmforimageB
. Dessutom uppdateras alla aktuella virtuella datorer som distribueras av skalningsuppsättningen.
Det finns två sätt att hämta exempelspelboken:
Ladda ned spelboken och spara den i
update-vmss-image.yml
.Skapa en ny fil med namnet
update-vmss-image.yml
. Infoga följande kod i den nya filen:
- 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 }}"
Kör spelboken med ansible-playbook
kommandot och ersätt myrg
med resursgruppens namn:
ansible-playbook update-vmss-image.yml --extra-vars "resource_group=myrg"
Gå tillbaka till webbläsaren och uppdatera sidan för att se att den virtuella datorns underliggande anpassade avbildning uppdateras.
Rensa resurser
Spara följande kod som
delete_rg.yml
.--- - hosts: localhost tasks: - name: Deleting resource group - "{{ name }}" azure_rm_resourcegroup: name: "{{ name }}" state: absent register: rg - debug: var: rg
Kör spelboken med kommandot ansible-playbook . Ersätt platshållaren med namnet på den resursgrupp som ska tas bort. Alla resurser i resursgruppen tas bort.
ansible-playbook delete_rg.yml --extra-vars "name=<resource_group>"
Viktiga punkter:
- På grund av variabeln
register
ochdebug
avsnittet i spelboken visas resultatet när kommandot har slutförts.
- På grund av variabeln