Öğ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.
Ansible'ı Yükleme: Aşağıdaki seçeneklerden birini yapın:
- Ansible'ı Linux sanal makinesine yükleme ve yapılandırma
- Azure Cloud Shell'i yapılandırın ve Linux sanal makinesine erişiminiz yoksa Ansible ile bir sanal makine 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.yml
kaydedin.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ülenenImage A
VM için oluşturulan özel görüntü.image_vmforimageB
- Giriş sayfasında görüntülenenImage 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.yml
kaydedin.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.yml
kaydedin.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 A
VM'den özel görüntü image_vmforimageA
oluşturuldu.
Sonuç olarak, görüntülenen Image A
bir 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_vmforimageB
değ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.yml
kaydedin.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
Aşağıdaki kodu olarak
delete_rg.yml
kaydedin.--- - hosts: localhost tasks: - name: Deleting resource group - "{{ name }}" azure_rm_resourcegroup: name: "{{ name }}" state: absent register: rg - debug: var: rg
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 vedebug
bölümü nedeniyle, komut tamamlandığında sonuçlar görüntülenir.
- Playbook'un