[번역] Getting started with the vRealize Automation Terraform Provider

출처 : https://blogs.vmware.com/management/2020/01/getting-started-with-vra-terraform-provider.html

이전 포스트인 "Infrastructure as Code and vRealize Automation"에서 코드로서의 인프라 원칙과 vRealize Automation이 이러한 아이디어의 일부를 실행에 옮기는 데 어떻게 도움이 되는지 설명했었습니다. 나는 또한 Terraform을 vRealize Automation의 무료 기술로 언급했다. Terraform(vSphere, NSX-T, vCloud Director, vRealize Automation 7 포함)에는 여러 VMware 제공업체가 있으며, 이를 통해 고객은 프로그래밍 방식으로 VMware 제품을 사용할 수 있다. vRealize Automation Terraform Provider 및 광범위한 타사 제공업체는 vRealize Automation에서 제공하는 기능을 추가 외부 구성 요소로 강화할 수 있다(최근 Grant Orchard의 블로그에서 보여짐).

vRealize Automation Terraform Provider 설치

vRA Terraform Provider를 사용하려면 Terraform 및 Go를 로컬 컴퓨터에 설치해야 한다. Mac 사용자의 경우 homebrew를 사용하여 둘 다 설치할 수 있으며, Windows 사용자의 경우 chocolatey을 추천한다. vRA 테라폼 공급자에 대한 최신 설치 지침은 Github 저장소에서 사용할 수 있으며, 아래 단계에 따라 Mac에서 사용할 수 있다.

mkdir -p ~/.terraform.d/plugins
wget https://github.com/vmware/terraform-provider-vra/releases/download/v0.1.8/terraform-provider-vra-darwin_amd64-v0.1.8.tgz
tar xvf terraform-provider-vra-darwin_amd64-v0.1.8.tgz
mv terraform-provider-vra ~/.terraform.d/plugins

내 Terraform 구성 파일을 저장할 새 폴더를 만들었다.

  • main.tf - 원하는 환경 상태를 설명하는 주요 테라폼 파일이다.
  • terraform.tfvar - 변수 값 설정에 사용
  • variables.tf - 변수 선언에 사용

API 토큰 생성

Terraform이 vRealize Automation API로 인증하려면 API 토큰이 필요하다. 이 토큰은 액세스 토큰, 새로 고침 토큰 또는 특정 목적을 위해 발행된 API 토큰일 수 있다. API 토큰은 특정 조직 범위, 기능성으로 제한될 수 있으며 취소될 수 있으며 만료되도록 설정할 수 있다. 액세스 및 새로 고침 토큰은 로그인 자격 증명을 기반으로 하며 각각 8시간 또는 6개월 후에 만료되지만 범위와 사용 권한을 사용자 계정으로 공유하며 계정을 비활성화하지 않고는 해지할 수 없다. vRealize Automation 8(사내)의 경우 새로 고침 토큰을 검색하는 데 제공된 지침이나 스크립트를 사용하십시오.

새 API 토큰을 만들려면 VMware Cloud Services Console에 로그인하여 User Settings > My Account > API Tokens > Generate Token로 이동한다.

2020-01-20_11-00-42-768x683.png

새 API Token 생성

생성된 토큰에는 의미 있는 이름, 만료된 이름이 지정되고 특정 조직 및 권한으로 범위가 지정된다. 토큰이 생성되면 반드시 저장한다. 다음 단계로 진행한다.

vRealize Automation Terraform Provider 구성

vRA 제공자는 초기 구성에 대해 새로 refresh token과 API URL의 두 정보가 필요하다.

이 두 변수를 포함하려면 이전에 생성한 terraform.tfvar 파일을 편집한다. 어떤 공급자를 사용하고 있는지 간략하게 알려야 한다. 따라서 아래 코드에 표시된 공급자 정의를 포함하도록 main.tf 파일을 편집한다.

provider vra {
  url           = var.vra_url
  refresh_token = var.vra_refresh_token
}
# vRealize Automation
vra_refresh_token   = "3FRJiZCE...snip...ya7lWx2xDqJPf"
vra_url             = "https://api.mgmt.cloud.vmware.com"

provider vra 정의는 "var" 키워드를 통해 terraform.tfvars 파일에서 구성한 두 변수를 참조한다. 이제 우리는 공급자가 성공적으로 구성되는지 확인하기 위해 테라폼 시작을 실행할 수 있다.

