MS Azure/AZ104

AZ 104 실습 : [Computing] Generalized VM image

aliceintr 2021. 1. 27. 05:41
반응형

 

Generalized VM Image 에 대한 설명은 아래에 되어있다.

[MS Azure/Cloud Storage] - [Azure Storage] Azure Virtual Hard Disk, Virtual Machine Image, Generalized image, specialized virtual image

 

[Azure Storage] Azure Virtual Hard Disk, Virtual Machine Image, Generalized image, specialized virtual image

VHD 에 대한 간략한 설명은 아래글을 참조해도 좋다. [MS Azure/Cloud Storage] - [Azure Storage] Disk Storage Roles, Ephemeral OS Disks, Managed and Unmanaged Disk , Disk 유형 [Azure Storage] Disk Stora..

buildgoodhabit.tistory.com


Windows Virtual Machine Generalization

Windows 이미지를 빌드하는 경우 Sysprep 도구를 사용하여 일반화를 위해 가상 머신을 준비합니다. Sysprep은 이미지에서 서버 관련 정보(예: 호스트 이름, 사용자 로그인 정보 및 로그)를 제거합니다. 또한 Sysprep은 Windows에서 내부적으로 사용되는 모든 머신 관련 식별자를 제거합니다.

** NOTE : Sysprep을 실행하는 것은 파괴적 프로세스이며, 결과를 쉽게 되돌릴 수 없습니다. 가상 머신을 먼저 백업합니다.

Windows VM을 일반화하려면 다음 단계를 수행합니다.

  1. Windows 가상 머신에 로그인

  2. 관리자 권한으로 명령 프롬프트를 엽니다.

  3. \windows\system32\sysprep 디렉터리로 이동합니다.

  4. sysprep.exe 를 실행합니다.

  5. 시스템 준비 도구 대화 상자에서 다음 설정을 선택한 다음 확인 을 선택합니다.

속성
시스템 정리 작업 시스템 OOBE(첫 실행 경험) 입력
일반화 선택
종료 옵션 종료

 

가상 머신을 종료한 후에는 종료 상태에서 할당을 취소해야 합니다. PowerShell을 사용하는 경우 다음 명령을 실행합니다.

Powershell

Stop-AzVM -ResourceGroupName <resource group> `
    -Name <virtual machine name> `
    -Force
Set-AzVM -ResourceGroupName <resource group> `
    -Name <virtual machine name> `
    -Generalize

Azure CLI

az vm deallocate \
    --resource-group <resource group> \
    --name <virtual machine name>
az vm generalize \
    --name <virtual machine name>

Linux Virtual Machine Generalization

Linux 이미지를 빌드하는 경우 waagent 도구를 사용하여 일반화용 가상 머신을 준비합니다. waagent 도구는 가장 최근에 만든 사용자 계정 삭제, 공용 SSH 키 제거, 호스트 이름 및 기타 머신별 세부 정보 다시 설정 및 로그 파일 정리 등과 같은 작업을 수행합니다.

Linux 가상 머신을 일반화하려면 머신에 로그인하고 다음 명령을 실행합니다.

waagent -deprovision+user

다음과 유사한 일련의 경고 메시지가 표시됩니다. 이 예에서 azureuser 는 가상 머신을 빌드할 때 만든 사용자 계정의 이름입니다.

WARNING! The waagent service will be stopped.
WARNING! Cached DHCP leases will be deleted.
WARNING! root password will be disabled. You will not be able to login as root.
WARNING! /etc/resolv.conf will be deleted.
WARNING! azureuser account and entire home directory will be deleted.

그런 다음 가상 머신에서 연결을 해제해야 합니다.

마지막으로, 이 정리 상태에서 가상 머신의 할당을 취소하고 일반화해야 합니다. PowerShell을 사용하는 경우 다음 일련의 명령을 실행합니다.

Powershell

Stop-AzVM -ResourceGroupName <resource group> `
    -Name <virtual machine name> `
    -Force

Set-AzVM -ResourceGroupName <resource group> `
    -Name <virtual machine name> `
    -Generalize

CLI

az vm deallocate \
    --resource-group <resource group> \
    --name <virtual machine name>

az vm generalize \
    --resource-group <resource group> \
    --name <virtual machine name>

Generalized VM image 이미지

이미지에는 가상 머신에 연결된 모든 디스크가 포함됩니다. Azure Portal, Azure CLI 또는 PowerShell을 사용하여 일반화된 가상 머신에서 이미지를 만들 수 있습니다.

Azure Portal에서 이미지를 만들려면 가상 머신의 페이지로 이동한 후 캡처 를 선택합니다.

다음에 나오는 이미지 만들기 페이지에서 이미지에 이름을 부여하고 이미지를 저장할 리소스 그룹을 지정합니다. 이미지를 만든 후에는 필요에 따라 가상 머신을 제거할 수 있습니다. 또한 영역 중복 스토리지에 의해 지원되는 복원력 있는 이미지를 만들 수 있습니다. 이 기능은 이미지의 가용성을 높여 줍니다. 이 기능을 사용하려면 영역 복원력 에서 켜기 를 선택합니다.

