教學課程:使用 Ansible 從 Azure 共用映像庫 建立 VM 或虛擬機擴展集

重要

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

共用映像庫 是一項服務,可讓您輕鬆地管理、共用及組織自定義管理的映像。 這項功能對於維護及共用許多映像的案例很有説明。 自定義映像可以在訂用帳戶之間和 Microsoft Entra 租使用者之間共用。 映射也可以復寫至多個區域,以便更快速地調整部署規模。

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

  • 建立一般化 VM 和自定義映像
  • 建立 共用映像庫
  • 建立共用映像和映像版本
  • 使用一般化映像建立 VM
  • 使用一般化映像建立虛擬機擴展集
  • 取得 共用映像庫、映像和版本的相關信息。

必要條件

  • Azure 訂用帳戶:如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶

取得範例劇本

有兩種方式可取得一組完整的範例劇本:

  • 下載 SIG 資料夾 ,並將其儲存至本機電腦。
  • 為每個區段建立新的檔案,並複製其中的範例劇本。

檔案 vars.yml 包含本教學課程的所有範例劇本所使用的變數。 您可以編輯檔案,以提供唯一的名稱和值。

第一個範例劇本會建立完成本教學課程 00-prerequisites.yml 的必要專案:

  • 資源群組,這是部署和管理 Azure 資源的邏輯容器。
  • 虛擬網路;子;VM 的公用IP位址和網路介面卡。
  • 來源虛擬機,用於建立一般化映像。
- 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 入口網站 中,檢查您在 中指定的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範例劇本程序代碼會在您的資源群組中建立 共用映像庫。

- 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區段,因此命令完成時會顯示結果。

下一步