2020-01-21_13-55-01.png
Terraform Init

지금까지, 매우 양호 - 제공자가 초기화되었으며 vRealize Automation 구성을 시작할 준비가 되었다!

vRealize Automation Terraform Provider를 사용하여 인프라 구성 요소 구성

가상 머신을 배포하기 위해 클라우드 어셈블리 내에서 필요한 인프라 중 일부를 구성하는 것이 우선이며, 작업 부하를 지원하도록 다음 구성 요소를 구성해야 한다.

  • Cloud Account
  • Cloud Zone
  • Flavors
  • Images
  • Project

AWS 클라우드 계정은 우리의 terraform.tfvars 파일에서 두 가지 변수, 즉 액세스 키와 비밀 키를 필요로 한다. 이것들은 내 AWS 자격 증명이다(예를 들어 aws cli에 사용할 수도 있다). 변수는 선언해야 하며, main.tf 파일에 선언할 수 있지만 코드 재사용이 가능하도록 별도의 variables.tf 파일로 선언하는 것이 좋다.

resource "vra_cloud_account_aws" "this" {
  name        = "AWS Cloud Account"
  description = "AWS Cloud Account configured by Terraform"
  access_key  = var.aws_access_key
  secret_key  = var.aws_secret_key
  regions     = ["us-east-1", "us-west-1"]

  tags {
    key   = "cloud"
    value = "aws"
  }
}
# vRealize Automation
vra_refresh_token   = "3FRJiZC...snip...lWx2xDqJPf"
vra_url             = "https://api.mgmt.cloud.vmware.com"

# AWS Cloud Account
aws_access_key      = "AKI...snip...R6VQ"
aws_secret_key      = "sPm+...snip...mHUKlD"
variable vra_url {
  type = string
}

variable vra_refresh_token {
  type = string
}

variable aws_access_key {
    type = string
}

variable aws_secret_key {
    type = string
}

코드와 같은 인프라의 선언적 및 자체 문서화 특성이 적용되는 부분이다. 우리는 이것이 변수.tf에 선언된 변수를 사용하여 "AWS Cloud Account"라는 새로운 클라우드 계정을 만들 것인지 한눈에 알 수 있다. 두 개의 영역이 구성되어 있으며, Cloud Zone에는 "cloud:aws"라는 태그가 있어야 한다.

terraform plan을 실행하는 것은 우리가 코드를 실행할 때 어떤 일이 일어날지를 설명할 것이다.

2020-01-21_14-32-42-1.png

Terraform plan

이제 코드가 무엇을 할 것인지 잘 알고 있으므로, terraform apply을 사용하여 코드를 실행할 수 있다. 아래 이미지는 클라우드 계정이 올바른 지역(regions)을 선택하고 "cloud:aws" 태그를 할당했음을 보여준다.

2020-01-21_15-02-19-1024x950.png

AWS 클라우드 계정 구축 및 구성

동일한 방법을 사용하여 클라우드 영역, 향미 매핑, 이미지 매핑 및 프로젝트 등 원하는 인프라 최종 상태에 대한 전체 설명을 작성할 수 있으며, 워크로드 구현을 시작하는 데 필요한 모든 것이 포함된다.

provider vra {
  url           = var.vra_url
  refresh_token = var.vra_refresh_token
}

# Set up the Cloud Account
resource "vra_cloud_account_aws" "this" {
  name        = "AWS Cloud Account"
  description = "AWS Cloud Account configured by Terraform"
  access_key  = var.aws_access_key
  secret_key  = var.aws_secret_key
  regions     = ["us-east-1", "us-west-1"]

  tags {
    key   = "cloud"
    value = "aws"
  }
}

data "vra_region" "this" {
  cloud_account_id = vra_cloud_account_aws.this.id
  region           = "us-west-1"
}

# Configure a new Cloud Zone
resource "vra_zone" "this" {
  name        = "AWS US West Zone"
  description = "Cloud Zone configured by Terraform"
  region_id   = data.vra_region.this.id

  tags {
    key   = "cloud"
    value = "aws"
  }
}

# Create an flavor profile
resource "vra_flavor_profile" "this" {
  name        = "terraform-flavour-profile"
  description = "Flavour profile created by Terraform"
  region_id   = data.vra_region.this.id

  flavor_mapping {
    name          = "x-small"
    instance_type = "t2.micro"
  }

  flavor_mapping {
    name          = "small"
    instance_type = "t2.small"
  }

  flavor_mapping {
    name          = "medium"
    instance_type = "t2.medium"
  }
  
  flavor_mapping {
    name          = "large"
    instance_type = "t2.large"
  }
}