**NOTE : 이러한 방법으로 가상 머신 이미지를 만들면 원래 가상 머신을 사용할 수 없게 됩니다. 다시 시작할 수 없습니다. 대신 이 단원의 뒷부분에 설명된 대로 이미지에서 새 가상 머신을 만들어야 합니다.

PowerShell 또는 Azure CLI를 사용하는 경우 다음 명령을 사용하여 일반화되고 할당 취소된 가상 머신에서 가상 머신 이미지를 만들 수 있습니다. 두 예제 모두에서 이미지는 원래 가상 머신과 동일한 리소스 그룹에 생성됩니다.

Powershell

$vm = Get-AzVM -ResourceGroupName <resource group> `
    -Name <generalized virtual machine>

$image = New-AzImageConfig -SourceVirtualMachineId `
    $vm.ID -Location<virtual machine location>

New-AzImage -Image $image `
    -ImageName <image name> `
    -ResourceGroupName <resource group>

Azure CLI

az image create \
    --name <image name> \
    --resource-group <resource group> \
    --source <generalized virtual machine>

Generalized VM image 에서 새 가상 머신 만들기

일반화된 이미지를 사용하여 새 가상 머신을 빌드할 수 있습니다. 가장 간단한 방법은 Azure Portal을 사용하는 것입니다. 이미지에 대한 페이지로 이동하고 + VM 만들기 를 선택합니다. 머신 관련 세부 정보(예: 가상 머신 이름, 사용자 계정, 가상 머신 크기, 열려는 네트워크 포트)를 묻는 메시지가 표시됩니다.

PowerShell New-AzVm 명령 또는 Azure CLI az vm create 명령을 사용할 수도 있습니다. 다음 예에서는 구문을 보여 줍니다.

Powershell

New-AzVm `
    -ResourceGroupName <resource group> `
    -Name <new virtual machine name> `
    -ImageName <image name> `
    -Location <location of image>

AzureCLI

az vm create \
    --resource-group <resource group> \
    --name <new virtual machine name> \
    --image <image name> \
    --location <location of image>

 


VHD 스냅샷에서 가상 머신 만들기

VHD 스냅샷 집합에서 가상 머신을 다시 빌드하는 프로세스는 다음 두 단계로 진행됩니다.

1. 각 스냅샷에 대해 새 관리 디스크를 만듭니다. 스냅샷을 관리 디스크의 원본으로 지정합니다. 가장 간단한 방법은 다음 이미지에 표시된 것처럼 Azure Portal에서 사용하는 것입니다.

2. 관리 디스크를 사용하여 새 가상 머신을 만듭니다. PowerShell, Azure CLI 또는 포털을 통해 이 작업을 수행할 수 있습니다.


Azure CLI에서 Azure VM의 이미지를 만들고 새 VM을 Provision

기본 리소스 그룹 설정

az configure --defaults group=[Sandbox resource group name]

Virtual Machine 만들기

1. Cloud Shell에서 다음 명령을 실행하여 Nginx를 실행하는 Ubuntu Server 가상 머신을 만듭니다. azureuser 암호를 입력하라는 메시지가 표시되면 원하는 암호를 입력합니다

az vm create \
    --name MyUbuntuVM \
    --image UbuntuLTS \
    --generate-ssh-keys

az vm open-port \
    --name MyUbuntuVM \
    --port 80

az vm extension set \
    --publisher Microsoft.Azure.Extensions \
    --name CustomScript \
    --vm-name MyUbuntuVM \
    --settings '{"commandToExecute":"apt-get -y update && apt-get -y install nginx && hostname > /var/www/html/index.html"}'
$ az configure --defaults group=learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4
$ az vm create \
>     --name MyUbuntuVM \
>     --image UbuntuLTS \
>     --generate-ssh-keys

SSH key files '/home/nansee1109/.ssh/id_rsa' and '/home/nansee1109/.ssh/id_rsa.pub' have been generated under ~/.ssh to allow SSH access to the VM. If using machines without permanent storage, back up your keys to a safe location.
{- Finished ..
  "fqdns": "",
  "id": "/subscriptions/294186c4-7588-4b97-b190-23bfd2cbdeec/resourceGroups/learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4/providers/Microsoft.Compute/virtualMachines/MyUbuntuVM",
  "location": "westus",
  "macAddress": "00-0D-3A-30-60-97",
  "powerState": "VM running",
  "privateIpAddress": "10.0.0.4",
  "publicIpAddress": "104.42.99.66",
  "resourceGroup": "learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4",
  "zones": ""
}

