-
[Terraform] 코드 기반으로 서버 만드는 오픈소스오픈소스 2024. 1. 13. 00:00
개요
IaC 일환으로 Terraform 이라는 오픈소스도 유용하게 사용할 수 있다. 오랜만에 포스팅을 하는데 과거에 작성했던 내용들과 연동을 했더니 짧은 시간에 큰 효과를 보게 되었다. Cloud 환경에서는 더욱 효과가 좋겠지만 필자가 속한 환경에서는 이 수준이 최선일 듯 하다. Terraform 과 연동되는 과거 포스팅은 2가지가가 있으며 사전에 읽어보면 더욱 도움이 될 것이다.
Terraform 이란
먼저 간단하게 살펴보도록 하자. 공식 사이트에 기재된 내용은 아래와 같다.
더보기Infrastructure as code for automation across all environments
Terraform provides organizations with a single workflow to provision their cloud, private datacenter, and SaaS infrastructure and continuously manage infrastructure throughout its lifecycle.
" 모든 환경에서 자동화를 위한 코드로서의 인프라
Terraform은 조직에서 클라우드, 프라이빗 데이터 센터 및 SaaS 인프라를 프로비저닝하고 라이프사이클 전반에 걸쳐 지속적으로 인프라를 관리할 수 있는 단일 워크플로우를 제공합니다."한 마디로 코드로 한번만 만들어두면 초기 프로비저닝을 자동화하여 반복적으로 사용할 수 있다는 내용이며, Cloud가 아닐지라도 Vmware/Nutanix 환경과 같은 가상화 환경에서 사용할 수 있도록 지원이 되고 있다. Ansible을 사용해서도 동일한 기능의 구현이 가능하지만 Terraform이 더욱 안정적인 모습을 보여준다.
Terraform 활용 방안
코드 기반으로 동작하기 때문에 정말 다양한 방법이 있을 수 있다. 필자가 해야 하는 것은 기한 내에 200대의 Linux 서버를 생성해야 했으며 이미 만들어진 VMware Template 서버를 복제하고 Hostname/IP가 자동으로 부여되도록 하였다. 처음에 환경 구축하고 소스 개발하는데 3일정도 걸렸던 것 같고 이후 실제로 소요된 시간은 채 하루가 걸리지 않았다.
구분 전 후 VM 복제 수동 자동 (Terraform) OS 설치 및 촤적화 자동 (VMware Template) 자동 (VMware Template) 취약점 조치 자동 (VMware Template) 자동 (VMware Template) Hostname/IP 변경 수동 자동 (Terraform) 이후 포스팅에서 상세하게 기술하겠지만 실제로 사용했던 코드는 아래와 같다.
terraform { required_providers { vsphere = { source = "hashicorp/vsphere" version = "2.5.0" } } } provider "vsphere" { user = "" password = "" vsphere_server = "" allow_unverified_ssl = true } variable "hostname" { description = "The hostname for the vm" type = list(string) default = [""] } variable "ip_address" { description = "The IP Address for the vm" type = list(string) default = [""] } variable "cpu_core" { description = "Cpu Core" type = list(string) default = [""] } variable "MEM_MByte" { description = "Cpu Core" type = list(string) default = [""] } data "vsphere_datacenter" "dc" { name = "" } data "vsphere_network" "net" { name = "" datacenter_id = data.vsphere_datacenter.dc.id } data"vsphere_host" "host" { name = "" datacenter_id = data.vsphere_datacenter.dc.id } data "vsphere_datastore" "datastore" { name = "" datacenter_id = data.vsphere_datacenter.dc.id } data "vsphere_virtual_machine" "template" { name = "" datacenter_id = data.vsphere_datacenter.dc.id } resource "vsphere_virtual_machine" "vm" { count = 1 name = "${var.hostname[count.index]}" resource_pool_id = "${data.vsphere_host.host.resource_pool_id}" datastore_id = data.vsphere_datastore.datastore.id num_cpus = "${var.cpu_core[count.index]}" memory = "${var.MEM_MByte[count.index]}" guest_id = data.vsphere_virtual_machine.template.guest_id scsi_type = data.vsphere_virtual_machine.template.scsi_type firmware = "" network_interface { network_id = data.vsphere_network.net.id } disk { label = "disk0" size = "${data.vsphere_virtual_machine.template.disks.0.size}" eagerly_scrub = "${data.vsphere_virtual_machine.template.disks.0.eagerly_scrub}" thin_provisioned = "false" unit_number = 0 } disk { label = "disk1" size = "${data.vsphere_virtual_machine.template.disks.1.size}" eagerly_scrub = "${data.vsphere_virtual_machine.template.disks.1.eagerly_scrub}" thin_provisioned = "false" unit_number = 1 } cdrom { datastore_id = "${data.vsphere_datastore.datastore.id}" path = "" } clone { template_uuid = data.vsphere_virtual_machine.template.id linked_clone = "false" timeout = 60 customize { linux_options { host_name = "${var.hostname[count.index]}" domain = "" } network_interface { ipv4_address = "${var.ip_address[count.index]}" ipv4_netmask = } ipv4_gateway = "" } } }
마무리
이후 단계가 많이 남아있어서 Terraform 관련 포스팅은 계속 이어질 것 같다. 사용하면서 느낀 건 오픈소스는 깊게 알려고는 하지 말고 본인이 필요한 기능까지만 가볍게, 여러 오픈소소의 기본적인 기능들을 조합하여 사용하는 것이 새로 사용하는 것에 대한 부담도 적고 쉽게 사용할 수 있다는 느낌이다.
궁금하신 내용은 댓글로 남겨주시고, 많은 블로그 방문은 저에게 큰 힘이 됩니다. ・ᴥ・
'오픈소스' 카테고리의 다른 글
[Terraform] VM(Virtual Machine) 100개 한번에 만들기 (2/3) (0) 2024.05.01 [Terraform] VM(Virtual Machine) 100개 한번에 만들기 (1/3) (0) 2024.02.17 [Ansible] 신규 Client 서비스 활성화 (WINDOW/LINUX) (0) 2022.09.27 [Docker] 파이썬(Python3.8) 개발 환경 구축하기 (0) 2022.08.29 [Ansible] WinSVR 업데이트 Playbook 고도화 (V3) (0) 2022.08.04