教學課程:使用 Ansible 在 Azure 中自動調整虛擬機擴展集
重要
需要 Ansible 2.7 (或更新版本)才能執行本文中的範例劇本。
Azure 虛擬機擴展集 是一項 Azure 功能,可讓您設定一組相同的負載平衡 VM。 擴展集不需要額外的成本,而且是從虛擬機建置的。 您只需支付基礎計算資源的費用,例如 VM 實例、負載平衡器或受控磁碟記憶體。 使用擴展集,可提供管理和自動化層級,以執行和調整您的應用程式。 您可以改為手動建立和管理個別 VM。 不過,使用擴展集有兩個主要優點。 它們內建於 Azure 中,並會自動調整虛擬機以符合應用程式需求。
自動調整 VM 實例數目的功能稱為 自動調整。 自動調整的優點是可減少管理額外負荷,以監視和優化應用程式的效能。 您可以設定自動調整,以回應需求或根據定義的排程。 使用 Ansible,您可以指定自動調整規則,以定義正面客戶體驗可接受的效能。
在本文中,您將學會如何:
- 定義自動調整配置檔
- 根據週期性排程自動調整
- 根據應用程式效能自動調整
- 擷取自動調整設定資訊
- 停用自動調整設定
必要條件
- Azure 訂用帳戶:如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶。
安裝 Ansible:執行下列其中一個選項:
- 在 Linux 虛擬機上安裝及 設定 Ansible
- 設定 Azure Cloud Shell ,如果您無法存取 Linux 虛擬機, 請使用 Ansible 建立虛擬機。
- 虛擬機擴展集:如果您還沒有擴展集,您可以使用 Ansible 設定擴展集。
根據排程自動調整
若要在擴展集上啟用自動調整,您必須先定義自動調整配置檔。 此配置檔會定義預設、最小和最大擴展集容量。 這些限制可讓您控制成本,方法是不持續建立 VM 實例,並將可接受的效能與維持在相應縮小事件中的實例數目下限進行平衡。
Ansible 可讓您在特定日期或週期性排程上調整擴展集。
本節中的劇本程序代碼會在每個星期一的 10:00 將 VM 實例數目增加到 3 個。
將下列劇本儲存為 vmss-auto-scale.yml
:
---
- hosts: localhost
vars:
resource_group: myResourceGroup
vmss_name: myScaleSet
name: autoscalesetting
tasks:
- name: Create autoscaling
azure_rm_autoscale:
resource_group: "{{ resource_group }}"
name: "{{ name }}"
target:
namespace: "Microsoft.Compute"
types: "virtualMachineScaleSets"
name: "{{ vmss_name }}"
enabled: true
profiles:
- count: '3'
min_count: '3'
max_count: '3'
name: Auto created scale condition
recurrence_timezone: Pacific Standard Time
recurrence_frequency: Week
recurrence_days:
- Monday
recurrence_mins:
- '0'
recurrence_hours:
- '10'
ansible-playbook vmss-auto-scale.yml
根據效能數據自動調整
如果您的應用程式需求增加,擴展集中 VM 實例上的負載會增加。 如果增加的負載是一致的,而不只是簡短的需求,您可以設定自動調整規則來增加擴展集中的 VM 實例數目。 建立這些 VM 實例並部署您的應用程式時,擴展集會開始透過負載平衡器將流量分散到它們。 Ansible 可讓您控制要監視的計量,例如 CPU 使用量、磁碟使用量和應用程式載入時間。 您可以根據效能計量閾值、週期性排程或特定日期,相應縮小和相應放大擴展集。
本節中的劇本程序代碼會在每週一 18:00 檢查前 10 分鐘的 CPU 工作負載。
根據CPU百分比計量,劇本會執行下列其中一個動作:
- 將 VM 實例數目相應放大為四個
- 將 VM 實例數目調整為一個
將下列劇本儲存為 vmss-auto-scale-metrics.yml
:
---
- hosts: localhost
vars:
resource_group: myResourceGroup
vmss_name: myScaleSet
name: autoscalesetting
tasks:
- name: Get facts of the resource group
azure_rm_resourcegroup_facts:
name: "{{ resource_group }}"
register: rg
- name: Get scale set resource uri
set_fact:
vmss_id: "{{ rg.ansible_facts.azure_resourcegroups[0].id }}/providers/Microsoft.Compute/virtualMachineScaleSets/{{ vmss_name }}"
- name: Create autoscaling
azure_rm_autoscale:
resource_group: "{{ resource_group }}"
name: "{{ name }}"
target: "{{ vmss_id }}"
enabled: true
profiles:
- count: '1'
max_count: '1'
min_count: '1'
name: 'This scale condition is executed when none of the other scale condition(s) match'
recurrence_days:
- Monday
recurrence_frequency: Week
recurrence_hours:
- 18
recurrence_mins:
- 0
recurrence_timezone: Pacific Standard Time
- count: '1'
min_count: '1'
max_count: '4'
name: Auto created scale condition
recurrence_days:
- Monday
recurrence_frequency: Week
recurrence_hours:
- 18
recurrence_mins:
- 0
recurrence_timezone: Pacific Standard Time
rules:
- cooldown: 5
direction: Increase
metric_name: Percentage CPU
metric_resource_uri: "{{ vmss_id }}"
operator: GreaterThan
statistic: Average
threshold: 70
time_aggregation: Average
time_grain: 1
time_window: 10
type: ChangeCount
value: '1'
- cooldown: 5
direction: Decrease
metric_name: Percentage CPU
metric_resource_uri: "{{ vmss_id }}"
operator: LessThan
statistic: Average
threshold: 30
time_aggregation: Average
time_grain: 1
time_window: 10
type: ChangeCount
value: '1'
ansible-playbook vmss-auto-scale-metrics.yml
取得自動調整設定資訊
本節中的劇本程式代碼會 azure_rm_autoscale_facts
使用 模組來擷取自動調整設定的詳細數據。
將下列劇本儲存為 vmss-auto-scale-get-settings.yml
:
- hosts: localhost
vars:
resource_group: myResourceGroup
name: autoscalesetting
tasks:
- name: Retrieve autoscale settings information
azure_rm_autoscale_facts:
resource_group: "{{ resource_group }}"
name: "{{ name }}"
register: autoscale_query
- debug:
var: autoscale_query.autoscales[0]
ansible-playbook vmss-auto-scale-get-settings.yml
停用自動調整設定
有兩種方式可以停用自動調整設定。 其中一種方式是將 enabled
索引鍵從 true
變更為 false
。 第二種方式是刪除設定。
本節中的劇本程式代碼會刪除自動調整設定。
將下列劇本儲存為 vmss-auto-scale-delete-setting.yml
:
- hosts: localhost
vars:
resource_group: myResourceGroup
name: autoscalesetting
tasks:
- name: Delete autoscaling
azure_rm_autoscale:
resource_group: "{{ resource_group }}"
name: "{{ name }}"
state: absent
vmss-auto-scale-delete-setting.yml