$ az vm open-port \
>     --name MyUbuntuVM \
>     --port 80
{- Finished ..
  "defaultSecurityRules": [
    {
      "access": "Allow",
      "description": "Allow inbound traffic from all VMs in VNET",
      "destinationAddressPrefix": "VirtualNetwork",
      "destinationAddressPrefixes": [],
      "destinationApplicationSecurityGroups": null,
      "destinationPortRange": "*",
      "destinationPortRanges": [],
      "direction": "Inbound",
      "etag": "W/\"dd784421-47ce-481e-ac9c-a4524459831b\"",
      "id": "/subscriptions/294186c4-7588-4b97-b190-23bfd2cbdeec/resourceGroups/learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4/providers/Microsoft.Network/networkSecurityGroups/MyUbuntuVMNSG/defaultSecurityRules/AllowVnetInBound",
      "name": "AllowVnetInBound",
      "priority": 65000,
      "protocol": "*",
      "provisioningState": "Succeeded",
      "resourceGroup": "learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4",
      "sourceAddressPrefix": "VirtualNetwork",
      "sourceAddressPrefixes": [],
      "sourceApplicationSecurityGroups": null,
      "sourcePortRange": "*",
      "sourcePortRanges": [],
      "type": "Microsoft.Network/networkSecurityGroups/defaultSecurityRules"
    },
    {
      "access": "Allow",
      "description": "Allow inbound traffic from azure load balancer",
      "destinationAddressPrefix": "*",
      "destinationAddressPrefixes": [],
      "destinationApplicationSecurityGroups": null,
      "destinationPortRange": "*",
      "destinationPortRanges": [],
      "direction": "Inbound",
      "etag": "W/\"dd784421-47ce-481e-ac9c-a4524459831b\"",
      "id": "/subscriptions/294186c4-7588-4b97-b190-23bfd2cbdeec/resourceGroups/learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4/providers/Microsoft.Network/networkSecurityGroups/MyUbuntuVMNSG/defaultSecurityRules/AllowAzureLoadBalancerInBound",
      "name": "AllowAzureLoadBalancerInBound",
      "priority": 65001,
      "protocol": "*",
      "provisioningState": "Succeeded",
      "resourceGroup": "learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4",
      "sourceAddressPrefix": "AzureLoadBalancer",
      "sourceAddressPrefixes": [],
      "sourceApplicationSecurityGroups": null,
      "sourcePortRange": "*",
      "sourcePortRanges": [],
      "type": "Microsoft.Network/networkSecurityGroups/defaultSecurityRules"
    },
    {
      "access": "Deny",
      "description": "Deny all inbound traffic",
      "destinationAddressPrefix": "*",
      "destinationAddressPrefixes": [],
      "destinationApplicationSecurityGroups": null,
      "destinationPortRange": "*",
      "destinationPortRanges": [],
      "direction": "Inbound",
      "etag": "W/\"dd784421-47ce-481e-ac9c-a4524459831b\"",
      "id": "/subscriptions/294186c4-7588-4b97-b190-23bfd2cbdeec/resourceGroups/learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4/providers/Microsoft.Network/networkSecurityGroups/MyUbuntuVMNSG/defaultSecurityRules/DenyAllInBound",
      "name": "DenyAllInBound",
      "priority": 65500,
      "protocol": "*",
      "provisioningState": "Succeeded",
      "resourceGroup": "learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4",
      "sourceAddressPrefix": "*",
      "sourceAddressPrefixes": [],
      "sourceApplicationSecurityGroups": null,
      "sourcePortRange": "*",
      "sourcePortRanges": [],
      "type": "Microsoft.Network/networkSecurityGroups/defaultSecurityRules"
    },
    {
      "access": "Allow",
      "description": "Allow outbound traffic from all VMs to all VMs in VNET",
      "destinationAddressPrefix": "VirtualNetwork",
      "destinationAddressPrefixes": [],
      "destinationApplicationSecurityGroups": null,
      "destinationPortRange": "*",
      "destinationPortRanges": [],
      "direction": "Outbound",
      "etag": "W/\"dd784421-47ce-481e-ac9c-a4524459831b\"",
      "id": "/subscriptions/294186c4-7588-4b97-b190-23bfd2cbdeec/resourceGroups/learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4/providers/Microsoft.Network/networkSecurityGroups/MyUbuntuVMNSG/defaultSecurityRules/AllowVnetOutBound",
      "name": "AllowVnetOutBound",
      "priority": 65000,
      "protocol": "*",
      "provisioningState": "Succeeded",
      "resourceGroup": "learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4",
      "sourceAddressPrefix": "VirtualNetwork",
      "sourceAddressPrefixes": [],
      "sourceApplicationSecurityGroups": null,
      "sourcePortRange": "*",
      "sourcePortRanges": [],
      "type": "Microsoft.Network/networkSecurityGroups/defaultSecurityRules"
    },
    {
      "access": "Allow",
      "description": "Allow outbound traffic from all VMs to Internet",
      "destinationAddressPrefix": "Internet",
      "destinationAddressPrefixes": [],
      "destinationApplicationSecurityGroups": null,
      "destinationPortRange": "*",
      "destinationPortRanges": [],
      "direction": "Outbound",
      "etag": "W/\"dd784421-47ce-481e-ac9c-a4524459831b\"",
      "id": "/subscriptions/294186c4-7588-4b97-b190-23bfd2cbdeec/resourceGroups/learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4/providers/Microsoft.Network/networkSecurityGroups/MyUbuntuVMNSG/defaultSecurityRules/AllowInternetOutBound",
      "name": "AllowInternetOutBound",
      "priority": 65001,
      "protocol": "*",
      "provisioningState": "Succeeded",
      "resourceGroup": "learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4",
      "sourceAddressPrefix": "*",
      "sourceAddressPrefixes": [],
      "sourceApplicationSecurityGroups": null,
      "sourcePortRange": "*",
      "sourcePortRanges": [],
      "type": "Microsoft.Network/networkSecurityGroups/defaultSecurityRules"
    },
    {
      "access": "Deny",
      "description": "Deny all outbound traffic",
      "destinationAddressPrefix": "*",
      "destinationAddressPrefixes": [],
      "destinationApplicationSecurityGroups": null,
      "destinationPortRange": "*",
      "destinationPortRanges": [],
      "direction": "Outbound",
      "etag": "W/\"dd784421-47ce-481e-ac9c-a4524459831b\"",
      "id": "/subscriptions/294186c4-7588-4b97-b190-23bfd2cbdeec/resourceGroups/learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4/providers/Microsoft.Network/networkSecurityGroups/MyUbuntuVMNSG/defaultSecurityRules/DenyAllOutBound",
      "name": "DenyAllOutBound",
      "priority": 65500,
      "protocol": "*",
      "provisioningState": "Succeeded",
      "resourceGroup": "learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4",
      "sourceAddressPrefix": "*",
      "sourceAddressPrefixes": [],
      "sourceApplicationSecurityGroups": null,
      "sourcePortRange": "*",
      "sourcePortRanges": [],
      "type": "Microsoft.Network/networkSecurityGroups/defaultSecurityRules"
    }
  ],
  "etag": "W/\"dd784421-47ce-481e-ac9c-a4524459831b\"",
  "flowLogs": null,
  "id": "/subscriptions/294186c4-7588-4b97-b190-23bfd2cbdeec/resourceGroups/learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4/providers/Microsoft.Network/networkSecurityGroups/MyUbuntuVMNSG",
  "location": "westus",
  "name": "MyUbuntuVMNSG",
  "networkInterfaces": [
    {
      "dnsSettings": null,
      "dscpConfiguration": null,
      "enableAcceleratedNetworking": null,
      "enableIpForwarding": null,
      "etag": null,
      "extendedLocation": null,
      "hostedWorkloads": null,
      "id": "/subscriptions/294186c4-7588-4b97-b190-23bfd2cbdeec/resourceGroups/learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4/providers/Microsoft.Network/networkInterfaces/MyUbuntuVMVMNic",
      "ipConfigurations": null,
      "location": null,
      "macAddress": null,
      "name": null,
      "networkSecurityGroup": null,
      "primary": null,
      "privateEndpoint": null,
      "provisioningState": null,
      "resourceGroup": "learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4",
      "resourceGuid": null,
      "tags": null,
      "tapConfigurations": null,
      "type": null,
      "virtualMachine": null
    }
  ],
  "provisioningState": "Succeeded",
  "resourceGroup": "learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4",
  "resourceGuid": "72bf8e8b-084a-438e-af39-722b7c4c5336",
  "securityRules": [
    {
      "access": "Allow",
      "description": null,
      "destinationAddressPrefix": "*",
      "destinationAddressPrefixes": [],
      "destinationApplicationSecurityGroups": null,
      "destinationPortRange": "22",
      "destinationPortRanges": [],
      "direction": "Inbound",
      "etag": "W/\"dd784421-47ce-481e-ac9c-a4524459831b\"",
      "id": "/subscriptions/294186c4-7588-4b97-b190-23bfd2cbdeec/resourceGroups/learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4/providers/Microsoft.Network/networkSecurityGroups/MyUbuntuVMNSG/securityRules/default-allow-ssh",
      "name": "default-allow-ssh",
      "priority": 1000,
      "protocol": "Tcp",
      "provisioningState": "Succeeded",
      "resourceGroup": "learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4",
      "sourceAddressPrefix": "*",
      "sourceAddressPrefixes": [],
      "sourceApplicationSecurityGroups": null,
      "sourcePortRange": "*",
      "sourcePortRanges": [],
      "type": "Microsoft.Network/networkSecurityGroups/securityRules"
    },
    {
      "access": "Allow",
      "description": null,
      "destinationAddressPrefix": "*",
      "destinationAddressPrefixes": [],
      "destinationApplicationSecurityGroups": null,
      "destinationPortRange": "80",
      "destinationPortRanges": [],
      "direction": "Inbound",
      "etag": "W/\"dd784421-47ce-481e-ac9c-a4524459831b\"",
      "id": "/subscriptions/294186c4-7588-4b97-b190-23bfd2cbdeec/resourceGroups/learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4/providers/Microsoft.Network/networkSecurityGroups/MyUbuntuVMNSG/securityRules/open-port-80",
      "name": "open-port-80",
      "priority": 900,
      "protocol": "*",
      "provisioningState": "Succeeded",
      "resourceGroup": "learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4",
      "sourceAddressPrefix": "*",
      "sourceAddressPrefixes": [],
      "sourceApplicationSecurityGroups": null,
      "sourcePortRange": "*",
      "sourcePortRanges": [],
      "type": "Microsoft.Network/networkSecurityGroups/securityRules"
    }
  ],
  "subnets": null,
  "tags": {},
  "type": "Microsoft.Network/networkSecurityGroups"
}

