共用方式為


教學課程:使用 Ansible 從 Azure 共享映像庫建立 VM 或虛擬機器規模設定

這很重要

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

共享圖像庫 是一項服務,可讓您輕鬆管理、共享和組織自定義管理的圖像。 此功能對於維護和共享許多圖像的場景非常有用。 自訂映像可以在訂用帳戶之間以及 Microsoft Entra 租用戶之間共用。 映像也可以複寫到多個區域,以加快部署擴展速度。

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

  • 建立一般化 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 interface 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 將對在上一步中建立的來源虛擬機器進行通用化設定,然後根據該來源虛擬機器建立自訂映像。

- 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

您的資源群組現在具有映像庫的映像定義和映像版本。

根據一般化映像建立虛擬機器

最後,執行 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區段,當命令完成時,結果會顯示。

後續步驟