チュートリアル: Ansible を使用して Azure Shared Image Gallery から VM または仮想マシン スケール セットを作成する

重要

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

Shared Image Gallery は、カスタムのマネージド イメージを簡単に管理、共有、整理できるようにするサービスです。 この機能は、多くのイメージが保持、共有されているシナリオに役立ちます。 カスタム イメージは、サブスクリプション間および Microsoft Entra テナント間で共有できます。 また、デプロイのスケーリングにかかる時間を短縮するために、イメージを複数のリージョンにレプリケートすることもできます。

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

  • 一般化された VM とカスタム イメージを作成する
  • Shared Image Gallery を作成する
  • 共有イメージとイメージ バージョンを作成する
  • 一般化されたイメージを使用して VM を作成する
  • 一般化されたイメージを使用して仮想マシン スケール セットを作成する
  • Shared Image Gallery、イメージ、およびバージョンに関する情報を取得する

前提条件

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

サンプル プレイブックを取得する

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

  • SIG フォルダーをダウンロードしてローカル コンピューターに保存します。
  • セクションごとに新しいファイルを作成し、その中にサンプル プレイブックをコピーします。

vars.yml ファイルには、このチュートリアル用のすべてのサンプル プレイブックで使用される変数が含まれています。 このファイルを編集して、一意の名前と値を指定できます。

最初のサンプル プレイブック 00-prerequisites.yml では、このチュートリアルを完了するために必要なものを作成します。

  • リソース グループ。これは、Azure リソースがデプロイ、管理される論理コンテナーです。
  • 仮想ネットワーク、サブネット、パブリック IP アドレス、VM 用ネットワーク インターフェイス カード。
  • ソース仮想マシン。これは、一般化されたイメージの作成に使用されます。
- hosts: localhost
  connection: local
  vars_files:
    - ./vars.yml

  tasks:
    - name: Create resource group if doesn't exist
      azure_rm_resourcegroup:
        name: "{{ resource_group }}"
        location: "{{ location }}"
    
    - name: Create virtual network
      azure_rm_virtualnetwork:
        resource_group: "{{ resource_group }}"
        name: "{{ virtual_network_name }}"
        address_prefixes: "10.0.0.0/16"

    - name: Add subnet
      azure_rm_subnet:
        resource_group: "{{ resource_group }}"
        name: "{{ subnet_name }}"
        address_prefix: "10.0.1.0/24"
        virtual_network: "{{ virtual_network_name }}"

    - name: Create public IP address
      azure_rm_publicipaddress:
        resource_group: "{{ resource_group }}"
        allocation_method: Static
        name: "{{ ip_name }}"

    - name: Create virtual network inteface cards for VM A and B
      azure_rm_networkinterface:
        resource_group: "{{ resource_group }}"
        name: "{{ network_interface_name }}"
        virtual_network: "{{ virtual_network_name }}"
        subnet: "{{ subnet_name }}"

    - name: Create VM
      azure_rm_virtualmachine:
        resource_group: "{{ resource_group }}"
        name: "{{ source_vm_name }}"
        admin_username: testuser
        admin_password: "Password1234!"
        vm_size: Standard_B1ms
        network_interfaces: "{{ network_interface_name }}"
        image:
          offer: UbuntuServer
          publisher: Canonical
          sku: 16.04-LTS
          version: latest

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

ansible-playbook 00-prerequisites.yml

Azure portal で、vars.yml で指定したリソース グループをチェックして、作成した新しい仮想マシンとさまざまなリソースを確認します。

VM を一般化してカスタム イメージを作成する

次のプレイブック 01a-create-generalized-image.yml では、前の手順で作成したソース VM を一般化し、それに基づくカスタム イメージを作成します。

- hosts: localhost
  connection: local
  vars_files:
    - ./vars.yml

  tasks:
    - name: Generalize VM
      azure_rm_virtualmachine:
        resource_group: "{{ resource_group }}"
        name: "{{ source_vm_name }}"
        generalized: yes

    - name: Create custom image
      azure_rm_image:
        resource_group: "{{ resource_group }}"
        name: "{{ image_name }}"
        source: "{{ source_vm_name }}"

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

