教學課程:使用 Ansible 在 Azure 中自動調整虛擬機擴展集

重要

需要 Ansible 2.7 (或更新版本)才能執行本文中的範例劇本。

Azure 虛擬機擴展集 是一項 Azure 功能,可讓您設定一組相同的負載平衡 VM。 擴展集不需要額外的成本,而且是從虛擬機建置的。 您只需支付基礎計算資源的費用,例如 VM 實例、負載平衡器或受控磁碟記憶體。 使用擴展集,可提供管理和自動化層級,以執行和調整您的應用程式。 您可以改為手動建立和管理個別 VM。 不過,使用擴展集有兩個主要優點。 它們內建於 Azure 中,並會自動調整虛擬機以符合應用程式需求。

自動調整 VM 實例數目的功能稱為 自動調整。 自動調整的優點是可減少管理額外負荷,以監視和優化應用程式的效能。 您可以設定自動調整,以回應需求或根據定義的排程。 使用 Ansible,您可以指定自動調整規則,以定義正面客戶體驗可接受的效能。

在本文中,您將學會如何:

  • 定義自動調整配置檔
  • 根據週期性排程自動調整
  • 根據應用程式效能自動調整
  • 擷取自動調整設定資訊
  • 停用自動調整設定

必要條件

  • Azure 訂用帳戶:如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶
  • 虛擬機擴展集:如果您還沒有擴展集,您可以使用 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 執行劇本

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 執行劇本

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 執行劇本

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

使用 ansible-playbook 執行劇本

vmss-auto-scale-delete-setting.yml

下一步