$az vm extension set \
>     --publisher Microsoft.Azure.Extensions \
>     --name CustomScript \
>     --vm-name MyUbuntuVM \
>     --settings '{"commandToExecute":"apt-get -y update && apt-get -y install nginx && hostname> /var/www/html/index.html"}'
{- Finished ..
  "autoUpgradeMinorVersion": true,
  "enableAutomaticUpgrade": null,
  "forceUpdateTag": null,
  "id": "/subscriptions/294186c4-7588-4b97-b190-23bfd2cbdeec/resourceGroups/learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4/providers/Microsoft.Compute/virtualMachines/MyUbuntuVM/extensions/CustomScript",
  "instanceView": null,
  "location": "westus",
  "name": "CustomScript",
  "protectedSettings": null,
  "provisioningState": "Succeeded",
  "publisher": "Microsoft.Azure.Extensions",
  "resourceGroup": "learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4",
  "settings": {
    "commandToExecute": "apt-get -y update && apt-get -y install nginx && hostname > /var/www/html/index.html"
  },
  "tags": null,
  "type": "Microsoft.Compute/virtualMachines/extensions",
  "typeHandlerVersion": "2.1",
  "typePropertiesType": "CustomScript"
}

2. 다음 명령을 실행하여 새 가상 머신의 공용 IP 주소를 찾습니다.

