[번역] Infrastructure-As-Code with HashiCorp Packer, VMware and VMware Cloud on AWS

출처 : https://cloud.vmware.com/community/2019/11/12/infrastructure-code-hashicorp-packer-vmware-vmware-cloud-aws/

이 글은 Infrastructure-As-Code 툴인 HashiCorp Packer를 사용하는 방법과 VMware Cloud on AWS의 구체적인 예에 초점을 맞출 것이다.

Kudos to Cody De Arkland 이 주제에 대한 뛰어난 블로그(Cody의 블로그에 좋은 것이 너무 많다). 또한 이 , 이 , GitHub Jetbrain 페이지와 Packer 공식 페이지를 참조했다.

항상 그렇듯이, 내 글에 대한 나의 영감은 항상 고객, 동료 또는 파트너와의 대화에서 온다. 이 경우 Microsoft SQL 팜을 호스팅하기 위해 AWS에서 VMware Cloud를 평가 중인 고객이다.

이 고객은 모든 것을 자동화하기를 원하며 AWS 환경에서 VMware Cloud on AWS 환경에서 HashiCorp Terraform, Powershell 및 HashiCorp Packer와 같은 툴을 사용할 수 있는지 물어보셨습니다. 그들은 가능한 한 GUI 사용을 피하고 싶어한다.

첫 번째 두 가지 툴(Terraform, Powershell) - 꽤 많이 사용했으며 AWS의 VMware Cloud에서 어떤 기능이 작동하는지(그리고 어떤 기능이 작동하지 않는지) 알고 있다.

세번째(Packer)는 다음과 같다. 나는 그것을 사용해 본 적이 없지만 시험해 보는 것이 좋았다.

패커(Packer)는 무엇인가?

Packer는 다양한 형식(vSphere, Amazon EC2, Hyper-V/Azure, VirtualBox 등)에 걸쳐 가상 머신 생성을 자동화 및 표준화하기 위한 인프라 애즈코드 플랫폼이다.

먼저 다음과 같은 VM의 특성을 설명하는 템플릿 구성을 정의해야 한다.

  • ISO가 만들어졌고,
  • 네트워크가 연결됐고,
  • vCPU와 RAM,
  • 배포할 vCenter, 호스트, 데이터스토어, 클러스터 및 폴더.

이 템플릿 구성은 JSON에 기록되며, 곧 예를 볼 것이다.

이 템플릿을 구축했으면 간단한 명령(packer build template.json)으로 시스템 빌드를 푸시하기만 하면 VM이 생성된다. Packer는 Windows, Linux, MacOS에서 작동한다.

해당 JSON 템플릿을 코드로 취급할 수 있으며 IaC의 잘 알려진 이점(기민성 agility, 일관성 consistency, 자동화 automation 등)을 활용할 수 있다.

패커는 이해할 만한 용어가 있다.

  • 아티팩트(Artifact)는 빌드의 결과물이다. VMware 구축의 경우 아티팩트는 생성된 가상 머신을 구성하는 파일의 디렉토리다. 우리의 아티팩트는 ubuntu VM이다.
  • 빌더(Builder)는 단일 플랫폼에 대한 머신 이미지를 만들 수 있는 Packer의 구성요소다. VMware와 Amazon EC2를 예로 들 수 있다. 빌더는 플러그인의 형태로 만들어 Packer에 추가할 수 있다. 우리는 VMware 빌더와 jetbrain이라 부르는 플러그인을 사용할 것이다.
  • 명령(Command)은 일부 작업을 수행하는 Packer 프로그램의 하위 명령이다. 예를 들어, "build"는 패커 빌드로 호출된다. 아래의 주석에 보면, 우리가 패커 빌드를 사용하는 것을 볼 수 있을 것이다.
  • 템플릿(Template)은 Packer의 다양한 구성요소를 구성하여 하나 이상의 빌드를 정의하는 JSON 파일이다. Packer는 템플릿을 읽고 그 정보를 사용하여 기계를 만들 수 있다. 우리의 예에서는 "ubuntu-18.04.json"을 템플릿으로 사용한다.

Packer 실행

구체적인 용어로, 우리가 사용할 템플릿에 대해 살펴보자.

