教程:使用 Ansible 在 Azure 中自动缩放虚拟机规模集

重要

需要 Ansible 2.7(或更高版本)才能运行本文中的示例剧本。

Azure 虚拟机规模集 是一项 Azure 功能,可用于配置一组相同的负载均衡 VM。 规模集无需额外付费,它们是从虚拟机生成的。 只需为基础计算资源(例如 VM 实例、负载均衡器或托管磁盘存储)付费。 使用规模集时,会提供管理和自动化层来运行和缩放应用程序。 可以改为手动创建和管理单个 VM。 但是,使用规模集有两个关键优势。 它们内置于 Azure 中,可自动缩放虚拟机以满足应用程序需求。

自动调整 VM 实例数的功能称为 自动缩放。 自动缩放的好处是,它减少了监视和优化应用程序性能的管理开销。 自动缩放可以根据需求或按定义的计划进行配置。 使用 Ansible,可以指定自动缩放规则,这些规则定义积极客户体验的可接受性能。

在这篇文章中,你将学会如何:

  • 定义自动缩放配置文件
  • 根据周期性计划自动扩展
  • 基于应用性能的自动缩放
  • 检索自动缩放设置信息
  • 禁用自动缩放设置

先决条件

  • Azure 订阅:如果没有 Azure 订阅,请在开始之前创建 一个免费帐户

根据计划自动缩放

若要在规模集上启用自动缩放,首先要定义自动缩放配置文件。 此配置文件定义默认、最小和最大规模集容量。 这些限制可让你通过不继续创建 VM 实例来控制成本,并可使用缩小事件中保留的最小数量的实例均衡可接受的性能。

Ansible 允许按特定日期或定期计划缩放规模集。

本部分中的 playbook 代码将 VM 实例数增加到每周一 10:00 的 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 运行 playbook

ansible-playbook vmss-auto-scale.yml

基于性能数据自动缩放

如果应用程序需求增加,规模集中 VM 实例上的负载就会增加。 如果这种增加的负载是持续的,而不仅仅是暂时的需求,您可以配置自动缩放规则来增加规模集中 VM 实例的数量。 创建这些 VM 实例并部署应用程序时,规模集将开始通过负载均衡器向其分发流量。 Ansible 允许控制要监视的指标,例如 CPU 使用率、磁盘使用情况和应用加载时间。 可以根据性能指标阈值、定期计划或特定日期在规模集中进行横向缩减和横向扩展。

本节中的 playbook 代码检查前 10 分钟的 CPU 工作负载,每周一 18:00。

根据 CPU 百分比指标,剧本执行以下操作之一:

  • 将 VM 实例数横向扩展到 4 个
  • 将 VM 实例数扩展到 1 个

将以下脚本保存为 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 运行 playbook

ansible-playbook vmss-auto-scale-metrics.yml

获取自动缩放设置信息

本部分中的 playbook 代码使用 azure_rm_autoscale_facts 模块来检索自动缩放设置的详细信息。

将以下 playbook 保存为 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 运行 playbook

ansible-playbook vmss-auto-scale-get-settings.yml

禁用自动缩放设置

有两种方法可以禁用自动缩放设置。 一种方法是将enabled键从true更改为false。 第二种方法是删除设置。

本部分中的 playbook 代码将删除自动缩放设置。

将以下 playbook 保存为 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

运行 playbook 使用 ansible-playbook

vmss-auto-scale-delete-setting.yml

后续步骤