ansible-playbook 01a-create-generalized-image.yml

リソース グループを確認し、testimagea が表示されていることを確認します。

このイメージ ギャラリーは、イメージを共有および管理するためのリポジトリです。 02-create-shared-image-gallery.yml のサンプル プレイブック コードにより、リソース グループ内に Shared Image Gallery が作成されます。

- hosts: localhost
  connection: local
  vars_files:
    - ./vars.yml

  tasks:
    - name: Create shared image gallery
      azure_rm_gallery:
        resource_group: "{{ resource_group }}"
        name: "{{ shared_gallery_name }}"
        location: "{{ location }}"
        description: This is the gallery description.

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

ansible-playbook 02-create-shared-image-gallery.yml

これで、新しいギャラリー myGallery がリソース グループ内に表示されます。

共有イメージとイメージ バージョンを作成する

次のプレイブック 03a-create-shared-image-generalized.yml では、イメージ定義とイメージ バージョンを作成します。

イメージ定義には、イメージの種類 (Windows または Linux)、リリース ノート、最小および最大のメモリ要件が含まれます。 イメージ バージョンとは、イメージのバージョンです。 ギャラリー、イメージ定義、イメージ バージョンは、イメージを論理グループに整理するのに役立ちます。

- hosts: localhost
  connection: local
  vars_files:
    - ./vars.yml

  tasks:
    - name: Create shared image
      azure_rm_galleryimage:
        resource_group: "{{ resource_group }}"
        gallery_name: "{{ shared_gallery_name }}"
        name: "{{ shared_image_name }}"
        location: "{{ location }}"
        os_type: linux
        os_state: generalized
        identifier:
          publisher: myPublisherName
          offer: myOfferName
          sku: mySkuName
        description: Image description
    
    - name: Create or update a simple gallery image version.
      azure_rm_galleryimageversion:
        resource_group: "{{ resource_group }}"
        gallery_name: "{{ shared_gallery_name }}"
        gallery_image_name: "{{ shared_image_name }}"
        name: "{{ shared_image_version }}"
        location: "{{ location }}"
        publishing_profile:
          end_of_life_date: "2020-10-01t00:00:00+00:00"
          exclude_from_latest: yes
          replica_count: 3
          storage_account_type: Standard_LRS
          target_regions:
            - name: West US
              regional_replica_count: 1
            - name: East US
              regional_replica_count: 2
              storage_account_type: Standard_ZRS
          managed_image:
            name: "{{ image_name }}"
            resource_group: "{{ resource_group }}"
      register: output

    - debug:
        var: output

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

ansible-playbook 03a-create-shared-image-generalized.yml

これで、リソース グループには、お使いのギャラリーのイメージ定義とイメージ バージョンが作成されました。

一般化されたイメージに基づく VM を作成する

最後に、04a-create-vm-using-generalized-image.yml を実行して、前の手順で作成した一般化されたイメージに基づく VM を作成します。

- hosts: localhost
  connection: local
  vars_files:
    - ./vars.yml

  tasks:
  - name: Create VM using shared image
    azure_rm_virtualmachine:
      resource_group: "{{ resource_group }}"
      name: "{{ vm_name }}"
      vm_size: Standard_DS1_v2
      admin_username: adminUser
      admin_password: PassWord01
      managed_disk_type: Standard_LRS
      image:
        id: "/subscriptions/{{ lookup('env', 'AZURE_SUBSCRIPTION_ID') }}/resourceGroups/{{ resource_group }}/providers/Microsoft.Compute/galleries/{{ shared_gallery_name }}/images/{{ shared_image_name }}/versions/{{ shared_image_version }}"

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

ansible-playbook 04a-create-vm-using-generalized-image.yml

一般化されたイメージに基づく仮想マシン スケール セットを作成する

