Terraform 프로비저너(Provisioner)

Hognod·2023년 7월 24일

local-exec

https://developer.hashicorp.com/terraform/language/resources/provisioners/local-exec

terraform apply 명령어를 실행하는 현재 머신이 주체가 되어 프로세스 진행

resource "terraform_data" "local-exec-test" {
  provisioner "local-exec" {
    command = "echo hello"
  }
}
  • command 명령어는 현재 provisioner를 실행하는 .tf 파일이 존재하는 위치에서 실행된다.
    • 상대 경로 & 절대 경로 모두 사용 가능

connection

https://developer.hashicorp.com/terraform/language/resources/provisioners/connection

remote-exec, file 등 원격 접속이 필요한 provisioner의 경우 connection 작성이 필요하다.

connection의 경우 resource 계층에 정의하여 해당 resource 내에 정의된 모든 provisioner에 적용되도록 하는 것이 가능하며 provisioner 계층에 정의하여 해당 provisioner에 한해서 적용시키는 것도 가능하다.

resource "aws_instance" "provisioner-test-1" {
	...
}
  
resource "aws_instance" "provisioner-test-2" {
	...
}

resource "terraform_data" "remote-exec-test-1" {
	connection {
  	host				=	aws_instance.provisioner-test-1.public-ip
  	user        = "ubuntu"
  	type        = "ssh"
  	private_key = "${file("~/.ssh/id_rsa")}"
  	timeout     = "2m"
	}
	
	provisioner "remote-exec" {
  	inline = [
    	"echo Command 1",
    	"echo Command 2"
    ]
  }

	provisioner "remote-exec" {
  	script = "./bootstrap.sh"
  }
}

resource "terraform_data" "remote-exec-test-2" {	
	provisioner "remote-exec" {
  	connection {
  		host				=	aws_instance.provisioner-test-2.public-ip
  		user        = "ubuntu"
  		type        = "ssh"
  		private_key = "${file("~/.ssh/id_rsa")}"
  		timeout     = "2m"
		}

  	inline = [
    	"echo Command 3",
    	"echo Command 4"
    ]
  }
}
  • remote-exec-test-1의 경우 connectionresource 계층에 정의되어 해당 resource에 속한 두개의 provisioner 모두에 적용된다.
  • remote-exec-test-2의 경우 connectionprovisioner 계층에 정의되어 해당 provisioner에 한하여 적용된다.

remote-exec

https://developer.hashicorp.com/terraform/language/resources/provisioners/remote-exec

Terraform으로 생성한 원격 resource가 주체가 되어 프로세스 진행

resource "aws_instance" "provisioner-test-1" {
	...
}

resource "terraform_data" "remote-exec-test-1" {
	connection {
  	host				=	aws_instance.provisioner-test-1.public-ip
  	user        = "ubuntu"
  	type        = "ssh"
  	private_key = "${file("~/.ssh/id_rsa")}"
  	timeout     = "2m"
	}
	
	provisioner "remote-exec" {
  	inline = [
    	"echo Command 1",
    	"echo Command 2"
    ]
  }

	provisioner "remote-exec" {
  	script = "./bootstrap.sh"
  }
}
  • inline, script, scripts 방식이 존재
    • script, scripts 명령어는 현재 provisioner를 실행 중인 .tf 파일이 존재하는 위치 기준 상대 경로 & 절대 경로 지정 가능
  • on_failure = continue 설정으로 원격에서 명령어 실패 시 Terraform을 중단하지 않고 계속 다음 단계 진행 가능

file

https://developer.hashicorp.com/terraform/language/resources/provisioners/file

Terraform으로 생성한 원격 resource가 주체가 되어 프로세스가 진행되며 해당 resource에 Local에 위치한 파일 및 디렉토리를 전송(scp 명령어와 동일 기능 수행)

resource "aws_instance" "provisioner-test-1" {
	...
}

resource "terraform_data" "file-test-1"{
  connection {
		host = aws_instance.provisioner-test-1.public-ip
		user = "ubuntu"
		type = "ssh"
		private_key = "$${file("~/.ssh/id_rsa")}"
		timeout = "2m"
	}

	provisioner "file" {
		source = "../../cert"
		destination = "/home/centos"
	}

	provisioner "file" {
		source = "../settings.json"
		destination = "/home/centos/settings.json"
	}
}
  • source: Local 머신에서 전송할 파일 & 디렉토리의 경로 지정. 현재 provisioner를 실행 중인 .tf 파일이 존재하는 위치 기준 상대 경로 & 절대 경로 지정 가능
  • destination: source 항목에서 지정한 파일 & 디렉토리가 원격 resource에 저장될 경로 지정. 절대 경로로 지정 가능
  • on_failure = continue 설정으로 원격에서 명령어 실패 시 Terraform을 중단하지 않고 계속 다음 단계 진행 가능

2개의 댓글

comment-user-thumbnail
2023년 7월 24일

좋은 글 감사합니다. 자주 올게요 :)

1개의 답글