echo http://$(az vm list-ip-addresses \
             --name MyUbuntuVM \
             --query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \
             --output tsv)
             
 http://104.42.99.66

3. 웹 브라우저에서 가상 머신의 공용 IP 주소로 이동합니다. 가상 머신의 이름 MyUbuntuVM 이 표시된 웹 페이지가 나타나는지 확인합니다.

 

Generalized VM

1. Cloud Shell 창에서 다음 명령을 실행하여 Ubuntu 가상 머신에 연결합니다. <ip address>를 설정 작업 중에 적어 둔 가상 머신의 공용 IP 주소로 바꿉니다.

ssh -o StrictHostKeyChecking=no <ip address>

$ ssh -o StrictHostKeyChecking=no 104.42.99.66
Warning: Permanently added '104.42.99.66' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 5.4.0-1036-azure x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Tue Jan 26 20:30:54 UTC 2021

  System load:  0.08              Processes:           110
  Usage of /:   5.1% of 28.90GB   Users logged in:     0
  Memory usage: 6%                IP address for eth0: 10.0.0.4
  Swap usage:   0%

3 packages can be updated.
1 of these updates is a security update.
To see these additional updates run: apt list --upgradable



The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

2. 다음 명령을 실행하여 일반화할 가상 시스템을 준비합니다.

sudo waagent -deprovision+user

$ sudo waagent -deprovision+user
WARNING! The waagent service will be stopped.
WARNING! Cached DHCP leases will be deleted.
WARNING! root password will be disabled. You will not be able to login as root.
WARNING! /etc/resolv.conf will NOT be removed, this is a behavior change to earlier versions of Ubuntu.
WARNING! nansee1109 account and entire home directory will be deleted.
Do you want to proceed (y/n)y

계속하시겠습니까(y/n)? 프롬프트에서 y 를 입력합니다.

3. 작업이 완료되면 다음 명령을 실행하여 가상 머신에 대한 연결을 종료합니다.

exit

4. Cloud Shell에서 다음 명령을 실행하여 가상 머신 할당을 취소합니다.

az vm deallocate \
    --name MyUbuntuVM

5. 다음 명령을 실행하여 가상 머신을 일반화합니다.

az vm generalize \
    --name MyUbuntuVM

가상 머신 이미지 만들기

다음 명령을 실행하여 일반화된 가상 머신에서 MyVMImage 라는 가상 머신 이미지를 만듭니다.

az image create \
    --name MyVMIMage \
    --source MyUbuntuVM
    