# Create a new image profile
resource "vra_image_profile" "this" {
  name        = "terraform-aws-image-profile"
  description = "AWS image profile created by Terraform"
  region_id   = data.vra_region.this.id

  image_mapping {
    name       = "ubuntu-bionic"
    image_name = "ami-0dd655843c87b6930"
  }
}

# Create a new Project
resource "vra_project" "this" {
  name        = "Terraform Project"
  description = "Project configured by Terraform"

  administrators = ["smcgeown@vmware.com"]
  members           = ["cas-user1@definit.co.uk"]

  zone_assignments {
    zone_id       = vra_zone.this.id
    priority      = 1
    max_instances = 0
  }
}

terraform apply 재실행 결과 구성 중인 새 인프라에 적용:

2020-01-21_17-06-35.png2020-01-21_17-06-04.png 2020-01-21_17-09-33.png2020-01-21_17-10-13.png

Blueprint 만들기

이 모든 인프라는 훌륭하지만, 실제로 워크로드에 관한 것이다. 다음 코드는 프로젝트에 Blueprint를 생성하고 이전에 만든 Flavor와 Images를 사용한다. 자원의 "content" 속성은 청사진 자체의 YAML 코드다.

# Create a new Blueprint
resource "vra_blueprint" "this" {
  name        = "Ubuntu Blueprint"
  description = "Created by vRA terraform provider"
  project_id = vra_project.this.id

  content = <<-EOT
formatVersion: 1
inputs:
  Flavor:
    type: string
    title: Flavor
    enum:
      - x-small
      - large
      - medium
      - small
  Image:
    type: string
    title: Flavor
    enum:
      - ubuntu-xenial
      - ubuntu-bionic
resources:
  Web_Server:
    type: Cloud.Machine
    properties:
      image: '$${input.Image}'
      flavor: '$${input.Flavor}'
      cloudConfig: |
        users:
          - name: sam
            ssh-authorized-keys:
              - 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAJhmOeILoSyY2ke8oQu1pJ8td12ReCFbc5ZQflXcxYoTcUp00CLKrvdQzrOnOJAUGR0QOjp/2LxvOgq0lR0g3qSOX9Cg+wTxpOKP/VQRw9+SWv625bbAk3R6VSzIG83XJ24MPwmsa9wPgaU4cCc9SmXzKJEQGtAd9QNyO2c5fxEynZUsZbbQiNtZbliA0lyU3dAnPOofdhJ6I6aV2YFvp4juy9NdaNuR7HUTwyUfMOvilcTzdsJ/dJrc9Ypl427vgZk4opmlikVBLlWvJdBLt8PgPpl4GWgkg+WBqPUu33ExB6MfWNvXUjC3u1D9sokJwQw4NBXvvQHg4Dpf+IP75'
            sudo:
              - 'ALL=(ALL) NOPASSWD:ALL'
            groups: sudo
            shell: /bin/bash
      constraints:
        - tag: 'cloud:aws'
  EOT
}

다시 terraform apply를 실행하면 Blueprint가 생성된다.

2020-01-22_11-11-43-1024x448.png

Blueprint 배포

마지막으로 방금 생성한 Blueprint의 ID를 사용하여 입력을 지정하여 Blueprint를 배포해 보자. Blueprint 버전이 여러 개 있는 경우 배포가 "Current Version"이 되지 않고 "browrint_version" 속성을 사용하여 원하는 버전을 지정할 수 있다.

resource "vra_deployment" "this" {
  name        = "Terraform Deployment"
  description = "Deployed from vRA provider for Terraform."

  blueprint_id      = vra_blueprint.this.id
  project_id        = vra_project.this.id

  inputs = {
    Flavor = "small"
    Image  = "ubuntu-bionic"
  }
}

Blueprint는 vra deployment 리소스에 지정된 입력으로 배포 및 구성된다.

2020-01-22_12-11-17.png

결론

vRealize Automation Terraform Provider와 Infrastructure as Code 세계에 대한 간단한 소개가 유용했기를 바라며, 나는 당신이 만들 수 있는 것의 표면만 긁었다. GitHub 페이지에서 vRealize Automation provider의 완전한 코드에 대해 자세히 알아보기 바란다.