{
  "builders": [
    {
      "type": "vsphere-iso",

      "vcenter_server":      "vcenter.sddc-A-B-C-D.vmwarevmc.com",
      "username":            "cloudadmin@vmc.local",
      "password":            "XXXXXXXXXXXXXX",
      "insecure_connection": "true",

      "vm_name": "ubuntu-runVMC",
      "datastore":"WorkloadDatastore",
      "folder": "Workloads",
      "cluster": "Cluster-1",
      "network": "sddc-cgw-network-1",
      "ssh_username": "jetbrains",
      "ssh_password": "jetbrains",
      "guest_os_type": "ubuntu64Guest",
      "CPUs":             2,
      "RAM":              4096,
      "RAM_reserve_all": true,

      "disk_controller_type":  "pvscsi",
      "disk_size":        32768,
      "disk_thin_provisioned": true,

      "network_card": "vmxnet3",

      "iso_paths": [
        "[WorkloadDatastore] ISO/ubuntu-18.04.2-server-amd64.iso"
      ],

      "floppy_files": [
        "./preseed.cfg"
      ],
      "boot_command": [
        "",
        "",
        "",
        "",
        "",
        "",
        "",
        "",
        "",
        "",
        "/install/vmlinuz",
        " initrd=/install/initrd.gz",
        " priority=critical",
        " locale=en_US",
        " file=/media/preseed.cfg",
        ""
      ]
    }
  ],

  "provisioners": [
    {
      "type": "shell",
      "inline": ["ls /"]
    }
  ]
}

여기서 뭘 하려는 거지? 위의 템플릿에 의해 생성된 VM의 특성은 다음과 같다.

  • VM이 vCenter vcenter.sddc-A-B-C-D.vmwarevmc.com에 배포됨(클라우드에서 실행되지만 모든 위치에서 실행될 수 있음)
  • VM은 "ubuntu-runVMC"라고 불릴 것이다.
  • "WorkloadDatastore" 데이터스토어(AWS vCenter의 VMware Cloud에 VM을 배포할 수 있는 유일한 데이터스토어), "Workloads" 폴더 및 "Cluster-1"(VMC의 기본 클러스터 이름)에 배포될 것이다.
  • VM은 VMware 클라우드 환경에서 DHCP를 지원하는 네트워크인 "sddc-cgw-network-1"에 연결될 것이다.
  • VM은 2개의 vCPU와 4G의 RAM을 가질 것이다.
  • 이전에 데이터스토어에 업로드한 ISO에서 부팅된다: 이 ISO는 WorkloadDataStore/ISO 폴더에 있다. iso_paths를 정확히 파악해서 올바른 위치를 가리키도록 한다. 그렇지 않으면 24시간의 소중한 시간을 낭비하게 되고, 바라건대 나처럼 그리 짧지 않은 삶의 문제 해결 시간을 낭비하게 될 겁니다.
  • 부팅 시 명령 집합을 실행한다(preseed.cfg 파일에 지정됨). Jetbrains의 GitHub repo에서 preeseed.cfg 파일을 사용했지만, 분명히 당신은 그에 맞게 적응하기를 원할 것이다.

가장 좋은 방법은 변수가 있는 별도의 파일(예: 비밀번호 인증 정보)을 생성하고 JSON 빌드 템플릿에서 변수를 제거하는 것이지만, 단순하게 유지하기 위해 JSON 자체에 변수를 넣는 것이다.

screenshot-2019-07-04.png

AWS에서 VMware 클라우드에 대한 주의 사항

제한 모델

AWS의 VMC는 관리형 서비스임을 기억하자. 모든 고객은 표준 템플릿 구성(베스트 프랙티스에 기반)과 VMware 환경을 운영하기 위한 close-to-admin 자격 증명을 제공받으며, 몇 가지 이상한 노브에 대해 걱정할 필요가 없다.

즉, ESXi 호스트에 대한 루트 액세스 권한이 없는 경우다. 내가 이것을 언급하는 이유는 기본적으로 Packer는 ESXi 호스트의 root를 필요로 하기 때문이다.

그러나 Packer 플러그인 Jetbrains를 통해 vCenter API에 직접 액세스할 수 있으므로, Jetbrains를 통해 Packer 사용자는 VMware Cloud vCenter를 사용할 수 있다.

위의 템플릿에 있는 "vsphere-iso" 빌더는 실제로 우리가 Jetbrains를 사용하고 있다는 사실을 가리킨다.

마찬가지로 WorkloadDatastore는 AWS에서 VMware Cloud에 VM을 배포할 수 있는 유일한 데이터스토어이므로 선택해야 한다.

