다음을 통해 공유


자습서: Ansible을 사용하여 Azure 공유 이미지 갤러리에서 VM 또는 가상 머신 확장 집합 만들기

Important

이 문서의 샘플 플레이북을 실행하려면 Ansible 2.9 이상이 필요합니다.

공유 이미지 갤러리 는 사용자 지정 관리형 이미지를 쉽게 관리, 공유 및 구성할 수 있는 서비스입니다. 이 기능은 많은 이미지가 기본 및 공유되는 시나리오에 유용합니다. 사용자 지정 이미지는 구독 간 및 Microsoft Entra 테넌트 간에 공유할 수 있습니다. 더 빠른 배포 크기 조정을 위해 이미지를 여러 지역에 복제본(replica) 수 있습니다.

이 문서에서는 다음 방법을 설명합니다.

  • 일반화된 VM 및 사용자 지정 이미지 만들기
  • Shared Image Gallery 만들기
  • 공유 이미지 및 이미지 버전 만들기
  • 일반화된 이미지를 사용하여 VM 만들기
  • 일반화된 이미지를 사용하여 가상 머신 확장 집합 만들기
  • 공유 이미지 갤러리, 이미지 및 버전에 대한 정보를 가져옵니다.

필수 조건

  • Azure 구독: Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.

샘플 플레이북 가져오기

샘플 플레이북의 전체 집합을 가져오는 방법에는 두 가지가 있습니다.

  • SIG 폴더 를 다운로드하여 로컬 컴퓨터에 저장합니다.
  • 각 섹션에 대한 새 파일을 만들고 그 안에 샘플 플레이북을 복사합니다.

vars.yml 파일에는 이 자습서의 모든 샘플 플레이북에서 사용되는 변수가 포함되어 있습니다. 파일을 편집하여 고유한 이름과 값을 제공할 수 있습니다.

첫 번째 샘플 플레이북 00-prerequisites.yml 은 이 자습서를 완료하는 데 필요한 내용을 만듭니다.

  • Azure 리소스를 배포하고 관리하는 논리적 컨테이너인 리소스 그룹입니다.
  • 가상 네트워크; 서브넷; VM에 대한 공용 IP 주소 및 네트워크 인터페이스 카드.
  • 일반화된 이미지를 만드는 데 사용되는 원본 Virtual Machine입니다.
- 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 리소스 그룹에 공유 이미지 갤러리를 만듭니다.

- 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 섹션으로 인해 명령이 완료되면 결과가 표시됩니다.

다음 단계