チュートリアル: Ansible を使用して Azure 内に仮想マシン スケール セットを構成する

重要

この記事のサンプル プレイブックを実行するには、Ansible 2.9 (以降) が必要です。

Azure Virtual Machine Scale Sets は、負荷分散が行われる同一の VM のグループを構成するための Azure 機能です。 スケール セットに追加コストはなく、仮想マシンから構築されます。 ユーザーは、VM インスタンス、ロード バランサー、マネージド ディスク ストレージなど、基本的なコンピューティング リソースに対してのみ支払います。 スケール セットには、アプリケーションの実行とスケーリングを行うための管理レイヤーと自動化レイヤーがあります。 代わりに手動で個々 の VM を作成し管理できます。 ただし、スケール セットの使用には、2 つの主な利点があります。 それらは Azure に組み込まれ、アプリケーションのニーズを満たすように自動的に仮想マシンを拡大縮小します。

この記事では、次のことについて説明します。

  • VM 用のリソースを構成する
  • スケール セットを構成する
  • その VM インスタンスを増加してスケール セットをスケーリングする

前提条件

  • Azure サブスクリプション:Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。

スケール セットを構成する

このセクションのプレイブック コードは、次のリソースを定義します。

  • リソース グループ。すべてのリソースがデプロイされるリソース グループです。
  • 仮想ネットワーク。10.0.0.0/16 アドレス空間内の仮想ネットワークです。
  • サブネット。仮想ネットワーク内のサブネットです。
  • パブリック IP アドレス。このアドレスを使用して、インターネットのリソースにアクセスできます。
  • ネットワーク セキュリティ グループ。スケール セットへのネットワーク トラフィックおよびスケール セットからのネットワーク トラフィックのフローを制御します。
  • ロード バランサー。ロード バランサー ルールを使用して、定義された一連の VM にトラフィックを分散します。
  • 仮想マシン スケール セット。作成されたすべてのリソースを使用します。

サンプル プレイブックを取得するには、次の 2 つの方法があります。

  • プレイブックをダウンロードして、そのファイルを vmss-create.yml として保存する。

  • vmss-create.yml という名前で新しいファイルを作成します。 次のコードを新しいファイルに挿入します。

- hosts: localhost
  vars:
    resource_group: myResourceGroup
    vmss_name: myvmscalesetname
    vmss_lb_name: myScaleSetLb
    location: eastus
    admin_username: azureuser
    admin_password: "{{ admin_password }}"

  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: "{{ vmss_name }}"
        address_prefixes: "10.0.0.0/16"
    - name: Add subnet
      azure_rm_subnet:
        resource_group: "{{ resource_group }}"
        name: "{{ vmss_name }}"
        address_prefix: "10.0.1.0/24"
        virtual_network: "{{ vmss_name }}"
    - name: Create public IP address
      azure_rm_publicipaddress:
        resource_group: "{{ resource_group }}"
        allocation_method: Static
        name: "{{ vmss_name }}"
    - name: Create Network Security Group that allows SSH
      azure_rm_securitygroup:
        resource_group: "{{ resource_group }}"
        name: "{{ vmss_name }}"
        rules:
          - name: SSH
            protocol: Tcp
            destination_port_range: 22
            access: Allow
            priority: 1001
            direction: Inbound

    - name: Create a load balancer
      azure_rm_loadbalancer:
        resource_group: "{{ resource_group }}"
        name: "{{ vmss_name }}lb"
        location: "{{ location }}"
        frontend_ip_configurations:
          - name: "{{ vmss_name }}front-config"
            public_ip_address: "{{ vmss_name }}"
        backend_address_pools:
          - name: "{{ vmss_name }}backend-pool"
        probes:
          - name: "{{ vmss_name }}prob0"
            port: 8080
            interval: 10
            fail_count: 3
        inbound_nat_pools:
          - name: "{{ vmss_name }}nat-pool"
            frontend_ip_configuration_name: "{{ vmss_name }}front-config"
            protocol: Tcp
            frontend_port_range_start: 50000
            frontend_port_range_end: 50040
            backend_port: 22
        load_balancing_rules:
          - name: "{{ vmss_name }}lb-rules"
            frontend_ip_configuration: "{{ vmss_name }}front-config"
            backend_address_pool: "{{ vmss_name }}backend-pool"
            frontend_port: 80
            backend_port: 8080
            load_distribution: Default
            probe: "{{ vmss_name }}prob0"

    - name: Create VMSS
      no_log: true
      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: "{{ vmss_name }}"
        subnet_name: "{{ vmss_name }}"
        upgrade_policy: Manual
        tier: Standard
        managed_disk_type: Standard_LRS
        os_disk_caching: ReadWrite
        image:
          offer: UbuntuServer
          publisher: Canonical
          sku: 16.04-LTS
          version: latest
        load_balancer: "{{ vmss_name }}lb"
        data_disks:
          - lun: 0
            disk_size_gb: 20
            managed_disk_type: Standard_LRS
            caching: ReadOnly
          - lun: 1
            disk_size_gb: 30
            managed_disk_type: Standard_LRS
            caching: ReadOnly