{- Finished ..
  "hyperVGeneration": "V1",
  "id": "/subscriptions/294186c4-7588-4b97-b190-23bfd2cbdeec/resourceGroups/learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4/providers/Microsoft.Compute/images/MyVMIMage",
  "location": "westus",
  "name": "MyVMIMage",
  "provisioningState": "Succeeded",
  "resourceGroup": "learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4",
  "sourceVirtualMachine": {
    "id": "/subscriptions/294186c4-7588-4b97-b190-23bfd2cbdeec/resourceGroups/learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4/providers/Microsoft.Compute/virtualMachines/MyUbuntuVM",
    "resourceGroup": "learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4"
  },
  "storageProfile": {
    "dataDisks": [],
    "osDisk": {
      "blobUri": null,
      "caching": "ReadWrite",
      "diskEncryptionSet": null,
      "diskSizeGb": 30,
      "managedDisk": {
        "id": "/subscriptions/294186c4-7588-4b97-b190-23bfd2cbdeec/resourceGroups/learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4/providers/Microsoft.Compute/disks/MyUbuntuVM_disk1_7924cd47a7bb4cb7b0beeac29a84f9f1",
        "resourceGroup": "learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4"
      },
      "osState": "Generalized",
      "osType": "Linux",
      "snapshot": null,
      "storageAccountType": "Premium_LRS"
    },
    "zoneResilient": null
  },
  "tags": {},
  "type": "Microsoft.Compute/images"
}

새 이미지를 사용하여 가상 머신 만들기

1. 다음 명령을 실행하여 MyVMImage 이미지를 통해 새 가상 머신을 만듭니다.

az vm create \
  --name MyVMFromImage \
  --computer-name MyVMFromImage \
  --image MyVMImage \
  --admin-username azureuser \
  --generate-ssh-keys
$ az vm create \
>   --name MyVMFromImage \
>   --computer-name MyVMFromImage \
>   --image MyVMImage \
>   --admin-username azureuser \
>   --generate-ssh-keys
{- Finished ..
  "fqdns": "",
  "id": "/subscriptions/294186c4-7588-4b97-b190-23bfd2cbdeec/resourceGroups/learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4/providers/Microsoft.Compute/virtualMachines/MyVMFromImage",
  "location": "westus",
  "macAddress": "00-22-48-04-18-99",
  "powerState": "VM running",
  "privateIpAddress": "10.0.0.5",
  "publicIpAddress": "13.91.22.115",
  "resourceGroup": "learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4",
  "zones": ""
}

 

2. 다음 명령을 실행하여 기본 웹 페이지를 서버 이름으로 업데이트합니다.

az vm extension set \
    --publisher Microsoft.Azure.Extensions \
    --name CustomScript \
    --vm-name MyVMFromImage \
    --settings '{"commandToExecute":"hostname > /var/www/html/index.html"}'
$ az vm extension set \
>     --publisher Microsoft.Azure.Extensions \
>     --name CustomScript \
>     --vm-name MyVMFromImage \
>     --settings '{"commandToExecute":"hostname > /var/www/html/index.html"}'
{- Finished ..
  "autoUpgradeMinorVersion": true,
  "enableAutomaticUpgrade": null,
  "forceUpdateTag": null,
  "id": "/subscriptions/294186c4-7588-4b97-b190-23bfd2cbdeec/resourceGroups/learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4/providers/Microsoft.Compute/virtualMachines/MyVMFromImage/extensions/CustomScript",
  "instanceView": null,
  "location": "westus",
  "name": "CustomScript",
  "protectedSettings": null,
  "provisioningState": "Succeeded",
  "publisher": "Microsoft.Azure.Extensions",
  "resourceGroup": "learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4",
  "settings": {
    "commandToExecute": "hostname > /var/www/html/index.html"
  },
  "tags": null,
  "type": "Microsoft.Compute/virtualMachines/extensions",
  "typeHandlerVersion": "2.1",
  "typePropertiesType": "CustomScript"
}

3. 다음 명령을 실행하여 새 가상 머신에서 포트 80을 엽니다.

az vm open-port \
    --name MyVMFromImage \
    --port 80
