教學課程:使用 Ansible 從 Azure 共用映像庫 建立 VM 或虛擬機擴展集
重要
需要 Ansible 2.9 (或更新版本)才能執行本文中的範例劇本。
共用映像庫 是一項服務,可讓您輕鬆地管理、共用及組織自定義管理的映像。 這項功能對於維護及共用許多映像的案例很有説明。 自定義映像可以在訂用帳戶之間和 Microsoft Entra 租使用者之間共用。 映射也可以復寫至多個區域,以便更快速地調整部署規模。
在本文中,您將學會如何:
- 建立一般化 VM 和自定義映像
- 建立 共用映像庫
- 建立共用映像和映像版本
- 使用一般化映像建立 VM
- 使用一般化映像建立虛擬機擴展集
- 取得 共用映像庫、映像和版本的相關信息。
必要條件
- Azure 訂用帳戶:如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶。
安裝 Ansible:執行下列其中一個選項:
- 在 Linux 虛擬機上安裝及 設定 Ansible
- 設定 Azure Cloud Shell ,如果您無法存取 Linux 虛擬機, 請使用 Ansible 建立虛擬機。
取得範例劇本
有兩種方式可取得一組完整的範例劇本:
- 下載 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 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 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 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 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 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 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 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 07-delete-gallery.yml
清除資源
將下列程式代碼儲存為
delete_rg.yml
。--- - hosts: localhost tasks: - name: Deleting resource group - "{{ name }}" azure_rm_resourcegroup: name: "{{ name }}" state: absent register: rg - debug: var: rg
使用 ansible-playbook 命令執行劇本 。 將佔位元取代為要刪除的資源群組名稱。 將會刪除資源群組中的所有資源。
ansible-playbook delete_rg.yml --extra-vars "name=<resource_group>"
重點︰
register
由於劇本的變數和debug
區段,因此命令完成時會顯示結果。