プレイブックを実行する前に、次の注意事項を参照してください。

  • vars セクションで、{{ admin_password }} プレースホルダーを自分のパスワードに置き換えます。

ansible-playbook を使用してプレイブックを実行します

ansible-playbook vmss-create.yml

プレイブックを実行すると、次の結果のような出力が表示されます。

PLAY [localhost] 

TASK [Gathering Facts] 
ok: [localhost]

TASK [Create a resource group] 
changed: [localhost]

TASK [Create virtual network] 
changed: [localhost]

TASK [Add subnet] 
changed: [localhost]

TASK [Create public IP address] 
changed: [localhost]

TASK [Create Network Security Group that allows SSH] 
changed: [localhost]

TASK [Create a load balancer] 
changed: [localhost]

TASK [Create Scale Set] 
changed: [localhost]

PLAY RECAP 
localhost                  : ok=8    changed=7    unreachable=0    failed=0

VM インスタンスの数を表示する

構成されているスケール セットには、現在 2 つのインスタンスがあります。 次の手順を使用してその値を確認します。

  1. Azure portal にサインインします。

  2. 構成したスケール セットに移動します。

  3. 次のように、インスタンスの数がかっこ内に入ったスケール セット名を確認できます。Standard_DS1_v2 (2 instances)

  4. 次のコマンドを実行して、Azure Cloud Shell でインスタンスの数を確認することもできます。

    az vmss show -n myScaleSet -g myResourceGroup --query '{"capacity":sku.capacity}' 
    

    Cloud Shell で Azure CLI コマンドを実行した結果には、2 つのインスタンスが存在することが示されています。

    {
      "capacity": 2,
    }
    

スケール セットをスケールアウトする

次のセクションのプレイブック コードは、スケール セットに関する情報を取得して、その容量を 2 から 3 に変更します。

サンプル プレイブックを取得するには、次の 2 つの方法があります。

  • プレイブックをダウンロードして、vmss-scale-out.yml に保存する。

  • vmss-scale-out.yml という名前で新しいファイルを作成します。 次のコードを新しいファイルに挿入します。

---
- hosts: localhost
  gather_facts: false
  
  vars:
    resource_group: myTestRG
    vmss_name: myTestVMSS
  
  tasks:

    - name: Get scaleset info
      azure_rm_virtualmachine_scaleset_facts:
        resource_group: "{{ resource_group }}"
        name: "{{ vmss_name }}"
        format: curated
      register: output_scaleset

    - name: set image fact
      set_fact:
        vmss_image: "{{ output_scaleset.vmss[0].image }}"

    - name: Create VMSS
      no_log: true
      azure_rm_virtualmachinescaleset:
        resource_group: "{{ resource_group }}"
        name: "{{ vmss_name }}"
        capacity: 3
        image: "{{ vmss_image }}"

ansible-playbook を使用してプレイブックを実行します

ansible-playbook vmss-scale-out.yml

プレイブックを実行すると、次の結果のような出力が表示されます。

PLAY [localhost] 

TASK [Gathering Facts] 
ok: [localhost]

TASK [Get scaleset info] 
ok: [localhost]

TASK [Set image fact] 
ok: [localhost]

TASK [Change VMSS capacity] 
changed: [localhost]

PLAY RECAP 
localhost                  : ok=3    changed=1    unreachable=0    failed=0

結果を確認する

次のように、Azure portal を使用して作業の結果を確認します。

  1. Azure portal にサインインします。

  2. 構成したスケール セットに移動します。

  3. 次のように、インスタンスの数がかっこ内に入ったスケール セット名を確認できます。Standard_DS1_v2 (3 instances)

  4. 次のコマンドを実行して、Azure Cloud Shell で変更を検証することもできます。

    az vmss show -n myScaleSet -g myResourceGroup --query '{"capacity":sku.capacity}' 
    

    Cloud Shell で Azure CLI コマンドを実行した結果には、現在 3 つのインスタンスが存在することが示されています。

    {
      "capacity": 3,
    }
    

次のステップ