$ az vm open-port \
>     --name MyVMFromImage \
>     --port 80
{- Finished ..
  "defaultSecurityRules": [
    {
      "access": "Allow",
      "description": "Allow inbound traffic from all VMs in VNET",
      "destinationAddressPrefix": "VirtualNetwork",
      "destinationAddressPrefixes": [],
      "destinationApplicationSecurityGroups": null,
      "destinationPortRange": "*",
      "destinationPortRanges": [],
      "direction": "Inbound",
      "etag": "W/\"16a28863-0b75-4f20-b524-2fc25d0503da\"",
      "id": "/subscriptions/294186c4-7588-4b97-b190-23bfd2cbdeec/resourceGroups/learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4/providers/Microsoft.Network/networkSecurityGroups/MyVMFromImageNSG/defaultSecurityRules/AllowVnetInBound",
      "name": "AllowVnetInBound",
      "priority": 65000,
      "protocol": "*",
      "provisioningState": "Succeeded",
      "resourceGroup": "learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4",
      "sourceAddressPrefix": "VirtualNetwork",
      "sourceAddressPrefixes": [],
      "sourceApplicationSecurityGroups": null,
      "sourcePortRange": "*",
      "sourcePortRanges": [],
      "type": "Microsoft.Network/networkSecurityGroups/defaultSecurityRules"
    },
    {
      "access": "Allow",
      "description": "Allow inbound traffic from azure load balancer",
      "destinationAddressPrefix": "*",
      "destinationAddressPrefixes": [],
      "destinationApplicationSecurityGroups": null,
      "destinationPortRange": "*",
      "destinationPortRanges": [],
      "direction": "Inbound",
      "etag": "W/\"16a28863-0b75-4f20-b524-2fc25d0503da\"",
      "id": "/subscriptions/294186c4-7588-4b97-b190-23bfd2cbdeec/resourceGroups/learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4/providers/Microsoft.Network/networkSecurityGroups/MyVMFromImageNSG/defaultSecurityRules/AllowAzureLoadBalancerInBound",
      "name": "AllowAzureLoadBalancerInBound",
      "priority": 65001,
      "protocol": "*",
      "provisioningState": "Succeeded",
      "resourceGroup": "learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4",
      "sourceAddressPrefix": "AzureLoadBalancer",
      "sourceAddressPrefixes": [],
      "sourceApplicationSecurityGroups": null,
      "sourcePortRange": "*",
      "sourcePortRanges": [],
      "type": "Microsoft.Network/networkSecurityGroups/defaultSecurityRules"
    },
    {
      "access": "Deny",
      "description": "Deny all inbound traffic",
      "destinationAddressPrefix": "*",
      "destinationAddressPrefixes": [],
      "destinationApplicationSecurityGroups": null,
      "destinationPortRange": "*",
      "destinationPortRanges": [],
      "direction": "Inbound",
      "etag": "W/\"16a28863-0b75-4f20-b524-2fc25d0503da\"",
      "id": "/subscriptions/294186c4-7588-4b97-b190-23bfd2cbdeec/resourceGroups/learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4/providers/Microsoft.Network/networkSecurityGroups/MyVMFromImageNSG/defaultSecurityRules/DenyAllInBound",
      "name": "DenyAllInBound",
      "priority": 65500,
      "protocol": "*",
      "provisioningState": "Succeeded",
      "resourceGroup": "learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4",
      "sourceAddressPrefix": "*",
      "sourceAddressPrefixes": [],
      "sourceApplicationSecurityGroups": null,
      "sourcePortRange": "*",
      "sourcePortRanges": [],
      "type": "Microsoft.Network/networkSecurityGroups/defaultSecurityRules"
    },
    {
      "access": "Allow",
      "description": "Allow outbound traffic from all VMs to all VMs in VNET",
      "destinationAddressPrefix": "VirtualNetwork",
      "destinationAddressPrefixes": [],
      "destinationApplicationSecurityGroups": null,
      "destinationPortRange": "*",
      "destinationPortRanges": [],
      "direction": "Outbound",
      "etag": "W/\"16a28863-0b75-4f20-b524-2fc25d0503da\"",
      "id": "/subscriptions/294186c4-7588-4b97-b190-23bfd2cbdeec/resourceGroups/learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4/providers/Microsoft.Network/networkSecurityGroups/MyVMFromImageNSG/defaultSecurityRules/AllowVnetOutBound",
      "name": "AllowVnetOutBound",
      "priority": 65000,
      "protocol": "*",
      "provisioningState": "Succeeded",
      "resourceGroup": "learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4",
      "sourceAddressPrefix": "VirtualNetwork",
      "sourceAddressPrefixes": [],
      "sourceApplicationSecurityGroups": null,
      "sourcePortRange": "*",
      "sourcePortRanges": [],
      "type": "Microsoft.Network/networkSecurityGroups/defaultSecurityRules"
    },
    {
      "access": "Allow",
      "description": "Allow outbound traffic from all VMs to Internet",
      "destinationAddressPrefix": "Internet",
      "destinationAddressPrefixes": [],
      "destinationApplicationSecurityGroups": null,
      "destinationPortRange": "*",
      "destinationPortRanges": [],
      "direction": "Outbound",
      "etag": "W/\"16a28863-0b75-4f20-b524-2fc25d0503da\"",
      "id": "/subscriptions/294186c4-7588-4b97-b190-23bfd2cbdeec/resourceGroups/learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4/providers/Microsoft.Network/networkSecurityGroups/MyVMFromImageNSG/defaultSecurityRules/AllowInternetOutBound",
      "name": "AllowInternetOutBound",
      "priority": 65001,
      "protocol": "*",
      "provisioningState": "Succeeded",
      "resourceGroup": "learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4",
      "sourceAddressPrefix": "*",
      "sourceAddressPrefixes": [],
      "sourceApplicationSecurityGroups": null,
      "sourcePortRange": "*",
      "sourcePortRanges": [],
      "type": "Microsoft.Network/networkSecurityGroups/defaultSecurityRules"
    },
    {
      "access": "Deny",
      "description": "Deny all outbound traffic",
      "destinationAddressPrefix": "*",
      "destinationAddressPrefixes": [],
      "destinationApplicationSecurityGroups": null,
      "destinationPortRange": "*",
      "destinationPortRanges": [],
      "direction": "Outbound",
      "etag": "W/\"16a28863-0b75-4f20-b524-2fc25d0503da\"",
      "id": "/subscriptions/294186c4-7588-4b97-b190-23bfd2cbdeec/resourceGroups/learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4/providers/Microsoft.Network/networkSecurityGroups/MyVMFromImageNSG/defaultSecurityRules/DenyAllOutBound",
      "name": "DenyAllOutBound",
      "priority": 65500,
      "protocol": "*",
      "provisioningState": "Succeeded",
      "resourceGroup": "learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4",
      "sourceAddressPrefix": "*",
      "sourceAddressPrefixes": [],
      "sourceApplicationSecurityGroups": null,
      "sourcePortRange": "*",
      "sourcePortRanges": [],
      "type": "Microsoft.Network/networkSecurityGroups/defaultSecurityRules"
    }
  ],
  "etag": "W/\"16a28863-0b75-4f20-b524-2fc25d0503da\"",
  "flowLogs": null,
  "id": "/subscriptions/294186c4-7588-4b97-b190-23bfd2cbdeec/resourceGroups/learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4/providers/Microsoft.Network/networkSecurityGroups/MyVMFromImageNSG",
  "location": "westus",
  "name": "MyVMFromImageNSG",
  "networkInterfaces": [
    {
      "dnsSettings": null,
      "dscpConfiguration": null,
      "enableAcceleratedNetworking": null,
      "enableIpForwarding": null,
      "etag": null,
      "extendedLocation": null,
      "hostedWorkloads": null,
      "id": "/subscriptions/294186c4-7588-4b97-b190-23bfd2cbdeec/resourceGroups/learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4/providers/Microsoft.Network/networkInterfaces/MyVMFromImageVMNic",
      "ipConfigurations": null,
      "location": null,
      "macAddress": null,
      "name": null,
      "networkSecurityGroup": null,
      "primary": null,
      "privateEndpoint": null,
      "provisioningState": null,
      "resourceGroup": "learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4",
      "resourceGuid": null,
      "tags": null,
      "tapConfigurations": null,
      "type": null,
      "virtualMachine": null
    }
  ],
  "provisioningState": "Succeeded",
  "resourceGroup": "learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4",
  "resourceGuid": "596be222-0b65-4d5c-9974-5ce54c6d895d",
  "securityRules": [
    {
      "access": "Allow",
      "description": null,
      "destinationAddressPrefix": "*",
      "destinationAddressPrefixes": [],
      "destinationApplicationSecurityGroups": null,
      "destinationPortRange": "22",
      "destinationPortRanges": [],
      "direction": "Inbound",
      "etag": "W/\"16a28863-0b75-4f20-b524-2fc25d0503da\"",
      "id": "/subscriptions/294186c4-7588-4b97-b190-23bfd2cbdeec/resourceGroups/learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4/providers/Microsoft.Network/networkSecurityGroups/MyVMFromImageNSG/securityRules/default-allow-ssh",
      "name": "default-allow-ssh",
      "priority": 1000,
      "protocol": "Tcp",
      "provisioningState": "Succeeded",
      "resourceGroup": "learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4",
      "sourceAddressPrefix": "*",
      "sourceAddressPrefixes": [],
      "sourceApplicationSecurityGroups": null,
      "sourcePortRange": "*",
      "sourcePortRanges": [],
      "type": "Microsoft.Network/networkSecurityGroups/securityRules"
    },
    {
      "access": "Allow",
      "description": null,
      "destinationAddressPrefix": "*",
      "destinationAddressPrefixes": [],
      "destinationApplicationSecurityGroups": null,
      "destinationPortRange": "80",
      "destinationPortRanges": [],
      "direction": "Inbound",
      "etag": "W/\"16a28863-0b75-4f20-b524-2fc25d0503da\"",
      "id": "/subscriptions/294186c4-7588-4b97-b190-23bfd2cbdeec/resourceGroups/learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4/providers/Microsoft.Network/networkSecurityGroups/MyVMFromImageNSG/securityRules/open-port-80",
      "name": "open-port-80",
      "priority": 900,
      "protocol": "*",
      "provisioningState": "Succeeded",
      "resourceGroup": "learn-69d79ef3-ebee-4a2d-8d68-f6c7fa697ad4",
      "sourceAddressPrefix": "*",
      "sourceAddressPrefixes": [],
      "sourceApplicationSecurityGroups": null,
      "sourcePortRange": "*",
      "sourcePortRanges": [],
      "type": "Microsoft.Network/networkSecurityGroups/securityRules"
    }
  ],
  "subnets": null,
  "tags": {},
  "type": "Microsoft.Network/networkSecurityGroups"
}

4. 다음 명령을 실행하여 새 가상 머신의 공용 IP 주소를 찾습니다.

echo http://$(az vm list-ip-addresses \
                --name MyVMFromImage \
                --query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \
                --output tsv)
$ echo http://$(az vm list-ip-addresses \
>                 --name MyVMFromImage \
>                 --query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \
>                 --output tsv)
http://13.91.22.115

5. 웹 브라우저에서 새 가상 머신의 공용 IP 주소로 이동합니다. 이미지가 빌드된 가상 머신의 이름 MyVMFromImage 가 웹 페이지에 표시되는지 확인합니다.

 

 

반응형