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 파일이 존재하는 위치에서 실행된다.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의 경우 connection이 resource 계층에 정의되어 해당 resource에 속한 두개의 provisioner 모두에 적용된다.remote-exec-test-2의 경우 connection이 provisioner 계층에 정의되어 해당 provisioner에 한하여 적용된다.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을 중단하지 않고 계속 다음 단계 진행 가능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을 중단하지 않고 계속 다음 단계 진행 가능
좋은 글 감사합니다. 자주 올게요 :)