一般化されたイメージに基づく仮想マシン スケール セットを作成することもできます。 そのためには、05a-create-vmss-using-generalized-image.yml を実行します。

- hosts: localhost
  connection: local
  vars_files:
    - ./vars.yml

  tasks:
  - name: Create a virtual machine scale set using a shared image
    azure_rm_virtualmachinescaleset:
      resource_group: "{{ resource_group }}"
      name: "{{ vmss_name }}"
      vm_size: Standard_DS1_v2
      admin_username: adminUser
      admin_password: PassWord01
      capacity: 2
      virtual_network_name: "{{ virtual_network_name }}"
      upgrade_policy: Manual
      subnet_name: "{{ subnet_name }}"
      managed_disk_type: Standard_LRS
      image:
        id: "/subscriptions/{{ lookup('env', 'AZURE_SUBSCRIPTION_ID') }}/resourceGroups/{{ resource_group }}/providers/Microsoft.Compute/galleries/{{ shared_gallery_name }}/images/{{ shared_image_name }}/versions/{{ shared_image_version }}"

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

ansible-playbook 05a-create-vmss-using-generalized-image.yml

06-get-info.yml を実行することで、ギャラリー、イメージ定義、バージョンに関する情報を取得できます。

- hosts: localhost
  connection: local
  vars_files:
    - ./vars.yml

  tasks:
  - name: Get Shared Image Gallery information
    azure_rm_gallery_info:
      resource_group: "{{ resource_group }}"
      name: "{{ shared_gallery_name }}"
  - name: Get shared image information
    azure_rm_galleryimage_info:
      resource_group: "{{ resource_group }}"
      gallery_name: "{{ shared_gallery_name }}"
      name: "{{ shared_image_name }}"
  - name: Get Shared Image Gallery image version information
    azure_rm_galleryimageversion_info:
      resource_group: "{{ resource_group }}"
      gallery_name: "{{ shared_gallery_name }}"
      gallery_image_name: "{{ shared_image_name }}"
      name: "{{ shared_image_version }}"

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

ansible-playbook 06-get-info.yml

共有イメージを削除する

ギャラリー リソースを削除するには、サンプル プレイブック 07-delete-gallery.yml を参照してください。 リソースを逆の順序で削除します。 まず、イメージ バージョンを削除します。 すべてのイメージのバージョンを削除した後、イメージの定義を削除できます。 すべてのイメージの定義を削除した後、ギャラリーを削除できます。

- hosts: localhost
  connection: local
  vars_files:
    - ./vars.yml

  tasks:
  - name: Delete gallery image version.
    azure_rm_galleryimageversion:
      resource_group: "{{ resource_group }}"
      gallery_name: "{{ shared_gallery_name }}"
      gallery_image_name: "{{ shared_image_name }}"
      name: "{{ shared_image_version }}"
      state: absent

  - name: Delete gallery image
    azure_rm_galleryimage:
      resource_group: "{{ resource_group }}"
      gallery_name: "{{ shared_gallery_name }}"
      name: "{{ shared_image_name }}"
      state: absent

  - name: Delete a simple gallery.
    azure_rm_gallery:
      resource_group: "{{ resource_group }}"
      name: "{{ shared_gallery_name }}"
      state: absent

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

ansible-playbook 07-delete-gallery.yml

リソースをクリーンアップする

  1. delete_rg.yml として次のコードを保存します。

    ---
    - hosts: localhost
      tasks:
        - name: Deleting resource group - "{{ name }}"
          azure_rm_resourcegroup:
            name: "{{ name }}"
            state: absent
          register: rg
        - debug:
            var: rg
    
  2. ansible-playbook コマンドを使用してプレイブックを実行します。 プレースホルダーは、削除するリソース グループの名前に置き換えます。 リソース グループ内のすべてのリソースが削除されます。

    ansible-playbook delete_rg.yml --extra-vars "name=<resource_group>"
    

    重要なポイント:

    • プレイブックの register 変数と debug セクションにより、コマンドの完了時に結果が表示されます。

次のステップ