- terraform과 libvirt를 함께 구성하는 것은 구안정하여 aws와 같은 public cloud나 openstack을 이용하여 함께 사용하는 것이 좋다. plugin을 통해 연결한다.
절차적 및 선언적 언어
- 절차적 언어
- 절차적 언어는 순서가 중요하며 shell 처럼 위에서부터 순서대로 실행하게 된다.
- 예) ansible - 절차적언어 + '멱등성'(started - 최종 결과물을 선언)
- 선언적 언어
- Terraform은 선언적 언어이기 때문에 절차가 중요하지 않다. 최종 결과를 선언하는 것이 목적이다.
- 선언적 언어를 이용하여 프로비저닝 한다.
- yaml 이나 json 형태
- 예) terraform
- .tf 확장자 사용
- 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 등)
- 버전관리
실습 환경 구성

- 관리를 위한 가상머신은 211.183.3.101에 배치된 KVM(libvirtd)를 통하여 생성이 되며 해당 가
상머신은 211.183.3.100 에 설치된 테라폼과의 직접적인 통신이 가능하도록 하기 위하여 KVM의 eth0(또는 ens32)를 리눅스 브릿지인 br0 에 포함시키고 가상머신들은 이 브릿지에 연결되어 외부와 직접적인 통신이 가능하게 된다.
- kvm 설치 및 환경 구성 후 OS에 테라폼을 설치하고, kvm과 테라폼을 연결하기 위한 플러그인을 설치한다.
.tf 파일 생성
provider
[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
가상 머신의 볼륨 및 이름과 리소스 지정
[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}"
}
키 생성
- terraform에서 key-pair 생성 (/root/.ssh/mykey.pem, mykey.pem.pub)
- terraform에서 /etc/ssh/ssh_config에 hypervisor로 접속할때에는 root, mukey.pem 이용해서 접속 가능하도록 설정
- mykey.pem.pub 파일의 내용 복사해서 hypervisor의 /root/.ssh/authorized_keys에 붙여넣기한다.
- lab1에서 terraform apply를 시도한다. 이 경우 중간에 yes 나 test123 입력없이 프로비전 되어야 한다.