클라우드에 있어!

프로비저닝 단계에서 'packer build' 명령을 실행하는 클라이언트는 배포된 VM에 대한 SSH를 수행해야 한다.

Packer 클라이언트가 배포된 VM에 IP로 연결되어 있는지 확인한다. 그렇지 않으면 SSH가 실패하고 프로비저닝이 실패하게 된다.

상세 배치

계속하여 VM을 생성할 때 발생하는 현상입니다. 처음부터 끝까지 약 4분이 걸렸다(다음 동영상은 어떤 모습인지 보여준다).

C:\Users\bob>packer build ubuntu-18.04-runvmc.json
 vsphere-iso output will be in this color. ==> vsphere-iso: Creating VM…
 ==> vsphere-iso: Customizing hardware…
 ==> vsphere-iso: Mount ISO images…
 ==> vsphere-iso: Creating floppy disk…
     vsphere-iso: Copying files flatly from floppy_files
     vsphere-iso: Copying file: ./preseed.cfg
     vsphere-iso: Done copying files from floppy_files
     vsphere-iso: Collecting paths from floppy_dirs
     vsphere-iso: Resulting paths from floppy_dirs : []
     vsphere-iso: Done copying paths from floppy_dirs
 ==> vsphere-iso: Uploading created floppy image
 ==> vsphere-iso: Adding generated Floppy…
 ==> vsphere-iso: Set boot order temporary…
 ==> vsphere-iso: Power on VM…
 ==> vsphere-iso: Waiting 10s for boot…
 ==> vsphere-iso: Typing boot command…
 ==> vsphere-iso: Waiting for IP…
 ==> vsphere-iso: IP address: 192.168.1.130
 ==> vsphere-iso: Using ssh communicator to connect: 192.168.1.130
 ==> vsphere-iso: Waiting for SSH to become available…
 ==> vsphere-iso: Connected to SSH!
 ==> vsphere-iso: Provisioning with shell script: C:\Users\bob\AppData\Local\Temp\packer-shell834750743
     vsphere-iso: bin
     vsphere-iso: boot
     vsphere-iso: dev
     vsphere-iso: etc
     vsphere-iso: home
     vsphere-iso: initrd.img
     vsphere-iso: initrd.img.old
     vsphere-iso: lib
     vsphere-iso: lib64
     vsphere-iso: lost+found
     vsphere-iso: media
     vsphere-iso: mnt
     vsphere-iso: opt
     vsphere-iso: proc
     vsphere-iso: root
     vsphere-iso: run
     vsphere-iso: sbin
     vsphere-iso: srv
     vsphere-iso: swapfile
     vsphere-iso: sys
     vsphere-iso: tmp
     vsphere-iso: usr
     vsphere-iso: var
     vsphere-iso: vmlinuz
     vsphere-iso: vmlinuz.old
 ==> vsphere-iso: Shut down VM…
 ==> vsphere-iso: Deleting Floppy drives…
 ==> vsphere-iso: Deleting Floppy image…
 ==> vsphere-iso: Eject CD-ROM drives…
 ==> vsphere-iso: Clear boot order…
 Build 'vsphere-iso' finished.==> Builds finished. The artifacts of successful builds are:
 --> vsphere-iso: ubuntu-runVMC

동영상(Video Walkthrough)

결과:

VM이 생성되어 예상 클러스터 및 데이터스토어에 지정 및 배포한 네트워크에 연결되었다. 얼마나 멋지니?

screenshot-2019-07-08.png

무엇부터 시작할까요?

  1. 플랫폼용 Packer 다운로드
  2. Jetbrains 다운로드
  3. VM을 빌드할 ISO를 다운로드해서, WorkloadDatastore/ISO로 업로드한다(WorkloadDatastore에 ISO 폴더 생성). 예를 따르려면 Ubuntu ISO를 다운로드 한다.
  4. Github repo에서 ubuntu-18.04-working template.json 및 preseed.cfg를 다운로드.
  5. VM을 연결할 네트워크 세그먼트와 올바른 자격 증명 및 기타 설정으로 위의 JSON 파일을 업데이트.
  6. 다음 명령을 실행 : packer build ubuntu-18.04-working template.json

VM이 생성되는 것을 보십시오! 바로 그겁니다.

읽어줘서 감사합니다!