Terraform & libvirt - 10.24

양승현·2022년 10월 23일
1

terraform

목록 보기
1/2
post-thumbnail

terraform

  • terraform과 libvirt를 함께 구성하는 것은 구안정하여 aws와 같은 public cloud나 openstack을 이용하여 함께 사용하는 것이 좋다. plugin을 통해 연결한다.

절차적 및 선언적 언어

  • 절차적 언어
    • 절차적 언어는 순서가 중요하며 shell 처럼 위에서부터 순서대로 실행하게 된다.
    • 예) ansible - 절차적언어 + '멱등성'(started - 최종 결과물을 선언)
  • 선언적 언어
    • Terraform은 선언적 언어이기 때문에 절차가 중요하지 않다. 최종 결과를 선언하는 것이 목적이다.
    • 선언적 언어를 이용하여 프로비저닝 한다.
    • yaml 이나 json 형태
    • 예) terraform
  • .tf 확장자 사용

terraform의 동작

  • terraform init
    • 가장 최근의 상태정보를 저장하기 위한 .tfstate 파일을 생성한다.(terraform plan 혹은 apply를 진행하게 되면 .rfstate의 정보를 읽어 작업을 진행)
    • 개발자들이 동시에 동일한 state에 접근하는 것을 막기 위한 Locking과 state 파일의 손실을 방지하기 위한 Backup을 위한 기능을 활용한다.
  • terraform plan
    • 정의한 코드가 어떠한 인프라를 프로비저닝하게 되는지 예측 결과를 보여주는 단계이다.
  • terraform apply (-auto-approve - -y 기능과 같음)
    • 실제 인프라를 배포하고 작업 결과가 .tfstate 파일에 저장된다.
  • terraform import
    • 인프라에 배포된 리소스를 terraform state로 옮겨주는 작업이다. import 이후에 plan을 했고 로컬에 코드가 없다면 리소스가 삭제 또는 변경된다는 결과를 보여준다. 이 결과를 바탕으로 코드를 작성할 수 있다.
1. terraform init (시작, 기록 시작)
2. 프로비저닝을 위한 tf 파일 생성
3. terraform plan ("2" 에서 생성한 파일을 검증하고 최종 결과를 예측)
4. terraform apply (실제 프로비저닝을 시작-> libvirt 통해 인스턴스,네트워크 등 생성 시작)
"3" 을 통해 파일을 검증했다고 하더라도 실제 "4"에서는 오류가 발생할 수 있다.

인스턴스 생성(스펙정의 + 디스크[볼륨]정의)

  • 클라우드 이미지 자체가 볼륨으로 활용 가능하다.

main.tf

  • 테라폼 저장소로부터 프로바이더가 가상머신을 자동을 호출하여 사용할 수 있도록 main.tf 파일
    을 작성한다.

provider.tf

  • 필요한 공급자를 선언(aws, openstack 등)
    • source - 사용하려는 공급자의 주소
  • 버전관리
    • version - 사용가능한 공급자의 버전

kvm - terraform

실습 환경 구성

  • 관리를 위한 가상머신은 211.183.3.101에 배치된 KVM(libvirtd)를 통하여 생성이 되며 해당 가
    상머신은 211.183.3.100 에 설치된 테라폼과의 직접적인 통신이 가능하도록 하기 위하여 KVM의 eth0(또는 ens32)를 리눅스 브릿지인 br0 에 포함시키고 가상머신들은 이 브릿지에 연결되어 외부와 직접적인 통신이 가능하게 된다.
  • kvm 설치 및 환경 구성 후 OS에 테라폼을 설치하고, kvm과 테라폼을 연결하기 위한 플러그인을 설치한다.

.tf 파일 생성

provider

  • main.tf 정의
[root@terraform	~]#	cat	main.tf
terraform {
  required_providers {
    libvirt = {
      source = "multani/libvirt"
      version = "0.6.3-1+4"
    }
  }
}

provider "libvirt" {
  alias = "hypervisor"
  uri = "qemu+ssh://root@hypervisor/system"
}
  • 명시한 버전보다 위에 버전도 허용하게 범위를 지정한다
  • provider 는 원격으로 작업을 전달하므로 ssh 를 작성한다

libvirt resource

가상 머신의 볼륨 및 이름과 리소스 지정

  • instance.tf 정의
[root@terraform lab1]# cat instance.tf
# 가상 머신의 볼륨 지정
resource "libvirt_volume" "centos7vol" {
  name = "centos7-1.qcow2"
  pool = "default" # virsh pool-list를 통해 확인 가능
  source = "/cloudimg/centos-base.qcow2" # 로컬에 저장된 이미지 사용
  format = "qcow2"
}

# 가상 머신의 이름과 리소스 지정
resource "libvirt_domain" "centos7-1" {
  name          = "centos7-1"
  memory        = "1024"
  vcpu          = 1

  # 기본 네트워크 지정
  network_interface {
    network_name = "default"
  }

  # 디스크 연결
  disk {
    volume_id = "${libvirt_volume.centos7vol.id}"
  }

  # 콘솔 연결
  console {
    type = "pty"
    target_type = "serial"
    target_port = "0"
  }

  #  graphic 환경
  graphics {
    type = "spice"
    listen_type = "address"
    autoport = true
  }
}

# IP 주소 출력하기
output "ip" {
  value = "${libvirt_domain.centos7-1.network_interface.0.addresses}"
}

키 생성

    1. terraform에서 key-pair 생성 (/root/.ssh/mykey.pem, mykey.pem.pub)
    1. terraform에서 /etc/ssh/ssh_config에 hypervisor로 접속할때에는 root, mukey.pem 이용해서 접속 가능하도록 설정
    1. mykey.pem.pub 파일의 내용 복사해서 hypervisor의 /root/.ssh/authorized_keys에 붙여넣기한다.
    1. lab1에서 terraform apply를 시도한다. 이 경우 중간에 yes 나 test123 입력없이 프로비전 되어야 한다.

0개의 댓글