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.
Instal Ansible: Lakukan salah satu opsi berikut:
- Menginstal dan mengonfigurasi Ansibel pada mesin virtual Linux
- Konfigurasikan Azure Cloud Shell dan - jika Anda tidak memiliki akses ke mesin virtual Linux - buat mesin virtual dengan Ansible.
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 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 }}"
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.
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, buka browser dan sambungkan ke setiap VM.
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 menampilkanImage A
pada halaman berandanya.image_vmforimageB
- Gambar kustom yang dibuat untuk VM yang menampilkanImage 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, ansible-playbook
perintah akan mencetak alamat IP set skala. Salin alamat IP untuk digunakan nanti.
Hubungkan 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
.
Akibatnya, Anda melihat halaman beranda yang menampilkan Image A
.
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 untuk melihat bahwa gambar kustom yang mendasar komputer virtual diperbarui.
Membersihkan sumber daya
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
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 bagiandebug
dari playbook, hasilnya akan ditampilkan ketika perintah selesai.
- Karena variabel